码迷,mamicode.com
首页 > 其他好文 > 详细

轮播图的实现

时间:2017-12-30 00:22:13      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:add   tin   ace   children   编写   banner   document   anim   自动   

实现轮播图

思路

实现动画

  • 构建一个滑条,这个滑条包含banner1,banner2,banner3,banner4,banner1图片,设置这个滑条的display:flex,
  • 图片水平铺展为一个滑条
  • 设置滑条的父级元素高度为图片的高度(通过监听window.load事件实现)
$(w).on(‘load resize‘, function(e){
    $(‘div.banner‘).each(function(){
        $(this).height($(this).find(‘img‘).first().height())
    })
});
  • 用jQuery animate 滑条的 css left 属性来实现动画
$(‘.banner-pic-slider‘).stop().animate({
    ‘left‘ : -num * bannerWidth  + ‘px‘
}, 2000, function(){
    if(callback){
        callback();
    }
});
  • 实现切换当前图片的功能
  • 用一个变量标记当前是第几张图
  • 根据要切换第几张图切换
  • 为了实现循环效果,最后一张图切换回第一张图会有所不同
var selectPic = function(num, callback){
    num = num || 0;
    currentNum = num % 4;
    if (num != 4){
        $(‘.pagination-item‘).eq(num).addClass(‘active‘).siblings().removeClass(‘active‘);
        var bannerWidth = $(‘.banner‘).width();
        $(‘.banner-pic-slider‘).stop().animate({
            ‘left‘ : -num * bannerWidth  + ‘px‘
        }, 2000, function(){
            if(callback){
                callback();
            }
        });
        return 
    }

    // 到最后一张图 产生循环效果 继续往右拉 然后设置 left 0
    $(‘.pagination-item‘).eq(0).addClass(‘active‘).siblings().removeClass(‘active‘);
    var bannerWidth = $(‘.banner‘).width();
    $(‘.banner-pic-slider‘).stop().animate({
        ‘left‘ : -4 * bannerWidth  + ‘px‘
    }, 2000, function(){
        $(this).css({
            "left" : 0
        });
        if(callback){
            callback();
        }
    });

    
};

实现循环播放

  • 编写setBannerAutoPlay方法,具有关闭自动播放和开始自动播放的功能
  • 设置点击pagination区域触发 关闭自动播放,点击造成的jQuery动画结束后再开始播放
  • 播放到最后一张图时,再往后拉一张图,然后设置left为0
var setBannerAutoPlay = (function(){
    var playing = false;
    var intervalId = 0;
    return function(play){
        // 如果要播放
        
        if (play){
            if (playing){
                return
            }
            intervalId = setInterval(function(){
                selectPic(currentNum + 1)
            }, 3000);
            console.log(‘play start‘);

            playing = true;
            return
        }
        // 如果要停止
        if ( playing ){
            clearInterval(intervalId);
            playing = false;
            console.log(‘play stop‘);
        }    
    }
    
})();

实现点击切换

  • 监听pagination区域的click事件, 通过$(.pagination-item).parent().children().index(this) 获得点击了第几块
  • 编写selectPic(num, callback) 函数,根据 num 切换图片 主要是jQuery动画
$(‘.pagination-item‘).on(‘click‘,function(){
    setBannerAutoPlay(false)

    var num = $(this).parent().children().index(this);
    selectPic(num, function(){
        setBannerAutoPlay(true);

    });
});

全部代码

<div class="banner">
    <div class="banner-pic-slider">
        <img class="active" src="img/banner1.jpg" alt="">
        <img class="" src="img/banner2.jpg" alt="">
        <img class="" src="img/banner3.jpg" alt="">
        <img class="" src="img/banner4.jpg" alt="">
        <img class="" src="img/banner1.jpg" alt="">    
    </div>
    
    <div class="pagination">
        <div class="pagination-item active"></div>
        <div class="pagination-item"></div>
        <div class="pagination-item"></div>
        <div class="pagination-item"></div>
    </div>
</div>
/*轮播图*/
div.banner{
    width: 100%;
    position: relative;
    overflow: hidden;
}
div.banner-pic-slider{
    display: flex;
    flex-flow: row nowrap;
    position: absolute;
    left: 0;
}
div.banner img{
    width: 6.4rem;
    flex: 0 0 auto;
    height: 100%;
}

div.banner div.pagination{
    position: absolute;
    bottom: 10px;
    display: flex;
    justify-content: space-evenly;
    width: calc( .16rem * 6);
    left: 0;
    right: 0;
    margin: 0 auto;
    cursor: pointer;
}

div.pagination-item{
    width: .16rem;
    height: .16rem;
    border-radius: 50%;
    background: #ccc;

}

div.pagination-item.active{
    background: #fff;
}
(function(w, d){
    // 修改 banner 宽度为内部图片宽度
    var currentNum = 0;
    $(w).on(‘load resize‘, function(e){
        $(‘div.banner‘).each(function(){
            $(this).height($(this).find(‘img‘).first().height())
        })
    });

    // 改变当前图片
    var selectPic = function(num, callback){
        num = num || 0;
        currentNum = num % 4;
        if (num != 4){
            $(‘.pagination-item‘).eq(num).addClass(‘active‘).siblings().removeClass(‘active‘);
            var bannerWidth = $(‘.banner‘).width();
            $(‘.banner-pic-slider‘).stop().animate({
                ‘left‘ : -num * bannerWidth  + ‘px‘
            }, 2000, function(){
                if(callback){
                    callback();
                }
            });
            return 
        }

        // 到最后一张图 产生循环效果 继续往右拉 然后设置 left 0
        $(‘.pagination-item‘).eq(0).addClass(‘active‘).siblings().removeClass(‘active‘);
        var bannerWidth = $(‘.banner‘).width();
        $(‘.banner-pic-slider‘).stop().animate({
            ‘left‘ : -4 * bannerWidth  + ‘px‘
        }, 2000, function(){
            $(this).css({
                "left" : 0
            });
            if(callback){
                callback();
            }
        });

        
    };

    // 0 停止 1 开始
    var setBannerAutoPlay = (function(){
        var playing = false;
        var intervalId = 0;
        return function(play){
            // 如果要播放
            
            if (play){
                if (playing){
                    return
                }
                intervalId = setInterval(function(){
                    selectPic(currentNum + 1)
                }, 3000);
                console.log(‘play start‘);

                playing = true;
                return
            }
            // 如果要停止
            if ( playing ){
                clearInterval(intervalId);
                playing = false;
                console.log(‘play stop‘);
            }    
        }
        
    })();
    setBannerAutoPlay(true);
    // 点击pagination显示当前图片
    $(‘.pagination-item‘).on(‘click‘,function(){
        setBannerAutoPlay(false)

        var num = $(this).parent().children().index(this);
        selectPic(num, function(){
            setBannerAutoPlay(true);

        });
    });

})(window, document);

轮播图的实现

标签:add   tin   ace   children   编写   banner   document   anim   自动   

原文地址:https://www.cnblogs.com/Salaku/p/8146605.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!