使用jQuery创建一个简单的全宽无限轮播

时间:2015-04-18 10:28:31

标签: javascript jquery html css

我正在用jquery创建一个滑块。如果我可以使用任何已经制作的插件,我已经在线了,但没有人可以做我需要的。

在我正在处理的网站上,我有一个内容为1260px的容器。

滑块为全宽,中间是活动幻灯片,侧面是上一张和下一张幻灯片,应作为上一次和下一次点击。

我计划在该滑块上进行扩展,以便在其下方有缩略图,但是现在我需要让滑块工作。

HTML是(图像是1260x520px)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Simple Fullwidth Slider</title>
    <link rel="stylesheet" href="style.css" type="text/css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    <script src="init.js"></script>
</head>
<body>
    <div class="slider clearfix" data-autoplay="0" data-items="1" data-easing="linear" data-duration="750" data-height="520">
        <div class=" single_slide" style="height: 520px; background-image: url('image.jpg'); background-size: cover; background-position: 0% 0%; background-repeat: no-repeat;">
            <div class="slider_text">
            </div>
        </div>
        <div class="single_slide active" style="height: 520px; background-image: url('image.jpg'); background-size: cover; background-position: 0% 0%; background-repeat: no-repeat;">
            <div class="slider_text">
            </div>
        </div>
        <div class=" single_slide" style="height: 520px; background-image: url('image.jpg'); background-size: cover; background-position: 0% 0%; background-repeat: no-repeat;">
            <div class="slider_text">
            </div>
        </div>
        <div class=" single_slide" style="height: 520px; background-image: url('image.jpg'); background-size: cover; background-position: 0% 0%; background-repeat: no-repeat;">
            <div class="slider_text">
            </div>
        </div>  
        <div class=" single_slide" style="height: 520px; background-image: url('image.jpg'); background-size: cover; background-position: 0% 0%; background-repeat: no-repeat;">
            <div class="slider_text">
            </div>
        </div> 
    </div>
</body>
</html>

Style css是:

/***************** Image Slider ****************/

.slider{
    list-style: none;
    display: block;
    width: 100%;
    overflow: hidden;
    position: relative;
}

.slider .single_slide{
    float: left;
    display: block;
    margin: 0;
    padding: 0;
    border-radius: 0px;
    overflow: hidden;
    opacity: 0.15;
    width: 1260px;
    cursor: pointer;
    -webkit-transition: opacity 800ms ease-in-out;
    transition: opacity 800ms ease-in-out;
}

.slider .single_slide.active{
    opacity: 1;
    cursor: default;
    -webkit-transition: opacity 800ms ease-in-out;
    transition: opacity 800ms ease-in-out;
}

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);
        }

    });

});

我也创建了git repository,因此您可以下载html文件。

我最初是为wordpress做的,但工作方式是一样的。

问题是,一旦点击上一张图像或下一张图像,它就不会附加图像。切换类是有效的,但是当你点击它们时,下一个和前一个图像没有改变(我做了类似的事情,但是prev / next按钮是固定元素,所以我可以一直定位它们,但是在这里它们正在改变) -

1 个答案:

答案 0 :(得分:2)

我认为我已经找到了上一个和下一个选择器问题的根源。它们作为变量缓存一次,但是当active类更改为另一个幻灯片时从未更新 - 因此事件侦听器将坚持最初设置为活动幻灯片的兄弟的元素:

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()方法和委派的事件监听器实现功能和无限:

http://codepen.io/anon/pen/aOoPgZ?editors=001

$('.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);
    }

});

我确定有一些优化空间,但它似乎可以解决问题。具有跟踪可能不需要的图像的功能(但它对调试很方便)。

现在进行一些滑动支持。 :-D