欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

原生js实现轮播图之无缝滚动代码实现教程

程序员文章站 2022-05-11 07:57:52
前言:轮播图,是网站首页中最常见的一种图片切换特效,作为者,我相信很多开发者都直接调用了jquery中的封装好的方法实现图片轮播,省事简单。所以我今天想介绍一下原生js代码实现的图...

前言:轮播图,是网站首页中最常见的一种图片切换特效,作为者,我相信很多开发者都直接调用了jquery中的封装好的方法实现图片轮播,省事简单。所以我今天想介绍一下原生js代码实现的图片轮播。

结构部分

html部分

<body>
    <!--展示窗口-->
  <p class="show_box">
    <!--轮播图图片-->
    <p class="pic_box">
      <p class="pic">
        <img src="images/1.jpg" alt=""/>
      </p>
      <p class="pic">
        <img src="images/2.jpg" alt=""/>
      </p>
      <p class="pic">
        <img src="images/3.jpg" alt=""/>
      </p>
      <p class="pic">
        <img src="images/4.jpg" alt=""/>
      </p>
      <p class="pic">
        <img src="images/5.jpg" alt=""/>
      </p>
      <p class="pic">
        <img src="images/6.jpg" alt=""/>
      </p>
      <p class="pic">
        <img src="images/1.jpg" alt=""/>
      </p>
      <p class="pic">
        <img src="images/2.jpg" alt=""/>
      </p>
      <p class="pic">
        <img src="images/3.jpg" alt=""/>
      </p>
    </p>
    <!-- 轮播左侧按钮-->
    <p class="leftbtn btn">&lt;</p>
    <!-- 轮播右侧按钮-->
    <p class="rightbtn btn">&gt;</p>
  </p>
</body>

css部分

<style>
    * {
      margin: 0;
      padding: 0;
    }
    .show_box {
      margin: 100px auto;
      height: 300px;
      width: 900px;
      position: relative;
      border: 10px dotted blue;
      overflow: hidden;
    }
    .pic_box {
      position: absolute;
      width: 3600px;
    }
    .pic {
      float: left;
    }
    .leftbtn,.rightbtn {
      width: 50px;
      height: 50px;
      border-radius: 25px;
      background-color: #333;
      position: absolute;
      text-align: center;
      line-height: 50px;
      color: #fff;
      font-size: 25px;
      top: 50%;
      margin-top: -25px;
      cursor: pointer;
    }
    .leftbtn {
      left: 10px;
    }
    .rightbtn {
      right: 10px;
    }
  </style>

注:图片宽高都为300px

结构很简单,一个展示图片的大盒子(相对定位,设置overflow:hidden),里面放存放图片的大盒子(绝对定位),再里面:图片盒子左浮动,为了实现无缝轮播的效果,这里将前三个图片复制一份加到最后一个图片的后面。结构部分不设置溢出隐藏效果如下图:

原生js实现轮播图之无缝滚动代码实现教程

js部分:

先传入上次教程封装好的动画函数

function getstylevalue(node,attr){
  var stylenode;
  if(node.currentstyle==undefined){
    stylenode = getcomputedstyle(node,null);
  }else{
    stylenode = node.currentstyle;
  }
  return stylenode[attr];
}
function animate(node,obj,speed,fn){
  clearinterval(node.num);
  node.num = setinterval(function(){
    var flag = true;
    for(var key in obj){
      var v = parseint(getstylevalue(node,key));
      if(v!=obj[key]){
        flag = false;
      }
      var step = (obj[key]-v)/20;
      if(step>0){
        step = math.ceil(step);
      }else if(step<0){
        step = math.floor(step);
      }
      var v2 = v + step;
      node.style[key] = v2 + 'px';
    }
    if(flag){
      clearinterval(node.num);
      if(fn!=undefined){
        fn();
      }
    }
  },speed);
}

右按钮

原生js实现轮播图之无缝滚动代码实现教程

尾部无缝原理图解

原生js实现轮播图之无缝滚动代码实现教程

//用全局变量index接收当前的下标,后期如需做分页器更方便使用。
    var index = 0;
    //lock开关锁思想: 防止用户快速点击按钮,出现动画未结束就进行下一个动画,以致轮播出现混乱。
    var lock = true;
    rightbtnnode.onclick = function(){
      if(lock){
        lock = false;
        index++;
        var targetvalue = index * -300;
        //用第三方变量temp接收index的值
        var temp = index;
        if(index==6){
          index = 0;
        }
        animate(pic_boxnode,{left:targetvalue},10,function(){
          if(temp==6){
            //判断:当图片动画运动到最后尾部的时候,立马将图片不以动画的方式(闪现到开始位置。)
            pic_boxnode.style.left = 0 + 'px';
          }
          //最后一步:将lock赋值true;将锁打开
          lock = true;
        });
      }
    };

左按钮

原生js实现轮播图之无缝滚动代码实现教程

leftbtnnode.onclick = function(){
      if(lock){
        lock = false;
        index--;
        if(index<0){
          index = 5;
          //判断:当图片动画运动到最后头部开始位置的时候,立马将图片不以动画的方式(闪现到尾部最后的位置。)
          pic_boxnode.style.left = 6 * -300 + 'px';
        }
        var targetvalue = index * -300;
        var temp = index;
        animate(pic_boxnode,{left:targetvalue},10,function(){
          lock = true;
        });
      }
    };

自动轮播功能实现

//下面为鼠标进出显示盒子设置是否自动播放
    show_boxnode.onmouseenter = function(){
      clearinterval(flag)
    };
    show_boxnode.onmouseleave = function(){
      autoplay();
    };
    var flag;
    function autoplay(){
      flag = setinterval(function(){
        rightbtnnode.onclick();
      },2000);
    }
    autoplay();

总结

就这样一个简单的无缝滚动就这样实现了!

主要逻辑点:无缝滚动的原理,①结构处负责前几个图片到尾部②轮播到首尾部时的闪现和动画函数的处理。

以上就是这篇文章的所有内容了,希望本文对大家的学习或工作上能带来一点帮助,如果有疑问,大家可以留言交流;小编水平有限,还请各位同行前辈多多斧正。