带无缝滚动的轮播图(含JS运动框架)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带无缝滚动的轮播图(含JS运动框架)相关的知识,希望对你有一定的参考价值。

今天学习了一下轮播图的写作,想到前一阵学过的无缝滚动得思想,所以就把轮播与滚动结合了一下。不过我的代码的神逻辑我自己都不敢恭维,在没网没参照的情况下,只能硬着头皮往下写,希望跟大家共勉吧。

js运动框架的代码如下:

 1 //获取样式
 2 function getStyle(obj,attr){
 3     if(obj.currentStyle){
 4         return obj.currentStyle[attr];
 5     }else{
 6         return getComputedStyle(obj,false)[attr];
 7     }
 8 }
 9 
10 //运动框架
11 //complete:time,ease,fn
12 function move(obj,json,complete){
13     var dis = {};
14     var start = {};
15     for(var name in json){
16         start[name] = parseInt(getStyle(obj,name));
17         dis[name] = json[name] - start[name];
18     }
19     complete = complete || {};
20     complete.time = complete.time || 1000;
21     complete.ease = complete.ease || "ease-in";
22 
23     var count = Math.floor(complete.time/30);
24     var n = 0;
25     clearInterval(obj.timer);
26     obj.timer = setInterval(function(){
27         n++;
28         for(var name in json){
29             switch (complete.ease){
30                 case "linear":
31                     var a = n/count;
32                     var cur = start[name] + dis[name]*a;
33                     break;
34                 case "ease-in":
35                     var a = n/count;
36                     var cur = start[name] + dis[name]*a*a*a;
37                     break;
38                 case "ease-out":
39                     var a = 1 - n/count;
40                     var cur = start[name] + dis[name]*(1-a*a*a);
41                     break;
42             }
43 
44             if(name == "opacity"){
45                 obj.style.opacity = cur;
46                 obj.style.filter = "alpha(opacity="+cur*100 +")";
47             }else{
48                 obj.style[name] = cur + "px";
49             }
50         }
51 
52         if(n == count){
53             clearInterval(obj.timer);
54             if(complete.fn) complete.fn();
55         }
56     },30)
57 }

运行的效果图如下:

  自动轮播,下方红色按钮同时变换,点击左右箭头分别到达上一张或下一张,问题主要是在第一张和最后一张上面。

技术分享

神逻辑即将出现,请访客给出好建议哦!!

  1 <!DOCTYPE html>
  2 <html>
  3 <head>
  4     <title></title>
  5     <style>
  6         *{
  7             margin: 0;
  8             padding: 0;
  9         }
 10         #wrap{
 11             width: 590px;
 12             height: 340px;
 13             margin:100px auto;
 14             position: relative;
 15             overflow: hidden;
 16         }
 17         #box{
 18             position: absolute;
 19             left: 0;
 20             top: 0;
 21         }
 22         #box li{
 23             width: 590px;
 24             height: 340px;
 25             list-style: none;
 26             float: left;
 27         }
 28         #btn{
 29             position: absolute;
 30             left: 50%;
 31             margin-left:-100px ;
 32             bottom: 20px;
 33         }
 34         #btn li{
 35             width: 30px;
 36             height:30px;
 37             border-radius: 50%;
 38             background: #ccc;
 39             float: left;
 40             list-style: none;
 41             margin-right: 10px;
 42         }
 43         #btn li.active{
 44             background: red;
 45         }
 46         #wrap a{
 47             display: block;
 48             width: 50px;
 49             height: 50px;
 50             background: rgba(0,0,0,0.5);
 51             position: absolute;
 52             top: 145px;
 53             color: #fff;
 54             text-decoration: none;
 55             line-height: 50px;
 56             text-align: center;
 57         }
 58         #prev{
 59             left: 0;
 60         }
 61         #next{
 62             right: 0;
 63         }
 64     </style>
 65     <script src="move.js"></script>
 66 </head>
 67 <body>
 68     <div id="wrap">
 69         <ul id="box">
 70             <li><img src="img/1.jpg"></li>
 71             <li><img src="img/2.jpg"></li>
 72             <li><img src="img/3.jpg"></li>
 73             <li><img src="img/4.jpg"></li>
 74             <li><img src="img/5.jpg"></li>
 75         </ul>
 76         <ol id="btn">
 77             <li class="active"></li>
 78             <li></li>
 79             <li></li>
 80             <li></li>
 81             <li></li>
 82         </ol>
 83         <a id="prev" href="javascript:;"></a>
 84         <a id="next" href="javascript:;"></a>
 85     </div>
 86 </body>
 87 </html>
 88 <script>
 89     window.onload = function(){
 90         var oWrap = document.getElementById("wrap");
 91         var oBox = document.getElementById("box");
 92         var aBox = oBox.getElementsByTagName("li");
 93         var aBtn = document.getElementById("btn").getElementsByTagName("li");
 94         var oPrev = document.getElementById("prev");
 95         var oNext = document.getElementById("next");
 96         var iNow = 0;
 97         var timer = null;
 98 
 99         oBox.innerHTML += oBox.innerHTML;
100         oBox.style.width = aBox[0].offsetWidth * aBox.length + "px";
101         oBox.style.width = aBox[0].offsetWidth*aBox.length +"px";
102 
103         //红色按钮的样式
104         function tab(){
105             for(var i=0;i<aBtn.length;i++){
106                 aBtn[i].className = "";
107             }
108             move(oBox,{left:-aBox[0].offsetWidth*iNow});
109             aBtn[iNow].className = "active";
110         }
111         //下一张(神逻辑在此,擦汗!!希望访客给出更好建议)
112         function next(){
113             if(iNow==aBox.length/2){
114                 oBox.style.left = 0;
115                 iNow = 0;
116             }
117             for(var i=0;i<aBtn.length;i++){
118                 aBtn[i].className = "";
119             }
120             iNow++;
121             var iNew = iNow;
122             if(iNew == aBtn.length) iNew = 0;
123             aBtn[iNew].className = "active";
124             move(oBox,{left:-aBox[0].offsetWidth*iNow});
125         }
126 
127         //红色圆钮得点击效果
128         for(var i=0;i<aBtn.length;i++){
129             aBtn[i].index = i;
130             aBtn[i].onclick = function(){
131                 iNow = this.index;
132                 tab();
133             }
134         }
135         //上一张(与“上一张”一样的神逻辑!!)
136         oPrev.onclick = function(){
137             if(iNow<=aBox.length/2 - 1){
138                 iNow+=5;
139                 oBox.style.left = -aBox[0].offsetWidth*iNow + "px";
140             }
141             for(var i=0;i<aBtn.length;i++){
142                 aBtn[i].className = "";
143             }
144             iNow--;
145             var iNew = iNow-5;
146             if(iNew == -1) iNew = aBtn.length-1;
147             aBtn[iNew].className = "active";
148             move(oBox,{left:-aBox[0].offsetWidth*iNow});
149         }
150         oNext.onclick = next;
151         clearInterval(timer);
152         timer = setInterval(next,2000);
153         oWrap.onmouseout = function(){
154             timer = setInterval(next,2000);
155         }
156         oWrap.onmouseover = function(){
157             clearInterval(timer);
158         }
159     }
160 </script>

 

以上是关于带无缝滚动的轮播图(含JS运动框架)的主要内容,如果未能解决你的问题,请参考以下文章

JS 轮播图(无缝连接的轮播图实现,含代码供参考)

用jquery实现带左右按键的轮播图

关于网页中的无缝滚动

用html+css怎么写出带按钮的轮播图?

js原生选项(自动播放无缝滚动轮播图)二

js实现效果:循环轮播图