较小的云轮播 [英] Smaller Cloud Carousel

查看:120
本文介绍了较小的云轮播的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对jquery还是很陌生,我正在尝试重新调整云轮播的规模,使其降低一些.但是,我似乎无法在整个代码中找到任何高度指示器.

I'm quite new with jquery and i am trying to rescale the cloud carousel to be a bit less high. However, somehow I can't seem to find any height indicator in the whole code.

//////////////////////////////////////////////////////////////////////////////////
// CloudCarousel V1.0.5
// (c) 2011 by R Cecco. <http://www.professorcloud.com>
// MIT License
//
// Reflection code based on plugin by Christophe Beyls <http://www.digitalia.be>
//
// Please retain this copyright header in all versions of the software
//////////////////////////////////////////////////////////////////////////////////

(function($) {

    // START Reflection object.
    // Creates a reflection for underneath an image.
    // IE uses an image with IE specific filter properties, other browsers use the Canvas tag.  
    // The position and size of the reflection gets updated by updateAll() in Controller.
    function Reflection(img, reflHeight, opacity) {             

        var reflection, cntx, imageWidth = img.width, imageHeight = img.width, gradient, parent;

        parent = $(img.parentNode);
        this.element = reflection = parent.append("<canvas class='reflection' style='position:absolute'/>").find(':last')[0];
        if ( !reflection.getContext &&  $.browser.msie) {
            this.element = reflection = parent.append("<img class='reflection' style='position:absolute'/>").find(':last')[0];                  
            reflection.src = img.src;           
            reflection.style.filter = "flipv progid:DXImageTransform.Microsoft.Alpha(opacity=" + (opacity * 100) + ", style=1, finishOpacity=0, startx=0, starty=0, finishx=0, finishy=" + (reflHeight / imageHeight * 100) + ")";  

        } else {                            
            cntx = reflection.getContext("2d");
            try {


                $(reflection).attr({width: imageWidth, height: reflHeight});
                cntx.save();
                cntx.translate(0, imageHeight-1);
                cntx.scale(1, -1);              
                cntx.drawImage(img, 0, 0, imageWidth, imageHeight);             
                cntx.restore();
                cntx.globalCompositeOperation = "destination-out";
                gradient = cntx.createLinearGradient(0, 0, 0, reflHeight);
                gradient.addColorStop(0, "rgba(255, 255, 255, " + (1 - opacity) + ")");
                gradient.addColorStop(1, "rgba(255, 255, 255, 1.0)");
                cntx.fillStyle = gradient;
                cntx.fillRect(0, 0, imageWidth, reflHeight);                
            } catch(e) {            
                return;
            }       
        }
        // Store a copy of the alt and title attrs into the reflection
        $(reflection).attr({ 'alt': $(img).attr('alt'), title: $(img).attr('title')} ); 

    }   //END Reflection object

    // START Item object.
    // A wrapper object for items within the carousel.
    var Item = function(imgIn, options)
    {                               
        this.orgWidth = imgIn.width;            
        this.orgHeight = imgIn.height;      
        this.image = imgIn;
        this.reflection = null;                 
        this.alt = imgIn.alt;
        this.title = imgIn.title;
        this.imageOK = false;       
        this.options = options;             

        this.imageOK = true;    

        if (this.options.reflHeight > 0)
        {                                                   
            this.reflection = new Reflection(this.image, this.options.reflHeight, this.options.reflOpacity);                    
        }
        $(this.image).css('position','absolute');   // Bizarre. This seems to reset image width to 0 on webkit!                 
    };// END Item object


    // Controller object.
    // This handles moving all the items, dealing with mouse clicks etc.    
    var Controller = function(container, images, options)
    {                       
        var items = [], funcSin = Math.sin, funcCos = Math.cos, ctx=this;
        this.controlTimer = 0;
        this.stopped = false;
        //this.imagesLoaded = 0;
        this.container = container;
        this.xRadius = options.xRadius;
        this.yRadius = options.yRadius;
        this.showFrontTextTimer = 0;
        this.autoRotateTimer = 0;
        if (options.xRadius === 0)
        {
            this.xRadius = ($(container).width()/2.3);
        }
        if (options.yRadius === 0)
        {
            this.yRadius = ($(container).height()/6);
        }

        this.xCentre = options.xPos;
        this.yCentre = options.yPos;
        this.frontIndex = 0;    // Index of the item at the front

        // Start with the first item at the front.
        this.rotation = this.destRotation = Math.PI/2;
        this.timeDelay = 1000/options.FPS;

        // Turn on the infoBox
        if(options.altBox !== null)
        {
            $(options.altBox).css('display','block');   
            $(options.titleBox).css('display','block'); 
        }
        // Turn on relative position for container to allow absolutely positioned elements
        // within it to work.
        $(container).css({ position:'relative', overflow:'hidden'} );

        $(options.buttonLeft).css('display','inline');
        $(options.buttonRight).css('display','inline');

        // Setup the buttons.
        $(options.buttonLeft).bind('mouseup',this,function(event){
            event.data.rotate(-1);  
            return false;
        });
        $(options.buttonRight).bind('mouseup',this,function(event){                                                         
            event.data.rotate(1);   
            return false;
        });

        // You will need this plugin for the mousewheel to work: http://plugins.jquery.com/project/mousewheel
        if (options.mouseWheel)
        {
            $(container).bind('mousewheel',this,function(event, delta) {                     
                     event.data.rotate(delta);
                     return false;
                 });
        }
        $(container).bind('mouseover click',this,function(event){

            clearInterval(event.data.autoRotateTimer);      // Stop auto rotation if mouse over.
            var text = $(event.target).attr('alt');     
            // If we have moved over a carousel item, then show the alt and title text.

            if ( text !== undefined && text !== null )
            {

                clearTimeout(event.data.showFrontTextTimer);            
                $(options.altBox).html( ($(event.target).attr('alt') ));
                $(options.titleBox).html( ($(event.target).attr('title') ));                            
                if ( options.bringToFront && event.type == 'click' )                
                {

                    var idx = $(event.target).data('itemIndex');    
                    var frontIndex = event.data.frontIndex;
                    //var   diff = idx - frontIndex;                    
                    var        diff = (idx - frontIndex) % images.length;
                    if (Math.abs(diff) > images.length / 2) {
                        diff += (diff > 0 ? -images.length : images.length);
                    }

                    event.data.rotate(-diff);
                }
            }
        });
        // If we have moved out of a carousel item (or the container itself),
        // restore the text of the front item in 1 second.
        $(container).bind('mouseout',this,function(event){
                var context = event.data;               
                clearTimeout(context.showFrontTextTimer);               
                context.showFrontTextTimer = setTimeout( function(){context.showFrontText();},1000);
                context.autoRotate();   // Start auto rotation.
        });

        // Prevent items from being selected as mouse is moved and clicked in the container.
        $(container).bind('mousedown',this,function(event){ 

            event.data.container.focus();
            return false;
        });
        container.onselectstart = function () { return false; };        // For IE.

        this.innerWrapper = $(container).wrapInner('<div style="position:absolute;width:100%;height:100%;"/>').children()[0];

        // Shows the text from the front most item.
        this.showFrontText = function()
        {   
            if ( items[this.frontIndex] === undefined ) { return; } // Images might not have loaded yet.
            $(options.titleBox).html( $(items[this.frontIndex].image).attr('title'));
            $(options.altBox).html( $(items[this.frontIndex].image).attr('alt'));               
        };

        this.go = function()
        {               
            if(this.controlTimer !== 0) { return; }
            var context = this;
            this.controlTimer = setTimeout( function(){context.updateAll();},this.timeDelay);                   
        };

        this.stop = function()
        {
            clearTimeout(this.controlTimer);
            this.controlTimer = 0;              
        };


        // Starts the rotation of the carousel. Direction is the number (+-) of carousel items to rotate by.
        this.rotate = function(direction)
        {   
            this.frontIndex -= direction;
            this.frontIndex %= items.length;                                
            this.destRotation += ( Math.PI / items.length ) * ( 2*direction );
            this.showFrontText();
            this.go();          
        };


        this.autoRotate = function()
        {           
            if ( options.autoRotate !== 'no' )
            {
                var dir = (options.autoRotate === 'right')? 1 : -1;
                this.autoRotateTimer = setInterval( function(){ctx.rotate(dir); }, options.autoRotateDelay );
            }
        };

        // This is the main loop function that moves everything.
        this.updateAll = function()
        {                                           
            var minScale = options.minScale;    // This is the smallest scale applied to the furthest item.
            var smallRange = (1-minScale) * 0.5;
            var w,h,x,y,scale,item,sinVal;

            var change = (this.destRotation - this.rotation);               
            var absChange = Math.abs(change);

            this.rotation += change * options.speed;
            if ( absChange < 0.001 ) { this.rotation = this.destRotation; }         
            var itemsLen = items.length;
            var spacing = (Math.PI / itemsLen) * 2; 
            //var   wrapStyle = null;
            var radians = this.rotation;
            var isMSIE = $.browser.msie;

            // Turn off display. This can reduce repaints/reflows when making style and position changes in the loop.
            // See http://dev.opera.com/articles/view/efficient-javascript/?page=3          
            this.innerWrapper.style.display = 'none';       

            var style;
            var px = 'px', reflHeight;  
            var context = this;
            for (var i = 0; i<itemsLen ;i++)
            {
                item = items[i];

                sinVal = funcSin(radians);

                scale = ((sinVal+1) * smallRange) + minScale;

                x = this.xCentre + (( (funcCos(radians) * this.xRadius) - (item.orgWidth*0.5)) * scale);
                y = this.yCentre + (( (sinVal * this.yRadius)  ) * scale);      

                if (item.imageOK)
                {
                    var img = item.image;
                    w = img.width = item.orgWidth * scale;                  
                    h = img.height = item.orgHeight * scale;
                    img.style.left = x + px ;
                    img.style.top = y + px;
                    img.style.zIndex = "" + (scale * 100)>>0;   // >>0 = Math.foor(). Firefox doesn't like fractional decimals in z-index.
                    if (item.reflection !== null)
                    {                                                                                                       
                        reflHeight = options.reflHeight * scale;                        
                        style = item.reflection.element.style;
                        style.left = x + px;
                        style.top = y + h + options.reflGap * scale + px;
                        style.width = w + px;                               
                        if (isMSIE)
                        {                                           
                            style.filter.finishy = (reflHeight / h * 100);              
                        }else
                        {                               
                            style.height = reflHeight + px;                                                         
                        }                                                                                                                   
                    }                   
                }
                radians += spacing;
            }
            // Turn display back on.                    
            this.innerWrapper.style.display = 'block';

            // If we have a preceptable change in rotation then loop again next frame.
            if ( absChange >= 0.001 )
            {               
                this.controlTimer = setTimeout( function(){context.updateAll();},this.timeDelay);       
            }else
            {
                // Otherwise just stop completely.              
                this.stop();
            }
        }; // END updateAll     

        // Create an Item object for each image 
//      func = function(){return;ctx.updateAll();} ;

        // Check if images have loaded. We need valid widths and heights for the reflections.
        this.checkImagesLoaded = function()
        {
            var i;
            for(i=0;i<images.length;i++) {
                if ( (images[i].width === undefined) || ( (images[i].complete !== undefined) && (!images[i].complete)  ))
                {
                    return;                 
                }               
            }
            for(i=0;i<images.length;i++) {              
                 items.push( new Item( images[i], options ) );  
                 $(images[i]).data('itemIndex',i);
            }
            // If all images have valid widths and heights, we can stop checking.           
            clearInterval(this.tt);
            this.showFrontText();
            this.autoRotate();  
            this.updateAll();

        };

        this.tt = setInterval( function(){ctx.checkImagesLoaded();},50);    
    }; // END Controller object

    // The jQuery plugin part. Iterates through items specified in selector and inits a Controller class for each one.
    $.fn.CloudCarousel = function(options) {

        this.each( function() {         

            options = $.extend({}, {
                               reflHeight:0,
                               reflOpacity:0.5,
                               reflGap:0,
                               minScale:0.5,
                               xPos:0,
                               yPos:0,
                               xRadius:0,
                               yRadius:0,
                               altBox:null,
                               titleBox:null,
                               FPS: 30,
                               autoRotate: 'no',
                               autoRotateDelay: 1500,
                               speed:0.2,
                               mouseWheel: false,
                                 bringToFront: false
            },options );                                    
            // Create a Controller for each carousel.       
            $(this).data('cloudcarousel', new Controller( this, $('.cloudcarousel',$(this)), options) );
        });             
        return this;
    };

})(jQuery);

