JS 无缝轮播图1-节点操作

无缝轮播图

(使用节点操作)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
  <style>
    *{
      padding:0;
      margin:0;
    }
    body{
      background:#F5F5F5;
    }
    #content{
      width:300px;
      height:200px;
      background:#fff;
      margin:50px auto;
      position: relative;
      overflow:hidden;
    }
    #divs{
      width:1200px;
      height:100%;
      position: absolute;
    }
    #divs>div{
      width:300px;
      height:100%;
      float:left;
      text-align:center;
      line-height:200px;
      font-size:30px;
    }
    #lis{
      list-style: none;
      position: absolute;
      right:10px;
      bottom:10px;
    }
    #lis>li{
      width:30px;
      height:30px;
      background: #ccc;
      border-radius:30px;
      float:left;
      margin:0 6px;
      text-align: center;
      line-height: 30px;
    }
    #btns{
      width:100%;
      height:30px;
      position: absolute;
      top:50%;
      left:0;
      margin-top:-15px;
    }
    #btns>div{
      width:30px;
      height:50px;
      background:rgba(0,0,0,.4);
      float:left;
      text-align: center;
      line-height:50px;
      font-size:22px;
      font-weight: 300;
    }
    #btns>div:last-child{
      float:right;
    }
  </style>
</head>
<body>
  <div id="content">
    <div id="divs">
      <div style="background: red">1</div>
      <div style="background: green">2</div>
      <div style="background: blue">3</div>
      <div style="background: yellow">4</div>
    </div>
    <ul id="lis">
      <li style="background:black;color:#ccc">1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
    </ul>
    <div id="btns">
      <div id="prev">&lt;</div>
      <div id="last">&gt;</div>
    </div>
  </div>
