Javascript 使用jQuery创建简单、全宽、无限旋转木马

Javascript 使用jQuery创建简单、全宽、无限旋转木马,javascript,jquery,html,css,Javascript,Jquery,Html,Css,我正在用jquery创建一个滑块。我在网上看过是否可以使用任何已经制作好的插件,但没有一个插件可以满足我的需要 在我正在工作的一个站点上,我有一个1260px的容器,其中包含内容 滑块是全宽的,中间是活动的幻灯片,侧面是上一张和下一张幻灯片,应该用作上一张和下一张单击 我计划在滑块上展开,以便在它下面有缩略图,但现在我需要使滑块工作 HTML为(图像为1260x520px) jQuery代码: jQuery(document).ready(function($) { $('.slide

我正在用jquery创建一个滑块。我在网上看过是否可以使用任何已经制作好的插件,但没有一个插件可以满足我的需要

在我正在工作的一个站点上,我有一个1260px的容器,其中包含内容

滑块是全宽的,中间是活动的幻灯片,侧面是上一张和下一张幻灯片,应该用作上一张和下一张单击

我计划在滑块上展开,以便在它下面有缩略图,但现在我需要使滑块工作

HTML为(图像为1260x520px)

jQuery代码:

jQuery(document).ready(function($) {

    $('.slider').each(function () {
        var $slider = $(this);
        var autoplay = $slider.data("autoplay");
        var items = $slider.data("items");
        var easing = $slider.data("easing");
        var duration = $slider.data("duration");
        var $single_slide = $slider.find('.single_slide');
        var slider_height = $single_slide.css('height', $slider.data('height')+'px');
        var left_offset = ($(window).width()-1260)/2;

        $slider.css({'width' : $single_slide.length*1260+'px', 'left':- 1260+left_offset + 'px'});

        $single_slide.eq(1).addClass('active');

        var $prev = $('.active').prev();
        var $next = $('.active').next();

        function moveLeft() {
            var $a = $('.active');
            $a.removeClass('active').prev().addClass('active');
            $slider.animate({
                left: parseInt($slider.css('left'), 10) + $single_slide.outerWidth(true),
                easing: easing,
                step: items,
            }, duration, function () {
                $('.single_slide:first').before($('single_slide:last'));
            });
        }

       function moveRight() {
            var $a = $('.active');
            $a.removeClass('active').next().addClass('active');
            $slider.animate({
                left: parseInt($slider.css('left'), 10) - $single_slide.outerWidth(true),
                easing: easing,
                step: items,
            }, duration, function () {
                $('.single_slide:last').after($('single_slide:first'));
            });
        }

        $prev.click(function () {
            moveLeft();
        });

        $next.click(function () {
            moveRight();
        });

        if (autoplay == 1) {
            setInterval(function () {
                moveRight();
            }, duration);
        }

    });

});
我还创建了一个,因此您可以下载html文件

我最初是为wordpress做这件事的,但工作原理是一样的


问题在于,单击“上一幅”或“下一幅”后,图像的附加似乎不起作用。类的切换是有效的,但是当你点击它们时,下一个和上一个图像不会改变(我做了类似的事情,但是上一个/下一个按钮是固定的元素,所以我可以一直以它们为目标,但在这里它们正在改变)

我想我找到了上一个和下一个选择器问题的根源。它们作为变量缓存了一次,但在
活动
类更改为另一张幻灯片时从未更新,因此事件侦听器将保留最初设置为活动幻灯片同级的元素:

var $prev = $('.active').prev();
var $next = $('.active').next();
不幸的是,这似乎不起作用:

$('.active').prev().click(function() { ... });
但这几乎起到了作用:

$('.slider').find($('.single_slide').eq($('.active').index()+2)).click(function() {
  moveLeft();
});

$('.slider').find($('.single_slide').eq($('.active').index()-1)).click(function() {
  moveRight();
});
更新-使用
.detach()
方法和委托事件侦听器使其功能化和无限化:

我相信有一些优化的空间,但它似乎做到了。具有跟踪可能不需要的图像的功能(但便于调试)


现在了解一些刷卡支持:-如果可以的话,在你开始的时候喊我一声。我会对这样一个基本的滑块感兴趣。B-)一个简单的解决方案是添加上一个和下一个“按钮”,该按钮将重叠非活动图像的部分(绝对定位),这将解决该问题。但是,将图像设置为“上一个”和“下一个”按钮会很酷。我会看看我能做些什么。我刚刚意识到,只有在每次接近终点时,在最后一张幻灯片之后添加相同的幻灯片,才能实现“无限”平滑滑动(以我的方式)。但这会使DOM过载(不是一个好的解决方案)。我可以创建一个有限滑块,然后我可以从左向右移动,但无限旋转木马不起作用:\这(有限滑块)将是我通常采用的方法。但你最初的想法肯定有吸引力,所以我不确定我是否准备放弃它。哈哈,让我重温一下剧本。。。还可以添加一些刷卡支持。:-)很高兴能帮忙,这是一个有趣的练习。有这样的剧本会很方便的。顺便说一句,我不是在开玩笑(在活动图像上)滑动,那不需要太多代码。但也许我会开一个GitHub帐户(还没有),看看我是否能在那里贡献更多。干杯
$('.active').prev().click(function() { ... });
$('.slider').find($('.single_slide').eq($('.active').index()+2)).click(function() {
  moveLeft();
});

$('.slider').find($('.single_slide').eq($('.active').index()-1)).click(function() {
  moveRight();
});
$('.slider').each(function() {

    var slider = $(this);
    var autoplay = slider.data('autoplay');
    var items = slider.data('items');
    var easing = slider.data('easing');
    var duration = slider.data('duration');
    var single_slide = slider.find('.single_slide');
    var slider_height = single_slide.css('height', slider.data('height'));
    var offset = ($(window).width()-1260)/2-1260;

    $.each(single_slide, function(index) {
        if (index == 0) $(this).addClass('img' + single_slide.length);
        else $(this).addClass('img' + index);
    });

    slider.css({'width': single_slide.length*1260, 'left': offset});
    single_slide
    .eq(0).addClass('prev').end()
    .eq(1).addClass('active').end()
    .eq(2).addClass('next');

    function moveLeft() {

        $('.active').removeClass('active').prev().addClass('active');

        slider.animate({
            left: slider.position().left+single_slide.outerWidth(true),
            easing: easing,
            step: items
        }, duration, function() {
            $('.single_slide:last').detach().prependTo(slider);
            slider.css('left', offset);
            newNav();
        });
    }

    function moveRight() {

        $('.active').removeClass('active').next().addClass('active');

        slider.animate({
            left: slider.position().left-single_slide.outerWidth(true),
            easing: easing,
            step: items
        }, duration, function() {
            $('.single_slide:first').detach().appendTo(slider);
            slider.css('left', offset);
            newNav();
        });
    }

    function newNav() {

        $('.prev').removeClass('prev');
        $('.next').removeClass('next');
        $('.single_slide')
        .eq(0).addClass('prev').end()
        .eq(2).addClass('next');
    }

    $(document).on('click', '.prev', function() {
        moveLeft();
    });

    $(document).on('click', '.next', function() {
        moveRight();
    });

    if (autoplay == 1) {
        setInterval(function() {
            moveRight();
        }, duration);
    }

});