0

我正在尝试修改 Nivo-slider JavaScript 代码以使用内置于滑块中的一种效果。我一直在玩这个代码很长一段时间没有成功。下面代码的最底部有一些过渡效果选项。当我尝试选择一个时,它只能从第三张幻灯片开始起作用。这意味着第一张幻灯片具有“淡入淡出”效果,第二张幻灯片具有“无效果”第三张幻灯片具有“slideLeft”效果,然后从第四张幻灯片开始,我尝试全面应用的任何效果都将应用于剩余的幻灯片幻灯片。

我想知道是否有人可以帮助我理解我做错了什么?我只是想选择一个过渡效果并将其应用于我的所有幻灯片......

这是 JavaScript 代码:

        // Generate random effect
        if(settings.effect === 'random'){
            anims = new Array('sliceDownRight','sliceDownLeft','sliceUpRight','sliceUpLeft','sliceUpDown','sliceUpDownLeft','fold','fade',
            'boxRandom','boxRain','boxRainReverse','boxRainGrow','boxRainGrowReverse');
            currentEffect = anims[Math.floor(Math.random()*(anims.length + 1))];
            if(currentEffect === undefined) { currentEffect = 'fade'; }
        }

        // Run random effect from specified set (eg: effect:'fold,fade')
        if(settings.effect.indexOf(',') !== -1){
            anims = settings.effect.split(',');
            currentEffect = anims[Math.floor(Math.random()*(anims.length))];
            if(currentEffect === undefined) { currentEffect = 'fade'; }
        }

        // Custom transition as defined by "data-transition" attribute
        if(vars.currentImage.attr('data-transition')){
            currentEffect = vars.currentImage.attr('data-transition');
        }

        // Run effects
        vars.running = false;
        var timeBuff = 0,
            i = 0,
            slices = '',
            firstSlice = '',
            totalBoxes = '',
            boxes = '';

        if(currentEffect === 'sliceDown' || currentEffect === 'sliceDownRight' || currentEffect === 'sliceDownLeft'){
            createSlices(slider, settings, vars);
            timeBuff = 0;
            i = 0;
            slices = $('.nivo-slice', slider);
            if(currentEffect === 'sliceDownLeft') { slices = $('.nivo-slice', slider)._reverse(); }

            slices.each(function(){
                var slice = $(this);
                slice.css({ 'top': '0px' });
                if(i === settings.slices-1){
                    setTimeout(function(){
                        slice.animate({opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('nivo:animFinished'); });
                    }, (100 + timeBuff));
                } else {
                    setTimeout(function(){
                        slice.animate({opacity:'1.0' }, settings.animSpeed);
                    }, (100 + timeBuff));
                }
                timeBuff += 50;
                i++;
            });
        } else if(currentEffect === 'sliceUp' || currentEffect === 'sliceUpRight' || currentEffect === 'sliceUpLeft'){
            createSlices(slider, settings, vars);
            timeBuff = 0;
            i = 0;
            slices = $('.nivo-slice', slider);
            if(currentEffect === 'sliceUpLeft') { slices = $('.nivo-slice', slider)._reverse(); }

            slices.each(function(){
                var slice = $(this);
                slice.css({ 'bottom': '0px' });
                if(i === settings.slices-1){
                    setTimeout(function(){
                        slice.animate({opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('nivo:animFinished'); });
                    }, (100 + timeBuff));
                } else {
                    setTimeout(function(){
                        slice.animate({opacity:'1.0' }, settings.animSpeed);
                    }, (100 + timeBuff));
                }
                timeBuff += 50;
                i++;
            });
        } else if(currentEffect === 'sliceUpDown' || currentEffect === 'sliceUpDownRight' || currentEffect === 'sliceUpDownLeft'){
            createSlices(slider, settings, vars);
            timeBuff = 0;
            i = 0;
            var v = 0;
            slices = $('.nivo-slice', slider);
            if(currentEffect === 'sliceUpDownLeft') { slices = $('.nivo-slice', slider)._reverse(); }

            slices.each(function(){
                var slice = $(this);
                if(i === 0){
                    slice.css('top','0px');
                    i++;
                } else {
                    slice.css('bottom','0px');
                    i = 0;
                }

                if(v === settings.slices-1){
                    setTimeout(function(){
                        slice.animate({opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('nivo:animFinished'); });
                    }, (100 + timeBuff));
                } else {
                    setTimeout(function(){
                        slice.animate({opacity:'1.0' }, settings.animSpeed);
                    }, (100 + timeBuff));
                }
                timeBuff += 50;
                v++;
            });
        } else if(currentEffect === 'fold'){
            createSlices(slider, settings, vars);
            timeBuff = 0;
            i = 0;

            $('.nivo-slice', slider).each(function(){
                var slice = $(this);
                var origWidth = slice.width();
                slice.css({ top:'0px', width:'0px' });
                if(i === settings.slices-1){
                    setTimeout(function(){
                        slice.animate({ width:origWidth, opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('nivo:animFinished'); });
                    }, (100 + timeBuff));
                } else {
                    setTimeout(function(){
                        slice.animate({ width:origWidth, opacity:'1.0' }, settings.animSpeed);
                    }, (100 + timeBuff));
                }
                timeBuff += 50;
                i++;
            });
        } else if(currentEffect === 'fade'){
            createSlices(slider, settings, vars);

            firstSlice = $('.nivo-slice:first', slider);
            firstSlice.css({
                'width': slider.width() + 'px'
            });

            firstSlice.animate({ opacity:'1.0' }, (settings.animSpeed*2), '', function(){ slider.trigger('nivo:animFinished'); });
        } else if(currentEffect === 'slideInRight'){
            createSlices(slider, settings, vars);

            firstSlice = $('.nivo-slice:first', slider);
            firstSlice.css({
                'width': '0px',
                'opacity': '1'
            });

            firstSlice.animate({ width: slider.width() + 'px' }, (settings.animSpeed*2), '', function(){ slider.trigger('nivo:animFinished'); });
        } else if(currentEffect === 'slideInLeft'){
            createSlices(slider, settings, vars);

            firstSlice = $('.nivo-slice:first', slider);
            firstSlice.css({
                'width': '0px',
                'opacity': '1',
                'left': '',
                'right': '0px'
            });

            firstSlice.animate({ width: slider.width() + 'px' }, (settings.animSpeed*2), '', function(){ 
                // Reset positioning
                firstSlice.css({
                    'left': '0px',
                    'right': ''
                });
                slider.trigger('nivo:animFinished'); 
            });
        } else if(currentEffect === 'boxRandom'){
            createBoxes(slider, settings, vars);

            totalBoxes = settings.boxCols * settings.boxRows;
            i = 0;
            timeBuff = 0;

            boxes = shuffle($('.nivo-box', slider));
            boxes.each(function(){
                var box = $(this);
                if(i === totalBoxes-1){
                    setTimeout(function(){
                        box.animate({ opacity:'1' }, settings.animSpeed, '', function(){ slider.trigger('nivo:animFinished'); });
                    }, (100 + timeBuff));
                } else {
                    setTimeout(function(){
                        box.animate({ opacity:'1' }, settings.animSpeed);
                    }, (100 + timeBuff));
                }
                timeBuff += 20;
                i++;
            });
        } else if(currentEffect === 'boxRain' || currentEffect === 'boxRainReverse' || currentEffect === 'boxRainGrow' || currentEffect === 'boxRainGrowReverse'){
            createBoxes(slider, settings, vars);

            totalBoxes = settings.boxCols * settings.boxRows;
            i = 0;
            timeBuff = 0;

            // Split boxes into 2D array
            var rowIndex = 0;
            var colIndex = 0;
            var box2Darr = [];
            box2Darr[rowIndex] = [];
            boxes = $('.nivo-box', slider);
            if(currentEffect === 'boxRainReverse' || currentEffect === 'boxRainGrowReverse'){
                boxes = $('.nivo-box', slider)._reverse();
            }
            boxes.each(function(){
                box2Darr[rowIndex][colIndex] = $(this);
                colIndex++;
                if(colIndex === settings.boxCols){
                    rowIndex++;
                    colIndex = 0;
                    box2Darr[rowIndex] = [];
                }
            });

            // Run animation
            for(var cols = 0; cols < (settings.boxCols * 2); cols++){
                var prevCol = cols;
                for(var rows = 0; rows < settings.boxRows; rows++){
                    if(prevCol >= 0 && prevCol < settings.boxCols){
                        /* Due to some weird JS bug with loop vars 
                        being used in setTimeout, this is wrapped
                        with an anonymous function call */
                        (function(row, col, time, i, totalBoxes) {
                            var box = $(box2Darr[row][col]);
                            var w = box.width();
                            var h = box.height();
                            if(currentEffect === 'boxRainGrow' || currentEffect === 'boxRainGrowReverse'){
                                box.width(0).height(0);
                            }
                            if(i === totalBoxes-1){
                                setTimeout(function(){
                                    box.animate({ opacity:'1', width:w, height:h }, settings.animSpeed/1.3, '', function(){ slider.trigger('nivo:animFinished'); });
                                }, (100 + time));
                            } else {
                                setTimeout(function(){
                                    box.animate({ opacity:'1', width:w, height:h }, settings.animSpeed/1.3);
                                }, (100 + time));
                            }
                        })(rows, prevCol, timeBuff, i, totalBoxes);
                        i++;
                    }
                    prevCol--;
                }
                timeBuff += 100;
            }
        }           
    };

    // Shuffle an array
    var shuffle = function(arr){
        for(var j, x, i = arr.length; i; j = parseInt(Math.random() * i, 10), x = arr[--i], arr[i] = arr[j], arr[j] = x);
        return arr;
    };

    // For debugging
    var trace = function(msg){
        if(this.console && typeof console.log !== 'undefined') { console.log(msg); }
    };

    // Start / Stop
    this.stop = function(){
        if(!$(element).data('nivo:vars').stop){
            $(element).data('nivo:vars').stop = true;
            trace('Stop Slider');
        }
    };

    this.start = function(){
        if($(element).data('nivo:vars').stop){
            $(element).data('nivo:vars').stop = false;
            trace('Start Slider');
        }
    };

    // Trigger the afterLoad callback
    settings.afterLoad.call(this);

    return this;
};