</body>
<!-- 引入封装好的运动函数 -->
<script src="./run.js"></script>
<script>
  //整个轮播图
  var content=document.getElementById(‘content‘);
  //轮播图区域
  var box=document.getElementById(‘divs‘);
  //轮播图各个滑动对象
  var divs=document.getElementById(‘divs‘).getElementsByTagName(‘div‘);
  //对应每个滑动对象的按钮
  var lis=document.getElementById(‘lis‘).getElementsByTagName(‘li‘);
  //左prev(上一张) 右last(下一张)按钮
  var prev=document.getElementById(‘prev‘);
  var last=document.getElementById(‘last‘);
  // 按钮下标  上一张==>num--  下一张==>num++
  var num=0;

  //开关作用:当滑动对象未滑完不允许点击其他
  var istrue=true;

  //下一张 滑动==>封装函数
  function move(){
    //点击 if 成立 后 istrue 取反 ==> 开关作用
    if(istrue){
      //关闭开关
      istrue=false;

      //下一张+1,超过总数回0
      num++;
      if(num==lis.length){
        num=0;
      }

      //当前滑块 对应 相应按钮 使其显色
      for(var i=0;i<lis.length;i++){
        lis[i].style.background="#ccc";
        lis[i].style.color=‘black‘;
      }
      lis[num].style.background="black";
      lis[num].style.color=‘#ccc‘;

      //复制当前即(第一张)添加到所有滑块最后
      var newNode=divs[0].cloneNode(true);
      box.appendChild(newNode);

      //调用运动函数 run(运动对象[轮播图区域],运动目标,回调函数[运动完后...])
      run(box,-300,function(isok){
        // console.log(`我拿到了定时器结束的时候返回的随机值${isok}`);
        // 当到达目标后停止滑动
        if(isok){
          //打开开关
          istrue=true;
          //删除第一个子节点
          box.removeChild(divs[0]);
          //且让轮播图区域的left回原点0
          box.style.left=0;
        }
      });
    }

  };

  //点击下一张
  last.onclick=move;
  //自动轮播下一张
  var timer1=setInterval(move,2000);
  //移入整个轮播图时 停止轮播==>清除定时器
  content.onmouseover=function(){
    clearInterval(timer1);
  }
  //移出整个轮播图时 开始轮播==>开启定时器
  content.onmouseout=function(){
    timer1=setInterval(move,2000);
  }

  //点击上一张
  prev.onclick=function(){

    if(istrue){
      //关闭开关
      istrue=false;

      //点击上一张-1,当等于-1时,回到最后一张==> divs长度-1
      num--;
      if(num==-1){
        num=divs.length-1;
      }

      //当前滑块 对应 相应按钮 使其显色
      for(var i=0;i<lis.length;i++){
        lis[i].style.background="#ccc";
        lis[i].style.color=‘black‘;
      }
      lis[num].style.background="black";
      lis[num].style.color=‘#ccc‘;

      //复制最后一张,添加到第一个滑块之前
      var newNode=divs[divs.length-1].cloneNode(true);
      box.insertBefore(newNode,divs[0]);

      //运动前先把box整个轮播图往左边一个滑块大小,给接下来的滑动做好准备
      box.style.left=‘-300px‘;
      //调用运动函数 run(运动对象[轮播图区域],运动目标,回调函数[运动完后...])
      run(box,0,function(isok){
        if(isok){
          //删除最后一个子节点,记得此时比原来多一张
          box.removeChild(divs[divs.length-1]);
          //打开开关
          istrue=true;
        }
      });
    }

  }

  //对应每个滑动对象的按钮 绑定点击事件
  for(var i=0;i<lis.length;i++){
    //给每个按钮添加索引
    lis[i].index=i;

    lis[i].onclick=function(){
      //获取 当前点击索引this.index 减去 点击前滑块或按钮的下标num 得到 间隔数量tap
      var tap=this.index - num;

      //如果间隔数tap大于等于0,说明是往下(右)tap张走
      if(tap>=0){
        //打开开关
        if(istrue){
          //关闭开关
          istrue=false;
          //把 当前点击的索引值this.index 赋给替换 当前的下标num
          num=this.index;

          //当前滑块 对应 相应按钮 使其显色
          for(var i=0;i<lis.length;i++){
            lis[i].style.background="#ccc";
            lis[i].style.color=‘black‘;
          }
          lis[num].style.background="black";
          lis[num].style.color=‘#ccc‘;

          //复制tap张(从当前即下标0开始)添加到所有滑块最后
          for(var i=0;i<tap;i++){
            var newNode=divs[i].cloneNode(true);
            box.appendChild(newNode);
          }
//调用运动函数 run(运动对象[轮播图区域],运动目标,回调函数[运动完后...])
//运动目标 = 每个滑块宽度 * tap间隔数
          run(box,-300*tap,function(isok){
            // console.log(`我拿到了定时器结束的时候返回的随机值${isok}`);
            // 当到达目标后停止滑动
            if(isok){
              //打开开关
              istrue=true;
              //删除tap次第一个子节点
              //(删除完一个,下一个下标也变成0,所以依然删除下标0的节点)
              for(var j=0;j<tap;j++){
                box.removeChild(divs[0]);
              }
              //且让轮播图区域的left回原点0
              box.style.left=0;
            }
          });
        }
      }else{
        //否则,如果间隔数tap小于0,说明是往上(左)tap张走
        //打开开关
        if(istrue){
          //关闭开关
          istrue=false;
          //把 当前点击的索引值this.index 赋给替换 当前的下标num
          num=this.index;

          //当前滑块 对应 相应按钮 使其显色
          for(var i=0;i<lis.length;i++){
            lis[i].style.background="#ccc";
            lis[i].style.color=‘black‘;
          }
          lis[num].style.background="black";
          lis[num].style.color=‘#ccc‘;

          //复制tap张(从最后一个子节点开始复制divs.length-1-i)添加到第一个滑块之前
          //
          // console.log(‘legnht:‘+divs.length);
          for(var i=0;i<Math.abs(tap);i++){
            var n=divs.length-1-i;
            var newNode=divs[n].cloneNode(true);
            box.insertBefore(newNode,divs[0]);
          }
          //运动前先把box整个轮播图往左边一个滑块*tap大小,给接下来的滑动做好准备
          box.style.left=(-300*Math.abs(tap))+‘px‘;

          //调用运动函数 run(运动对象[轮播图区域],运动目标,回调函数[运动完后...])
          run(box,0,function(isok){
            if(isok){
              //删除tap次最后一个子节点,记得此时比原来多一张
              for(var i=0;i<Math.abs(tap);i++){
                var n=divs.length-1;
                box.removeChild(divs[n]);
              }
              //打开开关
              istrue=true;
            }
          });

        }
      }

    }
  }

