纯原生javascript仿网易轮播图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了纯原生javascript仿网易轮播图相关的知识,希望对你有一定的参考价值。

    第一次有自己的关于代码的博客,感到诚惶诚恐。这可能是我第一次以程序猿,或者连初级程序猿都不是的身份下开通的个人“技术”(胡写乱写)博客园地。闲言碎语不要讲,咱今天就写一点关于js的代码吧。网易首页大家肯定都去过,在首页左侧部分有个轮播图,效果很好,构思精巧,非常诱人。注,此demo非本人原创,在这里进行个人解读,力求通俗易懂(主要是让我自己明白!)。

 

技术分享

     那么如何实现相关技术,进而实现如图效果呢?下面的进度条是用JQuery写的,这里暂不考虑。下面从三个方面讨论网一轮播图。

    一、html部分

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>网易轮播图</title>
 6         <link rel="stylesheet" href="css/index.css" />
 7         <script src="js/slider.js" type="text/javascript" charset="utf-8"></script>
 8         <script src="js/animate.js" type="text/javascript" charset="utf-8"></script>
 9     </head>
10     <body>
11         <div class="w-slider" id="js_slider">
12             <div class="slider">
13                 <div class="slider-main" id="slider_main_block">
14                     <div class="slider-main-img"><a href="#"><img src="images/1.jpg" alt=""/></a></div>
15                     <div class="slider-main-img"><a href="#"><img src="images/2.jpg" alt=""/></a></div>
16                     <div class="slider-main-img"><a href="#"><img src="images/3.jpg" alt=""/></a></div>
17                     <div class="slider-main-img"><a href="#"><img src="images/4.jpg" alt=""/></a></div>
18                     <div class="slider-main-img"><a href="#"><img src="images/5.jpg" alt=""/></a></div>
19                     <div class="slider-main-img"><a href="#"><img src="images/6.jpg" alt=""/></a></div>
20                 </div>
21             </div>
22             <div class="slider-ctrl" id="slider_ctrl">
23                 <span class="slider-ctrl-prev"></span>
24                 <span class="slider-ctrl-next"></span>
25             </div>
26         </div>
27     </body>
28 </html>

     技术交流:布局很有讲究。语义化是Html中非常重要的一个规则。比如图片上的箭头,应该单独分离出来,作为父亲盒子w-slider的一个子元素,它和上面的滚动部分应该是并列部分,属于两个不同的功能。

    二、CSS部分

 1 * {margin:0;padding:0; }
 2 img {
 3     vertical-align: top;
 4 }
 5 .w-slider {
 6     width: 310px;
 7     height: 265px;
 8     margin:100px auto;
 9     position: relative;
10     overflow: hidden;
11 }
12 .slider {
13     width: 310px;
14     height: 220px;
15 
16 }
17 .slider-main {
18     width: 620px;
19     height: 220px;
20 }
21 .slider-main-img {
22     position: absolute;
23     top: 0;
24     left: 0;
25     width: 310px;
26     height: 220px;
27 }
28 .slider-main-img img {
29     width: 100%;
30 }
31 .slider-ctrl {
32     text-align: center;
33     padding-top: 5px;
34 }
35 .slider-ctrl-con {
36     width: 24px;
37     height: 20px;
38     display:inline-block;
39     background:url(../images/icon.png) no-repeat -24px -782px;
40     margin: 0 5px;
41     cursor: pointer;
42     /*注意这里:生成的span有innerHTML属性,也就是文字会显示出来,这里采取首行缩进为负值,隐藏文字,当然还需要overflow:hidden配合*/
43     text-indent: -20em;   
44     overflow: hidden;
45 }
46 .current {
47     background-position: -24px -762px;
48 }
49 .slider-ctrl-prev,
50 .slider-ctrl-next {
51     position: absolute;
52     top: 50%;
53     margin-top: -35px;
54     background:url(../images/icon.png) no-repeat 6px top;
55     width: 30px;
56     height: 35px;
57     opacity: 0.8;
58     cursor: pointer;
59 }
60 .slider-ctrl-prev {
61     left: 0;
62 }
63 .slider-ctrl-next {
64     right: 0;
65     background-position: -6px -44px;
66 }

  技术交流:这里有个地方很重要。就是两个箭头的定位。根据Html,箭头是span做的,他的直系父元素是slider-ctrl,属于他的一部分。然而定位的时候出现一个比较有意思的地方,他是根据爷爷进行定位的,也就是w-slider,这样定位比较方便。另外就是span的文字隐藏技巧。

   三、javascript部分

    

 1 window.onload = function(){
 2     
 3     function $(id) {return document.getElementById(id);}
 4     
 5     //获得元素
 6     var slider_main_block = $("slider_main_block");
 7     var js_slider = $("js_slider");  // 获取最大盒子
 8     var imgs = slider_main_block.children;
 9     var slider_ctrl = $("slider_ctrl");
10     
11     //生成下面的span
12     for (var i = 0;i<imgs.length;i++) {
13         var span = document.createElement("span");
14         /*这里要注意,首先生成的span是倒序排列的,因此要改变序号 */
15         span.innerHTML = imgs.length - i;   //6-i
16         slider_ctrl.insertBefore(span,slider_ctrl.children[1]);
17         span.className = "slider-ctrl-con";
18     }
19     slider_ctrl.children[1].className = "current slider-ctrl-con";
20     //slider_ctrl.children[1].setAttribute("class","slider-ctrl-con current");
21     
22     //把第一张图片和其他图片分别存在左右盒子
23     var scrollWidth = js_slider.clientWidth;   //这里只是用大盒子的宽度,也可以用offsetWidth;
24     for (var i = 1;i<imgs.length;i++) {  //从1开始
25         imgs[i].style.left = scrollWidth + "px";
26     }
27     
28     //遍历点击三个按钮
29     var spans = slider_ctrl.children;
30     var iNow = 0;
31     for(var k in spans){
32         spans[k].onclick = function(){
33             if(this.className == "slider-ctrl-prev"){  //点击左箭头
34                 animate(imgs[iNow],{left: scrollWidth});
35                 --iNow < 0 ?  iNow = imgs.length - 1 : iNow;
36                 imgs[iNow].style.left = -scrollWidth + "px";
37                 animate(imgs[iNow],{left: 0});
38                 setSquare();
39             }else if(this.className == "slider-ctrl-next"){  //点击右箭头
40                 autoplay();
41             }else{
42                 //这里还存在着一个隐式转换,this.innerHTML是个字符型,但是-1之后,又变成了数值
43                 var that = this.innerHTML - 1;  //this.innerHTML是从1开始,减1是把索引号置0。获得当前索引号
44                 if(that > iNow){  //如果点击的大于正在播放的
45                     animate(imgs[iNow],{left: -scrollWidth}); //让当前的出去,让下一张(我点击的那一张)进来
46                     //点哪张就让哪张快速过来
47                     imgs[that].style.left = scrollWidth + "px";
48                     //animate(imgs[that],{left: 0});  慢慢走到舞台
49                 }
50                 else if(that < iNow) {
51                     // 做法等同于 左侧按钮
52                     animate(imgs[iNow],{left: scrollWidth});
53                     imgs[that].style.left = -scrollWidth + "px";
54                     //animate(imgs[that],{left: 0});
55                 }
56                 iNow = that;  //点击的span等于正在播放的序号,那么就把当前的索引号给播放的哪张(定时器会根据这个iNow进行播放)
57                 animate(imgs[iNow],{left: 0});  //这段代码是提出来的
58                 /*比如 已经播放到 第4张    我点击了 第2张   把 2 给  inow
59                 下一次播放,应该播放第3张*/
60                // animate(imgs[that],{left: 0});
61                 setSquare();
62             }
63         }
64     }
65     function setSquare() {
66        //  清除所有的span current   留下 满足需要的拿一个
67         for(var i=1;i<spans.length-1;i++){   //  8个span   我们要 1-6  不要 7  索引号
68             spans[i].className = "slider-ctrl-con";
69         }
70         spans[iNow+1].className = "slider-ctrl-con current";  // 记住 + 1,因为是span从第一个开始计算的,iNow初始值为0,故+1
71     }
72     var timer = null;
73     timer = setInterval(autoplay,2000);  // 开启定时器
74     function autoplay() {
75         //  当我们点击时候, 当前的这张图片 先慢慢的走到左边  下一张 一定先快速走到右侧 (310)的位置,然后慢慢的走到舞台中
76         //iNow == 0
77         animate(imgs[iNow],{left: -scrollWidth});
78         // 当前的那个图片 慢慢的走到 -scrollWidth 位置
79         // 变成1   先 ++   ++iNow  先自加  后 运算,如果是iNow++,那么b = iNow++ 取不到下一个索引值
80         ++iNow > imgs.length -1 ?  iNow = 0 : iNow;
81 /*注意这里:当iNow超过5的时候,iNow置0,重新计数,但是这个时候要让下一张(此时由于++iNow,iNow已经变成了下一张的索引号)*/
82 /*立马跑到右侧位置,先站好位置,做好移动到左侧的准备*/
83         imgs[iNow].style.left = scrollWidth + "px";  // 立马执行  快速走到右侧
84         animate(imgs[iNow],{left: 0}); // 下一张走的 0 的位置  慢慢走过来
85         setSquare();  // 调用square
86    }
87     //鼠标经过清除定时器
88     js_slider.onmouseover = function() {
89         clearInterval(timer);
90     }
91     js_slider.onmouseout = function() {
92         clearInterval(timer);  // 要执行定时器 先清除定时器
93         timer = setInterval(autoplay,2000);  // 开启定时器
94     }
95 }

    技术交流:注释部分已经很详细啦~~不再赘述~

以上是关于纯原生javascript仿网易轮播图的主要内容,如果未能解决你的问题,请参考以下文章

第65天:仿网易轮播图

仿网易阴阳师官网轮播图效果

仿网页轮播图

js原生 JavaScript轮播图渐变淡入淡出效果实现(附代码)

Web前端原生JavaScript浅谈轮播图

原生javascript之实战 轮播图