$.fn.nivoSlider = function(options) {
    return this.each(function(key, value){
        var element = $(this);
        // Return early if this element already has a plugin instance
        if (element.data('nivoslider')) { return element.data('nivoslider'); }
        // Pass options to plugin constructor
        var nivoslider = new NivoSlider(this, options);
        // Store plugin object in this element's data
        element.data('nivoslider', nivoslider);
    });
};

//Default settings
$.fn.nivoSlider.defaults = {
    /*'sliceDownRight','sliceDownLeft','sliceUpRight','sliceUpLeft','sliceUpDown','sliceUpDownLeft','fold','fade',
            'boxRandom','boxRain','boxRainReverse','boxRainGrow','boxRainGrowReverse*/
    effect: 'fold',
    slices: 15,
    boxCols: 8,
    boxRows: 4,
    animSpeed: 500,
    pauseTime: 3000,
    startSlide: 0,
    directionNav: true,
    controlNav: false,
    controlNavThumbs: false,
    pauseOnHover: true,
    manualAdvance: false,
    prevText: 'Prev',
    nextText: 'Next',
    randomStart: false,
    beforeChange: function(){},
    afterChange: function(){},
    slideshowEnd: function(){},
    lastSlide: function(){},
    afterLoad: function(){}
};

$.fn._reverse = [].reverse;

})(jQuery);

4

1 回答 1

0

效果已在 js 中设置,因此您只需在 html 页面上更改/添加数据转换:

img src="demo/images/demo.jpg" data-thumb="demo/images/demo.jpg" alt="" data-transition="slideInLeft"

于 2012-11-02T15:16:23.650 回答