</script>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
  <style>
    *{
      padding:0;
      margin:0;
    }
    body{
      background:#F5F5F5;
    }
    #content{
      width:300px;
      height:200px;
      background:#fff;
      margin:50px auto;
      position: relative;
      overflow:hidden;
    }
    #divs{
      width:1200px;
      height:100%;
      position: absolute;
    }
    #divs>div{
      width:300px;
      height:100%;
      float:left;
      text-align:center;
      line-height:200px;
      font-size:30px;
    }
    #lis{
      list-style: none;
      position: absolute;
      right:10px;
      bottom:10px;
    }
    #lis>li{
      width:30px;
      height:30px;
      background: #ccc;
      border-radius:30px;
      float:left;
      margin:0 6px;
      text-align: center;
      line-height: 30px;
    }
    #btns{
      width:100%;
      height:30px;
      position: absolute;
      top:50%;
      left:0;
      margin-top:-15px;
    }
    #btns>div{
      width:30px;
      height:50px;
      background:rgba(0,0,0,.4);
      float:left;
      text-align: center;
      line-height:50px;
      font-size:22px;
      font-weight: 300;
    }
    #btns>div:last-child{
      float:right;
    }
  </style>
</head>
<body>
  <div id="content">
    <div id="divs">
      <div style="background: red">1</div>
      <div style="background: green">2</div>
      <div style="background: blue">3</div>
      <div style="background: yellow">4</div>
    </div>
    <ul id="lis">
      <li style="background:black;color:#ccc">1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
    </ul>
    <div id="btns">
      <div id="prev">&lt;</div>
      <div id="last">&gt;</div>
    </div>
  </div>
