移动端的js轮播图可以touch插件(随笔)

html代码

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>移动端轮播图</title>
    <link rel="stylesheet" href="./lbt.css">
</head>
<body>
<div class="layout">
    <div class="banner one">
        <ul class="clearfix">
            <li><a href="#"><img src="./images/l5.jpg" alt=""></a></li>
            <li><a href="#"><img src="./images/l1.jpg" alt=""></a></li>
            <li><a href="#"><img src="./images/l2.jpg" alt=""></a></li>
            <li><a href="#"><img src="./images/l3.jpg" alt=""></a></li>
            <li><a href="#"><img src="./images/l4.jpg" alt=""></a></li>
            <li><a href="#"><img src="./images/l5.jpg" alt=""></a></li>
            <li><a href="#"><img src="./images/l1.jpg" alt=""></a></li>
        </ul>
        <ul>
            <li class="now"></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
        </ul>
    </div>
</div>
</body>
</html>
<script type="text/javascript" src="./lbt.js"></script>
<script>
    lbt({
        "count":5,// 图片数量
        "dom":document.getElementsByClassName("one")[0],// class为banner的div
        "transTime":"0.3s",// 手指滑动时的过渡时间
        "autoTime":3000// 自动播放时间
    })
</script>

css代码

*,
::before,
::after{
    padding: 0;
    margin: 0;
    -webkit-box-sizing: border-box;/*兼容移动端主流浏览器*/
    box-sizing: border-box;
    -webkit-tap-highlight-color: transparent;/*清除移动端点击高亮效果*/
}
ol,ul{
    list-style: none;
}
/*清除浮动*/
.clearfix::before,
.clearfix::after{
    content: "";
    display: block;
    height: 0;
    line-height: 0;
    visibility: hidden;
    clear: both;
}

.layout{
    width: 600px;
    max-width: 750px;
    min-width: 320px;
    margin: 0 auto;
    position: relative;
}
.banner{
    width: 100%;
    overflow: hidden;
    position: relative;
    /*border: 1px red solid;*/
}
/* 设置图片ul的样式 */
/* 通过ul中图片的个数进行修改start */
.banner ul:first-child {
    width: 2000%;
    -webkit-transform: translateX(-5%);
    transform: translateX(-5%);
}
.banner ul:first-child li {
    float: left;
    width: 5%;
}
/* 通过ul中图片的个数进行修改end */
.banner ul:first-child li a{
    display: block;
    width: 100%;
}
.banner ul:first-child li a img{
    width: 100%;
    display: block;
}

/* 设置对应的点的样式 */
.banner ul:last-child{
    position: absolute;
    bottom: 6px;
    width: 100%;
    text-align: center;
}
.banner ul:last-child li{
    width: 6px;
    height: 6px;
    border: 1px solid #fff;
    border-radius: 50%;
    display: inline-block;
    margin-left: 10px;
}
.banner ul:last-child li:first-child{
    margin-left: 0;
}
.banner ul:last-child li.now{
    background: #fff;
}

js代码

/* 封装一些公用的事件或者公用的方法 */
/* 定义的一个命名空间 */
window.ev = {};
/* 封装一个过渡结束的方法 */
ev.translationEnd = function (dom,callback) {
    if(!dom || typeof dom != 'object'){
        //没dom的时候或者不是一个对象的时候 程序停止
        return false;
    }
    // 对过渡结束事件进行监听
    dom.addEventListener('transitionEnd', function(){
        callback && callback();
    });
    dom.addEventListener('webkitTransitionEnd', function(){
        callback && callback();
    });
}

