jQuery幻灯片代码无法正常工作

时间:2014-03-01 22:23:36

标签: javascript jquery html slideshow

我正在构建一个简单的jQuery幻灯片,我正在为我的网站使用它。

我在这里找到了代码(并进行了一些调整):http://www.barrelny.com/blog/building-a-jquery-slideshow-plugin-from-scratch/(我唯一的要求是代码必须从头开始构建,重量轻,使用CSS3 Transitions并每隔五秒钟自动滑动。)< / p>

问题是,我的代码甚至无法发生任何事情。无论如何,在这里。

(function($){
function prefix(el){
    var prefixes = ["webkit", "moz", "o", "ms"];
    for (var i = 0; i < prefixes.length; i++){
        if (prefixes[i] + "transition" in el.style){
            return '-'+prefixes[i].toLowerCase()+'-'; 
        };
    }; 
    return "transition" in el.style ? "" : false;
};
s    var methods = {
    init: function(settings){
        return this.each(function(){
            var config = {
                slideDur: 7000,
                fadeDur: 800
            };
            if(settings){
                $.extend(config, settings);
            };
            this.config = config;
            var $container = $(this),
                slideSelector = 'article',
                fading = false,
                slideTimer,
                activeSlide,
                newSlide,
                $slides = $container.find(slideSelector),
                totalSlides = $slides.length,
                $pagerList = $container.find('#control');
                prefix = prefix($container[0]);
            function waitForNext(){
                slideTimer = setTimeout(function(){
                    changeSlides('next');
                },config.slideDur);
            };
            function animateSlides(activeNdx, newNdx){
                function cleanUp(){
                    $slides.eq(activeNdx).removeAttr('style');
                    activeSlide = newNdx;
                    fading = false;
                    waitForNext();
                };
                if(fading || activeNdx == newNdx){
                    return false;
                };
                fading = true;
                $pagers.removeClass('active').eq(newSlide).addClass('active');
                $slides.eq(activeNdx).css('z-index', 3);
                $slides.eq(newNdx).css({
                    'z-index': 2,
                    'opacity': 1
                });
                var styles = {};
                styles[prefix+'transition'] = 'opacity '+config.fadeDur+'ms';
                styles['opacity'] = 0;
                $slides.eq(activeNdx).css(styles);
                var fadeTimer = setTimeout(function(){
                    cleanUp();
                },config.fadeDur);
            };
            function changeSlides(target){
                if(target == 'next'){
                    newSlide = activeSlide + 1;
                    if(newSlide > totalSlides - 1){
                        newSlide = 0;
                    }
                } else if(target == 'prev'){
                    newSlide = activeSlide - 1;
                    if(newSlide < 0){
                        newSlide = totalSlides - 1;
                    };
                } else {
                    newSlide = target;
                };
                animateSlides(activeSlide, newSlide);
            };
            for(var i = 0; i < totalSlides; i++){
                $pagerList
                    .append('<nav id="control" data-target="'+i+'">'+i+'</nav>');
            };
            $container.find('#control').bind('click',function(){
                var target = $(this).attr('data-target');
                clearTimeout(slideTimer);
                changeSlides(target);
            });
            var $pagers = $pagerList.find('#control');
            $slides.eq(0).css('opacity', 1);
            activeSlide = 0;
            slideTimer = setTimeout(function(){
                changeSlides('next');
            },config.slideDur);
        });
    }
};
$.fn.easyFader = function(settings){
    return methods.init.apply(this, arguments);
};
})(jQuery);

这是小提琴:http://jsfiddle.net/b7PLz/

我真的希望有人可以帮助我 - 任何帮助都会受到赞赏。感谢

2 个答案:

答案 0 :(得分:1)

我已更新您的jsfiddle,现在效果非常好。你的问题,除了代码中的拼写错误('var方法'之前有一个's'),你在DOMready事件处理程序中执行插件函数并在body标记的末尾调用它是你的问题幻灯片垂直排列在幻灯片放映容器内。由于幻灯片放映容器具有特定高度并且隐藏了溢出,因此它们是不可见的。我改变了这一点,将文章设置为绝对位置,以便文章现在一个接一个。此外,没有位置绝对或相对z指数不起作用。

#slideshow article { 
  height: 345px; 
  width: 700px; 
  position: absolute; 
  top: 0px; 
  left: 0px; 
}

答案 1 :(得分:1)

我打开第二个答案来发布新代码。

我已更新jsfiddle,现在转换是幻灯片,代码更简单:

(function($){
function prefix(el){
    var prefixes = ["webkit", "moz", "o", "ms"];
    for (var i = 0; i < prefixes.length; i++){
        if (prefixes[i] + "transition" in el.style){
            return '-'+prefixes[i].toLowerCase()+'-'; 
        };
    }; 
    return "transition" in el.style ? "" : false;
};
var methods = {
    init: function(settings){
        return this.each(function(){
            var config = {
                slideDur: 7000,
                fadeDur: 800
            };
            if(settings){
                $.extend(config, settings);
            };
            this.config = config;
            var $container = $(this),
                slideSelector = 'article',
                slideTimer,
                activeSlide,
                $slides = $container.find(slideSelector),
                $carousel = $slides.parent();
                totalSlides = $slides.length;
                $carousel.css('width', (totalSlides * 100) + '%');
                $pagerList = $container.find('#control');
                prefix = prefix($container[0]);
            function waitForNext(){
                slideTimer = setTimeout(function(){
                    changeSlides('next');
                },config.slideDur);
            };
            function animateSlides(){
                $pagers.removeClass('active').eq(newSlide).addClass('active');
                var $slide = $slides.eq(newSlide);
                var offset = $slide.position().left;
                console.log(offset);
                var styles = {};
                styles[prefix+'transition-duration'] = config.fadeDur+'ms';
                styles[prefix+'transform'] = 'translate3d(-'+offset+'px, 0px, 0px)';
                console.log(styles);
                $carousel.css(styles);
                waitForNext();
            };
            function changeSlides(target){
                if(target == 'next'){
                    newSlide = activeSlide + 1;
                    if(newSlide >= totalSlides){
                        newSlide = 0;
                    }
                } else if(target == 'prev'){
                    newSlide = activeSlide - 1;
                    if(newSlide < 0){
                        newSlide = totalSlides - 1;
                    };
                } else {
                    newSlide = Math.max(0, Math.min(target, totalSlides - 1));
                };
                activeSlide = newSlide;
                animateSlides();
            };
            for(var i = 0; i < totalSlides; i++){
                $pagerList
                    .append('<nav id="control" data-target="'+i+'">'+i+'</nav>');
            };
            $container.find('#control').bind('click',function(){
                var target = $(this).attr('data-target');
                clearTimeout(slideTimer);
                changeSlides(target);
            });
            var $pagers = $pagerList.find('#control');
            activeSlide = 0;
            slideTimer = setTimeout(function(){
                changeSlides('next');
            },config.slideDur);
        });
    }
};
$.fn.easyFader = function(settings){
    return methods.init.apply(this, arguments);
};
console.log('here');

})(jQuery的);

你必须将文章包装在id为'carousel'的另一个div中。

现在,当幻灯片显示到达最后一张幻灯片时,它会回到开头。如果你想总是从右向左前进,然后从左向右回来,它会变得有点复杂。您可以尝试bxSlider,这已经允许您执行此操作,还有更多选项。