</body>
<!-- 引入封装好的运动函数 -->
<script src="./run.js"></script>
<script>
  //整个轮播图
  var content=document.getElementById(‘content‘);
  //轮播图区域
  var box=document.getElementById(‘divs‘);
  //轮播图各个滑动对象
  var divs=document.getElementById(‘divs‘).getElementsByTagName(‘div‘);
  //对应每个滑动对象的按钮
  var lis=document.getElementById(‘lis‘).getElementsByTagName(‘li‘);
  //左prev(上一张) 右last(下一张)按钮
  var prev=document.getElementById(‘prev‘);
  var last=document.getElementById(‘last‘);
  // 按钮下标  上一张==>num--  下一张==>num++
  var num=0;

  //开关作用:当滑动对象未滑完不允许点击其他
  var istrue=true;

  //下一张 滑动==>封装函数
  function move(){
    //点击 if 成立 后 istrue 取反 ==> 开关作用
    if(istrue){
      //关闭开关
      istrue=false;

      //下一张+1,超过总数回0
      num++;
      if(num==lis.length){
        num=0;
      }

      //当前滑块 对应 相应按钮 使其显色
      for(var i=0;i<lis.length;i++){
        lis[i].style.background="#ccc";
        lis[i].style.color=‘black‘;
      }
      lis[num].style.background="black";
      lis[num].style.color=‘#ccc‘;

      //复制当前即(第一张)添加到所有滑块最后
      var newNode=divs[0].cloneNode(true);
      box.appendChild(newNode);

      //调用运动函数 run(运动对象[轮播图区域],运动目标,回调函数[运动完后...])
      run(box,-300,function(isok){
        // console.log(`我拿到了定时器结束的时候返回的随机值${isok}`);
        // 当到达目标后停止滑动
        if(isok){
          //打开开关
          istrue=true;
          //删除第一个子节点
          box.removeChild(divs[0]);
          //且让轮播图区域的left回原点0
          box.style.left=0;
        }
      });
    }

  };

  //点击下一张
  last.onclick=move;
  //自动轮播下一张
  var timer1=setInterval(move,2000);
  //移入整个轮播图时 停止轮播==>清除定时器
  content.onmouseover=function(){
    clearInterval(timer1);
  }
  //移出整个轮播图时 开始轮播==>开启定时器
  content.onmouseout=function(){
    timer1=setInterval(move,2000);
  }

  //点击上一张
  prev.onclick=function(){

    if(istrue){
      //关闭开关
      istrue=false;

      //点击上一张-1,当等于-1时,回到最后一张==> divs长度-1
      num--;
      if(num==-1){
        num=divs.length-1;
      }

      //当前滑块 对应 相应按钮 使其显色
      for(var i=0;i<lis.length;i++){
        lis[i].style.background="#ccc";
        lis[i].style.color=‘black‘;
      }
      lis[num].style.background="black";
      lis[num].style.color=‘#ccc‘;

      //复制最后一张,添加到第一个滑块之前
      var newNode=divs[divs.length-1].cloneNode(true);
      box.insertBefore(newNode,divs[0]);

      //运动前先把box整个轮播图往左边一个滑块大小,给接下来的滑动做好准备
      box.style.left=‘-300px‘;
      //调用运动函数 run(运动对象[轮播图区域],运动目标,回调函数[运动完后...])
      run(box,0,function(isok){
        if(isok){
          //删除最后一个子节点,记得此时比原来多一张
          box.removeChild(divs[divs.length-1]);
          //打开开关
          istrue=true;
        }
      });
    }

  }

  //对应每个滑动对象的按钮 绑定点击事件
  for(var i=0;i<lis.length;i++){
    //给每个按钮添加索引
    lis[i].index=i;

    lis[i].onclick=function(){
      //获取 当前点击索引this.index 减去 点击前滑块或按钮的下标num 得到 间隔数量tap
      var tap=this.index - num;

      //如果间隔数tap大于等于0,说明是往下(右)tap张走
      if(tap>=0){
        //打开开关
        if(istrue){
          //关闭开关
          istrue=false;
          //把 当前点击的索引值this.index 赋给替换 当前的下标num
          num=this.index;

          //当前滑块 对应 相应按钮 使其显色
          for(var i=0;i<lis.length;i++){
            lis[i].style.background="#ccc";
            lis[i].style.color=‘black‘;
          }
          lis[num].style.background="black";
          lis[num].style.color=‘#ccc‘;

          //复制tap张(从当前即下标0开始)添加到所有滑块最后
          for(var i=0;i<tap;i++){
            var newNode=divs[i].cloneNode(true);
            box.appendChild(newNode);
          }
//调用运动函数 run(运动对象[轮播图区域],运动目标,回调函数[运动完后...])
//运动目标 = 每个滑块宽度 * tap间隔数
          run(box,-300*tap,function(isok){
            // console.log(`我拿到了定时器结束的时候返回的随机值${isok}`);
            // 当到达目标后停止滑动
            if(isok){
              //打开开关
              istrue=true;
              //删除tap次第一个子节点
              //(删除完一个,下一个下标也变成0,所以依然删除下标0的节点)
              for(var j=0;j<tap;j++){
                box.removeChild(divs[0]);
              }
              //且让轮播图区域的left回原点0
              box.style.left=0;
            }
          });
        }
      }else{
        //否则,如果间隔数tap小于0,说明是往上(左)tap张走
        //打开开关
        if(istrue){
          //关闭开关
          istrue=false;
          //把 当前点击的索引值this.index 赋给替换 当前的下标num
          num=this.index;

          //当前滑块 对应 相应按钮 使其显色
          for(var i=0;i<lis.length;i++){
            lis[i].style.background="#ccc";
            lis[i].style.color=‘black‘;
          }
          lis[num].style.background="black";
          lis[num].style.color=‘#ccc‘;

          //复制tap张(从最后一个子节点开始复制divs.length-1-i)添加到第一个滑块之前
          //
          // console.log(‘legnht:‘+divs.length);
          for(var i=0;i<Math.abs(tap);i++){
            var n=divs.length-1-i;
            var newNode=divs[n].cloneNode(true);
            box.insertBefore(newNode,divs[0]);
          }
          //运动前先把box整个轮播图往左边一个滑块*tap大小,给接下来的滑动做好准备
          box.style.left=(-300*Math.abs(tap))+‘px‘;

          //调用运动函数 run(运动对象[轮播图区域],运动目标,回调函数[运动完后...])
          run(box,0,function(isok){
            if(isok){
              //删除tap次最后一个子节点,记得此时比原来多一张
              for(var i=0;i<Math.abs(tap);i++){
                var n=divs.length-1;
                box.removeChild(divs[n]);
              }
              //打开开关
              istrue=true;
            }
          });

        }
      }

    }
  }

</script>
</html>
var timer;

function run(obj,target,callback){
  timer=setInterval(function(){
    var speed=(target-obj.offsetLeft)/8;
    speed = speed > 0 ?  Math.ceil(speed) : Math.floor(speed);
    if(obj.offsetLeft == target ){
      clearInterval(timer);
      callback(true);
    }else{
      obj.style.left=speed+obj.offsetLeft+‘px‘;
      callback(false);
    }
  },30);
}

