1. 程式人生 > >原生js輪播圖實現

原生js輪播圖實現

索引 獲取 mouseout abs length ati point css ack

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>Document</title>
  6         <style type="text/css">
  7     * {
  8         padding: 0;
  9         margin: 0;
 10         list-style: none;
 11         border: 0;
 12
} 13 14 .all { 15 width: 500px; 16 height: 200px; 17 padding: 7px; 18 border: 1px solid #ccc; 19 margin: 100px auto; 20 position: relative; 21 } 22 23 .screen { 24 width: 500px; 25 height: 200px; 26 overflow
: hidden; 27 position: relative; 28 } 29 30 .screen li { 31 width: 500px; 32 height: 200px; 33 overflow: hidden; 34 float: left; 35 } 36 37 .screen ul { 38 position: absolute; 39 left: 0; 40 top: 0px; 41 width
: 3000px; 42 } 43 44 .all ol { 45 position: absolute; 46 right: 10px; 47 bottom: 10px; 48 line-height: 20px; 49 text-align: center; 50 } 51 52 .all ol li { 53 float: left; 54 width: 20px; 55 height: 20px; 56 background: #fff; 57 border: 1px solid #ccc; 58 margin-left: 10px; 59 cursor: pointer; 60 } 61 62 .all ol li.current { 63 background: yellow; 64 } 65 66 #arr { 67 display: none; 68 } 69 70 #arr span { 71 width: 40px; 72 height: 40px; 73 position: absolute; 74 left: 5px; 75 top: 50%; 76 margin-top: -20px; 77 background: #000; 78 cursor: pointer; 79 line-height: 40px; 80 text-align: center; 81 font-weight: bold; 82 font-family: ‘黑體‘; 83 font-size: 30px; 84 color: #fff; 85 opacity: 0.3; 86 border: 1px solid #fff; 87 } 88 89 #arr #right { 90 right: 5px; 91 left: auto; 92 } 93 </style> 94 </head> 95 <body> 96 <div class="all" id=‘all‘> 97 <div class="screen" id="screen"> 98 <ul id="ul"> 99 <li><img src="images/carousel/1.jpg" width="500" height="200" /></li> 100 <li><img src="images/carousel/2.jpg" width="500" height="200" /></li> 101 <li><img src="images/carousel/3.jpg" width="500" height="200" /></li> 102 <li><img src="images/carousel/4.jpg" width="500" height="200" /></li> 103 <li><img src="images/carousel/5.jpg" width="500" height="200" /></li> 104 </ul> 105 <ol> 106 </ol> 107 <div id="arr"> 108 <span id="left"><</span> 109 <span id="right">></span> 110 </div> 111 </div> 112 </div> 113 114 <script> 115 //1.獲取事件源 116 var all = document.getElementById("all"); 117 var screen = all.firstElementChild || all.firstChild; 118 var imgWidth = screen.offsetWidth; 119 var ul = screen.firstElementChild || screen.firstChild; 120 var ol = screen.children[1]; 121 var div = screen.lastElementChild || screen.lastChild; 122 var spanArr = div.children; 123 124 //2.復制第一張圖片所在的li,添加到ul的最後面 125 var ulNewLi = ul.children[0].cloneNode(true); 126 ul.appendChild(ulNewLi); 127 128 //3.給ol添加li,ul的個數-1個,並點亮第一個按鈕 129 for (var i = 0; i < ul.children.length - 1; i++) { 130 var olNewLi = document.createElement("li"); 131 olNewLi.innerHTML = i + 1; 132 ol.appendChild(olNewLi); 133 } 134 135 var olLiArr = ol.children; 136 olLiArr[0].className = "current"; 137 138 //4.鼠標放到ol的li上,切換圖片 139 for (var i = 0; i < olLiArr.length; i++) { 140 olLiArr[i].index = i; 141 olLiArr[i].onmouseover = function(){ 142 for (var j = 0; j < olLiArr.length; j++) { 143 olLiArr[j].className = ""; 144 } 145 this.className = "current"; 146 //鼠標放到小的方塊上的時候索引值和key以及square同步 147 key = square = this.index; 148 //移動盒子 149 animate(ul,-this.index * imgWidth); 150 } 151 } 152 153 //5.添加定時器 154 var timer = setInterval(autoPlay,1000); 155 //固定向右切換圖片,兩個定時器(一個記錄圖片,一個記錄小方塊) 156 var key = 0; 157 var square = 0; 158 159 function autoPlay(){ 160 //通過控制key的自增來模擬圖片的索引值,然後移動ul 161 key ++; 162 if (key > olLiArr.length) { 163 //圖片已經滑動到最後一張,接下來,跳轉到第一張,然後在滑動到第二張 164 ul.style.left = 0; 165 key = 1; 166 } 167 animate(ul,-key * imgWidth); 168 //通過控制square的自增來模擬小方塊的索引值,然後點亮盒子 169 square ++; 170 if (square > olLiArr.length - 1) { 171 square = 0; 172 } 173 for (var i = 0; i < olLiArr.length; i++) { 174 olLiArr[i].className = ""; 175 } 176 olLiArr[square].className = "current"; 177 } 178 179 //鼠標放上去清除定時器,移開後再開啟定時器 180 all.onmouseover = function(){ 181 div.style.display = "block"; 182 clearInterval(timer); 183 } 184 all.onmouseout = function(){ 185 div.style.display = "none"; 186 timer = setInterval(autoPlay, 1000); 187 } 188 189 //6.左右切換圖片,鼠標放上去顯示,移開隱藏 190 spanArr[0].onclick = function(){ 191 //通過控制key的自增來模擬圖片的索引值,然後移動ul 192 key --; 193 if (key < 0) { 194 //先移動到最後一張,然後key的值取之前一張的索引值,然後在向前移動 195 ul.style.left = -imgWidth * (olLiArr.length) + "px"; 196 key = olLiArr.length - 1; 197 } 198 animate(ul, -key * imgWidth); 199 200 201 //通過控制square的自增來模擬小方塊的索引值,然後點亮盒子 202 //排他思想做小方塊 203 square--; 204 if (square < 0) { //索引值不能大於等於5,如果等於5,立刻變為0; 205 square = olLiArr.length - 1; 206 } 207 for (var i = 0; i < olLiArr.length; i++) { 208 olLiArr[i].className = ""; 209 } 210 olLiArr[square].className = "current"; 211 } 212 spanArr[1].onclick = function() { 213 //右側的和定時器一模一樣 214 autoPlay(); 215 } 216 function animate(ele, target) { 217 clearInterval(ele.timer); 218 var speed = target > ele.offsetLeft ? 10 : -10; 219 ele.timer = setInterval(function() { 220 var val = target - ele.offsetLeft; 221 ele.style.left = ele.offsetLeft + speed + "px"; 222 if (Math.abs(val) < Math.abs(speed)) { 223 ele.style.left = target + "px"; 224 clearInterval(ele.timer); 225 } 226 }, 10) 227 } 228 229 230 //7. 231 </script> 232 </body> 233 </html>

原生js輪播圖實現