var lbt = function(obj){
    /*
     * 1.自动轮播  定时器  无缝衔接  动画结束瞬间定位
     * 2.点需要随着轮播的滚动改变对应的点  改变当前样式  当前图片的索引
     * 3.手指滑动的时候让轮播图滑动   touch事件  记录坐标轴的改变 改变轮播图的定位(位移css3)
     * 4.当滑动的距离不超过一定的距离的时候  需要吸附回去  过渡的形式去做
     * 5.当滑动超过了一定的距离  需要 跳到 下一张或者上一张  (滑动的方向) 一定的距离(屏幕的三分之一)
     * */
    if(typeof obj.count !== "number") {
        return
    }
    if(typeof obj.dom !== "object") {
        return
    }
    var data = {
        "count":obj.count,
        "dom":obj.dom
    };
    if(typeof obj.transTime !== "string") {
        data.transTime = "0.3s"// 默认0.3s
    }else {
        data.transTime = obj.transTime;
    }
    if(typeof obj.autoTime !== "number") {
        data.autoTime = 3000;// 默认3000ms
    }else {
        data.autoTime = obj.autoTime
    }

    /*var data = {
        "count":,// 面中用来轮播的图片数量,必须,5
        "dom":,//轮播图大盒子object,必须
        "transTime":"",// 手指滑动时过渡时间,非必须,0.3s
        "autoTime":"",// 自动播放的时间,非必须,3000
    };*/

    var imageCount = data.count; //页面中用来轮播的图片有5张不同的
    //轮播图大盒子
    var banner = data.dom;
    //图片的宽度
    var width = banner.offsetWidth;
    //图片盒子
    var imageBox = banner.querySelector('ul:first-child');
    //点盒子
    var pointBox = banner.querySelector('ul:last-child');
    //所有的点
    var points = pointBox.querySelectorAll('li');

    //公用方法
    //加过渡
    var addTransition = function(){
        imageBox.style.transition = "all " + data.transTime;
        imageBox.style.webkitTransition = "all " + data.transTime;/*做兼容*/
    };
    //清除过渡
    var removeTransition = function(){
        imageBox.style.transition = "none";
        imageBox.style.webkitTransition = "none";
    }
    //定位
    var setTranslateX = function(translateX){
        imageBox.style.transform = "translateX("+translateX+"px)";
        imageBox.style.webkitTransform = "translateX("+translateX+"px)";
    }

    //功能实现
    //自动轮播  定时器  无缝衔接  动画结束瞬间定位
    var index = 1;
    var timer = setInterval(function(){
        index++ ;   //自动轮播到下一张
        //改变定位  动画的形式去改变  transition transform translate
        addTransition();    //加过渡动画
        setTranslateX(-index * width);  //定位
    },data.autoTime);

    //等过渡结束之后来做无缝衔接
    ev.translationEnd(imageBox, function(){
        //处理事件结束后的业务逻辑
        if(index > imageCount ){
            index = 1;
        }else if(index <= 0){
            index = imageCount;
        }
        removeTransition(); //清除过渡
        setTranslateX(-index * width);  //定位
        setPoint(); //设置底部显示当前图片对应的圆角
    });

    //改变当前样式  当前图片的索引
    var setPoint = function(){
        //清除上一次的now
        for(var i = 0 ; i < points.length ; i++){
            points[i].className = " ";
        }
        //给图片对应的点加上样式
        points[index-1].className = "now";
    }

    /*
     手指滑动的时候让轮播图滑动   touch事件  记录坐标轴的改变 改变轮播图的定位(位移css3)
     当滑动的距离不超过一定的距离的时候  需要吸附回去  过渡的形式去做
     当滑动超过了一定的距离  需要 跳到 下一张或者上一张  (滑动的方向) 一定的距离(屏幕的三分之一)
     */
    //touch事件
    var startX = 0; //记录起始  刚刚触摸的点的位置 x的坐标
    var moveX = 0;  //滑动的时候x的位置
    var distanceX = 0;  //滑动的距离
    var isMove = false; //是否滑动过

    imageBox.addEventListener('touchstart', function(e){
        clearInterval(timer);   //清除定时器
        startX = e.touches[0].clientX;  //记录起始X
    });

    imageBox.addEventListener('touchmove',function(e){
        moveX = e.touches[0].clientX;   //滑动时候的X
        distanceX = moveX - startX; //计算移动的距离
        //计算当前定位  -index*width+distanceX
        removeTransition(); //清除过渡
        setTranslateX(-index * width + distanceX);  //实时的定位
        isMove = true;  //证明滑动过
    });

    //在模拟器上模拟的滑动会有问题 丢失的情况  最后在模拟器的时候用window
    imageBox.addEventListener('touchend', function(e){
        // 滑动超过 1/3 即为滑动有效,否则即为无效,则吸附回去
        if(isMove && Math.abs(distanceX) > width/3){
            //5.当滑动超过了一定的距离  需要 跳到 下一张或者上一张  (滑动的方向)*/
            if(distanceX > 0){  //上一张
                index --;
            }
            else{   //下一张
                index ++;
            }
        }
        addTransition();    //加过渡动画
        setTranslateX(-index * width);    //定位

        if(index > imageCount ){
            index = 1;
        }else if(index <= 0){
            index = imageCount;
        }
        setPoint();

        //重置参数
        startX = 0;
        moveX = 0;
        distanceX = 0;
        isMove = false;
        //加定时器
        clearInterval(timer);   //严谨 再清除一次定时器
        timer= setInterval(function(){
            index++ ;  //自动轮播到下一张
            addTransition();    //加过渡动画
            setTranslateX(-index * width);    //定位
        },data.autoTime);
    });
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值