1 <!DOCTYPE html> 2 <html lang="zh-CN"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <title>轮播图</title> 8 9 <!-- css start --> 10 <style> 11 * { 12 margin: 0; 13 padding: 0; 14 } 15 16 .box { 17 1024px; 18 margin: 0 auto; 19 background: rgba(251, 3, 3, 0.1); 20 } 21 22 header { 23 height: 200px; 24 background: rgba(3, 61, 253, 0.2); 25 } 26 27 nav { 28 height: 200px; 29 background: rgba(3, 246, 76, 0.2); 30 } 31 32 section { 33 position: relative; 34 margin: 50px auto; 35 height: 768px; 36 overflow: hidden; 37 background-color: rgb(0, 0, 0); 38 } 39 40 footer { 41 height: 200px; 42 background: rgba(3, 3, 3, 0.5); 43 } 44 45 .pre { 46 display: none; 47 position: absolute; 48 top: 50%; 49 left: 0; 50 50px; 51 height: 50px; 52 font-size: 30px; 53 z-index: 2; 54 55 } 56 57 .next { 58 display: none; 59 position: absolute; 60 right: 0; 61 top: 50%; 62 50px; 63 height: 50px; 64 font-size: 30px; 65 z-index: 2; 66 } 67 68 section ul { 69 position: absolute; 70 top: 0; 71 left: 0; 72 /* 有几张图片就设置几倍 */ 73 900%; 74 } 75 76 section ul li { 77 list-style: none; 78 float: left; 79 } 80 81 .dian { 82 position: absolute; 83 left: 40%; 84 top: 75%; 85 86 list-style: disc; 87 font-size: 50px; 88 } 89 90 ol li { 91 float: left; 92 margin: 20px; 93 } 94 95 .current { 96 color: rgb(255, 0, 21); 97 } 98 button{ 99 background-color: rgba(255, 255, 255,0.1); 100 border: rgb(249, 250, 250); 101 } 102 ul li img{ 103 1024px; 104 height: 768px; 105 } 106 </style> 107 <!-- css end --> 108 109 110 <!-- 引入动画js --> 111 <script src="../../JaveScript/animate.js"></script> 112 </head> 113 114 <body> 115 116 <div class="box"> 117 <section> 118 <a href="javascript:;"> <button class="pre"><</button> </a> 119 <a href="javascript:;"> <button class="next">></button> </a> 120 121 <!-- 核心滚动区域 --> 122 <!-- 轮播图 --> 123 <ul> 124 125 <li> 126 <a href=""><img src="../img/flyfordream.png" alt=""></a> 127 </li> 128 <li> 129 <a href=""><img src="../img/WORLD_flaris.png" alt=""></a> 130 </li> 131 <li> 132 <a href=""><img src="../img/WORLD_saint.png" alt=""></a> 133 </li> 134 <li> 135 <a href=""><img src="../img/WORLD_ricis.png" alt="" ></a> 136 </li> 137 <li> 138 <a href=""><img src="../img/WORLD_darkon12.png" alt="" ></a> 139 </li> 140 <li> 141 <a href=""><img src="../img/WORLD_darkon3.png" alt="" ></a> 142 </li> 143 <li> 144 <a href=""><img src="../img/WORLD_Flyff.png" alt="" ></a> 145 </li> 146 </ul> 147 <ol class="dian"> 148 149 </ol> 150 </section> 151 152 153 </div> 154 155 <!-- js start --> 156 <script> 157 window.addEventListener('load', function () { 158 159 // 查找元素 160 var preBtn = document.querySelector('.pre') 161 var nextBtn = document.querySelector('.next') 162 var section = document.querySelector('section') 163 var ul = section.querySelector('ul') 164 var ol = section.querySelector('.dian') 165 var sectionWidth = section.offsetWidth 166 167 //添加鼠标移入事件,显示按钮 168 section.addEventListener('mouseenter', function () { 169 preBtn.style.display = 'block' 170 nextBtn.style.display = 'block' 171 172 //当鼠标移入图片区域时,暂停自动播放图片 173 clearInterval(timer) 174 timer = null 175 176 }) 177 178 //添加鼠标离开事件,隐藏按钮 179 section.addEventListener('mouseleave', function () { 180 preBtn.style.display = 'none' 181 nextBtn.style.display = 'none' 182 183 //当鼠标离开图片区域时,自动播放下一张图片 184 timer = setInterval(function () { 185 nextBtn.click() 186 }, 3000) 187 }) 188 189 for (let i = 0; i < ul.children.length; i++) { 190 //创建li 191 var li = document.createElement('li') 192 193 //给li添加自定义属性 index 194 li.setAttribute('index', i) 195 196 //添加到ul标签内 197 ol.appendChild(li) 198 199 //给小圆点创建点击事件 200 li.addEventListener('click', function () { 201 for (let i = 0; i < ol.children.length; i++) { 202 ol.children[i].className = '' 203 } 204 this.className = 'current' 205 206 //点击小圆点,执行图片位移动画,移动的是ul 207 //ul的移动距离就是,小圆点的索引号 * 图片的宽度 208 209 210 //点击小圆点后,获取index自定义属性 211 var index = this.getAttribute('index') 212 213 //让小圆点和n 跟着 index 下标一起变 214 n = index 215 yd = index 216 217 //播放动画 218 animation(ul, -index * sectionWidth) 219 220 }) 221 } 222 223 //将第一个li设置为current当前图片 224 ol.children[0].className = 'current' 225 226 //克隆第一张图片到末尾 227 var firstPic = ul.children[0].cloneNode(true) 228 229 //追加到ul末尾 230 ul.appendChild(firstPic) 231 232 233 var n = 0 234 235 //控制小圆点的播放 236 var yd = 0 237 238 //判断图片是否播放完毕,节流阀,防止点击图片过快导致动画错误 239 var flag = true 240 241 //给右侧下一页按钮添加点击事件 242 nextBtn.addEventListener('click', function () { 243 if (flag) { 244 245 flag = false 246 247 if (n == ul.children.length - 1) { 248 ul.style.left = 0 249 n = 0 250 } 251 n++ 252 253 //播放动画 254 animation(ul, -n * sectionWidth, function () { 255 // 执行到这里,说明动画播放完毕,将节流阀设置为true开启状态,才能点击下一张图片 256 flag = true 257 }) 258 259 yd++ 260 261 if (yd == ol.children.length) { 262 yd = 0 263 } 264 265 //调用改变小圆点样式函数 266 ChangeXyd() 267 } 268 }) 269 270 //给左侧上一页按钮添加点击事件 271 preBtn.addEventListener('click', function () { 272 if (flag) { 273 flag = false 274 275 if (n == 0) { 276 n = ul.children.length - 1 277 ul.style.left = -n * sectionWidth + 'px' 278 279 } 280 n-- 281 282 //播放动画 283 animation(ul, -n * sectionWidth,function(){ 284 flag = true 285 }) 286 287 yd-- 288 289 // if (yd < 0) { 290 // yd = ol.children.length - 1 291 // } 292 293 yd = yd < 0 ? ol.children.length - 1 : yd 294 295 //调用改变小圆点样式函数 296 ChangeXyd() 297 } 298 299 }) 300 301 //改变小圆点样式函数 302 function ChangeXyd() { 303 //清除其他小圆圈样式 304 for (let i = 0; i < ol.children.length; i++) { 305 ol.children[i].className = '' 306 } 307 //给当前小圆点添加样式 308 ol.children[yd].className = 'current' 309 } 310 311 //自动播放下一张图片 312 var timer = setInterval(function () { 313 314 //自动调用点击事件 315 nextBtn.click() 316 }, 3000) 317 }) 318 </script> 319 <!-- js end --> 320 321 </body> 322 323 </html>
1 function animation(obj, target,callback) { 2 3 //让定时器唯一 4 clearInterval(obj.timer) 5 6 obj.timer = setInterval(function () { 7 8 var step = (target - obj.offsetLeft) / 10 9 //算元运算判断,如果步长值>0 就向上取整,否则就向下取整 10 step = step > 0 ? Math.ceil(step) : Math.floor(step) 11 12 if (obj.offsetLeft == target) { 13 clearInterval(obj.timer) 14 15 //判断是否有回调函数 16 // if(callback){ 17 // callback() 18 // } 19 20 // 短路运算 21 //如果有传入参数,就执行callback() 22 //若没有,则返回 23 callback && callback() 24 } 25 obj.style.left = obj.offsetLeft + step + 'px' 26 },5) 27 }
效果图