原生JS兼容移动端的轮播图

关于轮播图 :

  • 原生JS
  • 兼容IE9+等各大浏览器
  • 兼容移动端
  • 自适应(根据图片原比例)
  • 左右箭头切换
  • 点击索引切换
  • 移动端滑动切换
  • 只需修改图片路径
    在这里插入图片描述
<div class="carousel">
 <div id="banner">
   <ul class="clearfix slide">
     <li><a href="#"><img src="images/1.jpg"><span>1</span></a></li>
     <li><a href="#"><img src="images/2.jpg"><span>2</span></a></li>
     <li><a href="#"><img src="images/3.jpg"><span>3</span></a></li>
     <li><a href="#"><img src="images/4.jpg"><span>4</span></a></li>
     <li><a href="#"><img src="images/5.jpg"><span>5</span></a></li>
     <li><a href="#"><img src="images/6.jpg"><span>6</span></a></li>
     <li><a href="#"><img src="images/7.jpg"><span>7</span></a></li>
     <li><a href="#"><img src="images/8.jpg"><span>8</span></a></li>
   </ul>
   <!--左右切换箭头-->
   <span class="switchBtn" id="prevBtn"><img src="images/arrow.png" class="prevArrow" alt=""></span>
   <span class="switchBtn" id="nextBtn"><img src="images/arrow.png" class="nextArrow" alt=""></span>
   <!--轮播索引的点-->
   <ul class="ctrl"></ul>
 </div>
</div>
    var banner = document.getElementById('banner');//轮播盒子
    var width = banner.offsetWidth;
    var imageBox = banner.querySelector('ul.slide');
    var imageCount = imageBox.querySelectorAll('li').length; //图片张数
    var pointBox = banner.querySelector('ul.ctrl');//点盒子
    var prevBtn = document.getElementById("prevBtn"); //向左按钮
    var nextBtn = document.getElementById("nextBtn"); //向右按钮

    var index = 1; //默认开始的图片位置
    var moveSpeed = 2000;//轮播速度
    //动态添加索引
    for(var i = 0;i<imageCount;i++){
      var li = document.createElement("li");
      pointBox.appendChild(li);
      if(i == 0){
        //默认第一个点高亮
        li.className="now"
      }
    }
    var points = pointBox.querySelectorAll('li');//所有的点

  //在第一张前面添加最后一张,最后一张后面添加第一张,防止切换到首尾时出现空白
    var slideFirst = imageBox.querySelector('li:first-child');
    var newLast = slideFirst.cloneNode(true);//复制第一张
    imageBox.appendChild(newLast);//在最后面添加第一张
    var slideLast = imageBox.querySelector('li:nth-last-of-type(2)');//最后一张图片,此时已经在最后面添加了第一张
    var newFirst = slideLast.cloneNode(true);//复制最后一张
    prependChild(imageBox,newFirst);//在最前添加最后一张

    //在最前添加最后一张的方法
    function prependChild(parent,newChild){
      if(parent.firstChild){
        parent.insertBefore(newChild,parent.firstChild);
      } else {
        parent.appendChild(newChild);
      }
      return parent;
    }
    //加过渡
    var addTransition = function(){
      imageBox.style.transition = "all 0.3s";
      imageBox.style.oTransition = "all 0.3s";
      imageBox.style.msTransition = "all 0.3s";
      imageBox.style.mozTransition = "all 0.3s";
      imageBox.style.webkitTransition = "all 0.3s";
    };
    //清除过渡
    var removeTransition = function(){
      imageBox.style.transition = "none";
      imageBox.style.oTransition = "none";
      imageBox.style.msTransition = "none";
      imageBox.style.mozTransition = "none";
      imageBox.style.webkitTransition = "none";
    };
    //定位
    var setTranslateX = function(translateX){
      imageBox.style.transform = "translateX("+translateX+"px)";
      imageBox.style.oTransform = "translateX("+translateX+"px)";
      imageBox.style.msTransform = "translateX("+translateX+"px)";
      imageBox.style.mozTransform = "translateX("+translateX+"px)";
      imageBox.style.webkitTransform = "translateX("+translateX+"px)";
    };

