原生JS-实现无限图片轮播

实现思路:

一、布局部分:

1、采用div>ul>li>img布局,来展示轮播的图片banner;
2、采用div>>ul>li>a标签,来显示小红点;
整个布局入下图所示:途中的,图中的第一个li和最后一个li标签是用来做动画过渡时使用,就不会产生空白抖动的情况,这个两个图,暂时称之为“站位图”


二、JS代码部分

1、先处理好左右(上一张,下一张)两个按钮的点击事件,点击之后,能够正常的切换当前图片;
2、在图片切换之后,控制相对应的圆点标签,高亮显示当前图片对应的圆点;
3、在1中的切换图片里面添加动画效果;
4、开启轮播定时器,每隔两秒执行一次,调用“下一张按钮”的onclick;
5、如果当前轮播定时器或者动画效果定时器正在执行,点击了“下一张按钮”,会产生时间冲突,所以在,每次点击“下一张/上一张按钮”的时候,清掉所有的动画,并且让当前索引的图片完整的(沾满整个屏幕),显示在界面上
6、给圆点标签,添加onmouseover和out事件;

实现部分:

1、html文件:

<html lang="en">
<head>
     <meta charset="UTF-8">
     <title>Document</title>
     <style type="text/css">
          ul{
               margin: 0px;
               padding: 0px;
          }
          ul li{
               float: left;
               list-style: none;
               margin: 0px;
               padding: 0px;
          }
          a{
               margin: 0px;
               padding: 0px;
          }    
          #wrapper{
               margin: 0 auto;
               width: 1280px;
               height: 800px;
             position: relative;
          }
          #imgs{
               width: 1280px;
               height: 100%;
               overflow: hidden;
               float: left;
               position: relative;
          }
          #imgs ul{
             position: absolute;
            z-index: 1;
            width: 7680px;
            height: 400px;
            left: -1280px;
          }
          #nav{
               width: 100px;
               height: 20px;
               float: left;
               position: absolute;
               right: 10px;
               bottom: 10px;
               z-index: 5;
          }
           #nav ul li a{
               width: 20px;
               height: 20px;
               line-height: 20px;
               display: inline-block;
               background: #FFF;
               border-radius: 10px;
               margin-right: 5px;
               text-align: center;
               font-size: 12px;
          }
          #preous,#next{
               width: 100px;
               background: #000;
               font-size: 20px;
               font-weight: 900;
               text-align: center;
               height: 80px;
              line-height: 80px;
               position: absolute;
               top: 50%;
               color: #FFF;
               z-index: 3;
          }
          #preous{
               left: 0px;
          }
          #next{
               right: 0px;
          }
          #nav ul li a.current{
               background: red;
              color: #FFF;
          }
          #nav ul li a.hidden{
               background: #FFF;
               color: #000;
          }   
     </style>
</head>
<body>
     <div id="wrapper">
          <div id="imgs">
               <ul>
                    <li><a href=""><img src="../image/4.jpg" alt=""></a></li>
                    <li><a href=""><img src="../image/1.jpg" alt=""></a></li>
                    <li><a href=""><img src="../image/2.jpg" alt=""></a></li>
                    <li><a href=""><img src="../image/3.jpg" alt=""></a></li>
                    <li><a href=""><img src="../image/4.jpg" alt=""></a></li>
                    <li><a href=""><img src="../image/1.jpg" alt=""></a></li>
               </ul>
          </div>
          <div class="clear"></div>
          <div id="nav">
              <ul>
                    <li><a class="current">1</a></li>
                   <li><a>2</a></li>
                    <li><a>3</a></li>
                    <li><a>4</a></li>
               </ul>
          </div>
          <div id="preous"><</div>
          <div id="next">></div>
     </div>
</body>
</html>

在静态页当中,需要注意:
1、给图片轮播的ul外层的div标签,设置为一张图片的宽度(我这是1280px),并且设置溢出的不显示
2、给图片轮播的ul标签的宽度必须为li标签的总数每张的宽度(我这是61280)
3、圆点标签的div,设置的z-index必须必图片轮播的div优先级要高

二、JS业务逻辑部分

获取到所有需要操作的对象

   获取到所有需要操作的对象
         var imgs_div=document.getElementById("imgs");
          var nav_div=document.getElementById("nav");
          //获取到图片轮播的ul对象数组
          var imgsUl=imgs_div.getElementsByTagName("ul")[0];
          //获取到远点的ul对象数组
          var nav=nav_div.getElementsByTagName("ul")[0];
          //上一个
          var prious=document.getElementById("preous");
          //下一个
          var next =document.getElementById("next");

1、先处理好左右(上一张,下一张)两个按钮的点击事件,点击之后,能够正常的切换当前图片;

     prious.onclick=function(){
          //上一张,图片需要向右移动,(X轴正轴方向),所以加1280
          var offset=parseInt(imgsUl.offsetLeft)+1280;
          imgsUl.style.left=offset+"px";
     }
     next.onclick=function(){
          //下一张,图片像左移动,(X轴负轴方向),所以减1280
          var offset=parseInt(imgsUl.offsetLeft)-1280;
          imgsUl.style.left=offset+"px";
     }

如图所示:当前在用户界面上可见的为li的第一张图,如果我点击了“下一个”, 那么整个ul标签需要像左滑动一个图片宽度的单位(1280px),于是成了下图:


2、在图片切换之后,控制相对应的圆点标签,高亮显示当前图片对应的圆点:
这里封装一个函数,首先让圆点li标签的所有class都变成hidden, 然后在通过传进来的下标在减去1,则是当前可见的li标签:

 var index=1;//表示默认当前就是展示的第一张图片
         prious.onclick=function(){
               //上一张,图片需要向右移动,(X轴正轴方向),所以加1280
               var offset=parseInt(imgsUl.offsetLeft)+1280;
               imgsUl.style.left=offset+"px";
               //这里需要判断当前的下标是否小于1,小于了,则说明现在当前是第一张图片,再返回,就是要到第四张图片,让index=4,每次点击之后让index的值减1
               if(index<1){
                    index=4;
               }
                index-=1; 
               btnShow(index);
           }
           next.onclick=function(){
               //下一张,图片像左移动,(X轴负轴方向),所以减1280
               var offset=parseInt(imgsUl.offsetLeft)-1280;
               imgsUl.style.left=offset+"px";
               //这里需要判断当前的下标是否大于4,大于了,则说明现在当前是第四张图片,再返下一张,就是要到第一张图片,让index=1,每次点击之后让index的值+1
               if(index>4){
                    index=1;
               }
               index+=1;
               btnShow(index);               
          }
            function btnShow(cur_index){
               var list=nav.children;
               for(var i=0;i<nav.children.length;i++){
                    nav.children[i].children[0].className="hidden";
               }
               nav.children[cur_index-1].children[0].className="current";
          }

3、在1中的切换图片里面添加动画效果:
在animate函数中,对newLeft(总偏移量)进行判断,如果大于-1280px;说明当前展示的是第一张图片,现在需要改成展示第四张图片,(第四张图片的left值为-1280*4 px);
如果小于-5120px,说明当前展示的是第四张图片,现在需要改成展示第一张图片(第一张图片的left值为:-1280px);

  var animTimer;
               prious.onclick=function(){
               index-=1;
               if(index<1){
                    index=4;
               }
               animate(1280);
               btnShow(index);
          }
          next.onclick=function(){
               initImgs(index);
               index+=1;
               if(index>4){
                    index=1;
               }
               animate(-1280);
               btnShow(index);
          }
          function animate(offset){
               var newLeft=parseInt(imgsUl.offsetLeft)+offset;
               if(newLeft>-1280){
                    donghua(-5120);    
               }else if(newLeft<-5120){
                    donghua(-1280);    
               }else{
                    donghua(newLeft);
               }
          }
          function donghua(offset){
               clearInterval(animTimer);
               animTimer=setInterval(function(){
                    //动画原理: 盒子本身的位置 + 步长
                    imgsUl.style.left=imgsUl.offsetLeft+(offset-imgsUl.offsetLeft)/10 + "px";
                     //因为采用的动画原理计算方法,得到的值不可能精确到我们需要偏移的像素单位上,所以我这里判断,在还有20px的时候,就让动画停止。
                    if(imgsUl.offsetLeft-offset<10&&imgsUl.offsetLeft-offset>-10){
                         imgsUl.style.left=offset+"px";
                         clearInterval(animTimer);        
                    }
               },20);
          }

4、开启轮播定时器,每隔两秒执行一次,调用“下一张按钮”的onclick; ```
var timer;
function play(){
timer=setInterval(function(){
next.onclick();
},2000)
}


>5、如果当前轮播定时器或者动画效果定时器正在执行,点击了“下一张按钮”,会产生时间冲突,所以在,每次点击“下一张/上一张按钮”的时候,清掉所有的动画,并且让当前索引的图片完整的(沾满整个屏幕),显示在界面上 
//其中cur_index,表示是当前图片的index值;
      function initImgs(cur_index){
           clearInterval(timer);
           clearInterval(animTimer);
           var off=cur_index*1280;
           imgsUl.style.left=-off+"px";
      }

>6、给圆点标签,添加onmouseover和out事件; 
          在onmouseover中,因为圆点标签的下标是从0开始的, 而图片轮播的下标的第一张图,我们在开始的时候默认定义为1,所以在调用其他函数的时候,传递过去的i+1
 for(var i=0;i<nav.children.length;i++){
           nav.children[i].index=i;
           var sd=nav.children[i].index;
           nav.children[i].onmouseover=function(){
               var now_index=this.index;
                //这里很重要,要让当前的图片的index的值等于鼠标选中的图片 
                index=this.index+1;
                initImgs(this.index+1);
                btnShow(this.index+1);
          }
           nav.children[i].onmouseout=function(){
                play();
           }
      }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生x阅读 15,967评论 3 119
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,406评论 1 45
  • 轮播呢,也是各种网站上常见的一种展示效果,这里我来写一写实现轮播的一些简单方法。//不知道为什么系统吃了代码里面的...
    zkhChris阅读 35,608评论 3 140
  • 轮播原生js封装 总共四个部分 标题 *{ margin:0; padding:0; } ul{ list-sty...
    小耗子不吃药阅读 219评论 0 0
  • 随着网络的普及和通讯设施的平民化,微信上几乎每天都被各种招代理的微商刷屏,她们以某某人逆袭成功的人生经历做演讲,讲...
    白墨迹阅读 427评论 0 4