这里是启动脚本,但是没有高度选项

THis here initiates the script, but also no height options

$("#carousel1").CloudCarousel(      
    {           
        reflHeight: 40,
        reflGap:2,
        titleBox: $('#da-vinci-title'),
        altBox: $('#da-vinci-alt'),
        buttonLeft: $('#slider-left-but'),
        buttonRight: $('#slider-right-but'),
        yRadius:30,
        xPos: 480,
        yPos: 32,
        speed:0.15,
    }
); 

推荐答案

您所追求的最终结果(尝试将云轮播缩放到不那么高的水平")有点模糊,但是基于您对注释,它看起来像是要减小旋转木马圆的半径.更改后,其他所有内容都可以通过当前选项进行操作.

The end result you're after ("trying to rescale the cloud carousel to be a bit less high") is a little vague but based on your responses to the comments, it reads as if you want to decrease the radius of the carousel circle. After you change that, everything else can be manipulated via the current options.

看来,云轮播1.0.5.js的第230行确定了半径的大小.

It appears line 230 of cloud-carousel.1.0.5.js determines the size of the radius.

var smallRange = (1-minScale) * 0.5;

替换.5值会产生以下结果.

Replacing the .5 value produces the following results.

.75

.5

.25

.15

不幸的是,您将需要编辑源以更改此值.您可以对所需的值进行硬编码,也可以更新选项以包括该值.这需要对CloudCarousel源进行较小的更改.代码更改并在下面提供了一个工作示例.

Unfortunately, you will need to edit the source to change this value. You could hard code the value you need in or update the options to include this value. This requires a minor change to the CloudCarousel source. The code changes and a working example included below.

var smallRange = (1-minScale) * options.carouselRadius;

第352行

carouselRadius: .5,

工作小提琴

http://jsfiddle.net/8V8JZ/

这篇关于较小的云轮播的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