//    判断是否动画结束
    function transitionEnd(dom,callback){
      if(!dom || typeof dom != 'object'){
        return false;
      }
      dom.addEventListener('transitionend', function(){
        callback && callback();
      });
      dom.addEventListener('transitionEnd', function(){
        callback && callback();
      });
      dom.addEventListener('oTransitionEnd', function(){
        callback && callback();
      });
      dom.addEventListener('msTransitionEnd', function(){
        callback && callback();
      });
      dom.addEventListener('mozTransitionEnd', function(){
        callback && callback();
      });
      dom.addEventListener('webkitTransitionEnd', function(){
        callback && callback();
      });
    }
    var timer = null;
//    轮播动画
    function  setTime(){
      timer = setInterval(function(){
        index ++;
        addTransition();
        setTranslateX(-index * width);
        transitionEnd(imageBox,function(){
          if(index == imageCount){
            removeTransition();
            index = 0;
            setTranslateX(-index * width);
          }
        });
        setPoint();
      },moveSpeed);
    }
    setTime();

    //当前图片对应的点高亮
    var setPoint = function(){
      for(var i = 0 ; i < points.length ; i++){
        points[i].className = " ";
      }
      if(index == 0){
        points[imageCount-1].className = "now";
      }
      if(index == imageCount+1){
        points[0].className = "now";
      }
      if(index <= imageCount){
        points[index-1].className = "now";
      }
    };

    //touch事件
    var startX = 0; //记录起始x的坐标
    var moveX = 0;  //滑动的时候x的位置
    var distanceX = 0;  //滑动的距离
    var isMove = false; //是否滑动过
    imageBox.addEventListener('touchstart', function(e){
      startX = e.touches[0].clientX;  //记录起始X
    });
    imageBox.addEventListener('touchmove',function(e){
      moveX = e.touches[0].clientX;   //滑动时候的X
      distanceX = moveX - startX; //计算移动的距离
      removeTransition();
      clearInterval(timer);
      setTranslateX(-index * width + distanceX);  //实时的定位
      isMove = true;
    });
    imageBox.addEventListener('touchend', function(e){
      // 滑动超过 1/3 即为滑动有效,否则即为无效,则吸附回去
      setTime();//避免滑过1/3 又手动划回去而导致轮播结束
      if(isMove && Math.abs(distanceX) > width/3){
        clearInterval(timer);
        //滑动有效时
        if(distanceX > 0){
          //上一张
          prevBtn.click();
        }
        else{
          //下一张
          nextBtn.click();
        }
      }
      addTransition();
      setTranslateX(-index * width);
      setPoint();
      //重置参数
      startX = 0;
      moveX = 0;
      distanceX = 0;
      isMove = false;
    });

    //  左右箭头的切换
    var flag = true;//防止快速点击,需在动画结束后可再次点击
    //  左点击
    prevBtn.onclick = function(){
      if(flag){
        flag = false;
        clearInterval(timer);
        index --;
        addTransition();
        setTranslateX(-index * width);
        transitionEnd(imageBox,function(){
          flag = true; // 可再次点击
          if(index == 0){
            removeTransition();
            index = imageCount;
            setTranslateX(-index * width);
          }
        });
        /**/
        setTimeout(function(){
          setTime();
          setPoint();
        },300);
      }
    };
    //  右点击
    nextBtn.onclick = function(){
      if(flag){
        flag = false;
        clearInterval(timer);
        index ++;
        addTransition();
        setTranslateX(-index * width);
        transitionEnd(imageBox,function(){
          flag = true;//可再次点击
          if(index == imageCount+1){
            removeTransition();
            index = 1;
            setTranslateX(-index * width);
          }
        });
        setTimeout(function(){
          setTime();
          setPoint();
        },300);
      }
    };

    //  点击索引的点
    var ctrl = document.getElementsByClassName("ctrl")[0];
    var ctrlLi = ctrl.querySelectorAll("li");
      for (var i = 0;i < ctrlLi.length; i++) {
        ctrlLi[i].index = i;
        ctrlLi[i].onclick=function(){
          clearInterval(timer);
          index = this.index + 1;
          addTransition();
          setTranslateX(-index * width);
          setPoint();
          setTime();
        }
      }
  };

预览地址:https://bestjhh.github.io/slider/
完整代码:https://github.com/bestjhh/slider

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值