原文地址:https://www.cnblogs.com/xzsz/p/9550894.html

时间: 2025-01-16 04:41:48

JS 无缝轮播图1-节点操作的相关文章

原生JavaScript实现无缝轮播图

无缝轮播图是页面常用的特效之一,然而在实际的开发过程中,大部分的开发者都会使用插件来对轮播图进行开发,那么它的底层到底是怎么实现的呢,本文章将围绕这一问题展开探讨. 在讨论如何利用原生JS实现图片之间无缝切换轮播的动画效果之前,我们先来谈谈无缝轮播图片的css布局. 首先我们需要一个用来显示图片的DIV容器,然后把想要轮播的图片没有缝隙的排成一行放入DIV容器中,给DIV容器设置 overflow: hidden,这样在页面中就可以只看到一张图片,然后通过利用JS来移动ul的left值就能达到无

用原生js封装轮播图

原生js封装轮播图 对于初学js的同学来说,轮播图还是一个难点,尤其是原生js封装轮播图代码,下面是我之前做的一个轮播图项目中封装好的一些代码,有需要的同学可以看一下,有什么不懂的可以看注释,注释看不懂的可以直接私信我 slide.js /* * 轮播图 */ function Slide(elem, ms, d, ind){ this.el = elem; this.w = parseInt(getStyle(elem, "width")); this.h = parseInt(ge

原生js简单轮播图 代码

在团队带人,突然被人问到轮播图如何实现,进入前端领域有一年多了,但很久没自己写过,一直是用大牛写的插件,今天就写个简单的适合入门者学习的小教程.当然,轮播图的实现原理与设计模式有很多种,我这里讲的是用面向过程函数式编程去实现,相对于面向对象设计模式,代码难免会显得臃肿冗余.但没有面向对象的抽象却很适合新手理解与学习.已经在BAT的同学看到希望少喷点.另外可以多提意见. 轮播图的原理: 一系列的大小相等的图片平铺,利用CSS布局只显示一张图片,其余隐藏.通过计算偏移量利用定时器实现自动播放,或通过

左右无缝轮播图的实现

无缝轮播图: <title>无缝轮播图</title> <style> *{margin: 0;padding:0; } ul{list-style: none;} .banner{width: 600px;height: 300px;border: 2px solid #ccc;margin: 100px auto;position: relative;overflow: hidden;} .img{position: absolute;top: 0;left: 0}

js实现轮播图效果(附源码)--原生js的应用

1.js实现轮播图效果 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="Author" content="奇客艺术"> <meta name="keyword" content="关键字"> <meta name=

js实现轮播图

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>轮播图</title> 6 <style type="text/css"> 7 *{ 8 margin: 0; 9 padding:0; 10 } 11 .carousel{ 12 margin:0 aut

JS原生轮播图

哈喽!我的朋友们,最近有一个新项目.所以一直没更新!有没有想我啊!! 今天咱们来说一下JS原生轮播图! 话不多说: 直接来代码吧:下面是CSS部分: 1 *{ 2 padding: 0px; 3 margin: 0px; 4 } 5 img{ 6 width: 500px; 7 height: 300px; 8 } 9 li{ 10 float: left; 11 } 12 ul{ 13 width: 2000px; 14 list-style: none; 15 position: absol

js网站轮播图怎么做如何做?鸡哥教你简单制作效果炫酷

日了狗啦,刚刚鸡哥辛苦码了那么多字全丢了又要重新写,这是第二遍写了...今天鸡哥给小白写个不需要写js原生代码,只需要几个插件和一段通俗易懂得jquery代码就能搞定的轮播图,当然js原生代码写着也不算很繁琐,但是有些浪费时间,更何况很多人并不会用js直接写包括鸡哥,当年在学校还是研究过一段时间js的,当时还独自写了一个轮播图俘获了多少同班妹子的芳心,不过现在是基本废了,这东西要常写,不然忘的很快. 唉,本来还有妹子等着鸡哥呢,我这一大意文章丢了,重新写的话估计来不及了,先打个电话让妹子回家吧~

无缝轮播图的例子

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" type="text/css" href="css/lunbo.css"/> </head> <body> <div id="