基于JavaScript實(shí)現(xiàn)輪播圖原理及示例
網(wǎng)上有很多的例子介紹,在這里我所做的無(wú)縫滾動(dòng)就是 通過(guò)改變?cè)氐膌eft值讓圖片呈現(xiàn)左右滾動(dòng)的效果。
我們首先看一下 div+css 的結(jié)構(gòu)樣式:
div+css代碼
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> *{ margin: 0; padding: 0; } ul,ol{ list-style: none; } /*消除圖片底部3像素距離*/ img{ vertical-align: top; } .scroll{ width: 500px; height: 200px; margin: 100px auto; border: 1px solid #ccc; padding: 7px; overflow: hidden; position: relative; } .box{ width: 500px; height: 200px; overflow: hidden; position: relative; } .box ul{ width: 600%; position: absolute; left: 0; top: 0; } .box ul li{ float: left; } .scroll ol{ position: absolute; right: 10px; bottom: 10px; } .scroll ol li{ float: left; width: 20px; height: 20px; background: pink; text-align: center; line-height: 20px; border-radius: 50%; background-color: pink; margin-left:10px ; cursor: pointer; } .scroll ol li.current{ background-color: purple; } </style> </head> <body> <div id="scroll" class="scroll"> <div id="box" class="box"> <ul id="ul"> <li><img src="images/1.jpg" width="500" height="200"></li> <li><img src="images/2.jpg" width="500" height="200"></li> <li><img src="images/3.jpg" width="500" height="200"></li> <li><img src="images/4.jpg" width="500" height="200"></li> <li><img src="images/5.jpg" width="500" height="200"></li> </ul> <ol id="ol"> <li class="current">1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> </ol> </div> </div> </body> </html>
展示效果如圖:
接下來(lái)js代碼,再此之前我們要明白,小圓點(diǎn) 1 2 3 并不是寫死的,它是根據(jù)ul li中的圖片張數(shù)來(lái)決定的 ,所以我們要先把div中ol li中的代碼去掉。
要實(shí)現(xiàn)無(wú)縫滾動(dòng)就需要多一張圖片才行 ,即克隆第一張圖片,放到最后面。此時(shí)css布局保留,div中只剩下:
<body> <div id="scroll" class="scroll"> <div id="box" class="box"> <ul id="ul"> <li><img src="images/1.jpg" width="500" height="200"></li> <li><img src="images/2.jpg" width="500" height="200"></li> <li><img src="images/3.jpg" width="500" height="200"></li> <li><img src="images/4.jpg" width="500" height="200"></li> <li><img src="images/5.jpg" width="500" height="200"></li> </ul> </div> </div> </body>
此時(shí)我們用js代碼生成小圓點(diǎn)
var scroll = document.getElementById("scroll"); // 獲得大盒子 var ul = document.getElementById("ul"); // 獲得ul var ulLis = ul.children;// 獲得ul的盒子 以此來(lái)生成ol中l(wèi)i的個(gè)數(shù) var liWidth = ul.children[0].offsetWidth;// 獲得每個(gè)li的寬度 // 操作元素 // 因?yàn)橐鰺o(wú)縫滾動(dòng),所以要克隆第一張,放到最后一張后面 // 1. 克隆元素 ul.appendChild(ul.children[0].cloneNode(true)); // 2.創(chuàng)建ol 和li vaar ol = document.createElement("ol");//創(chuàng)建ol元素 scroll.appendChild(ol);// 把ol放到scroll盒子里面去 for (var i=0;i<ulLis.length-1;i++) { var li = document.createElement("li");// 創(chuàng)建li元素 li.innerHTML = i + 1;// 給li里面添加文字 1 2 3 4 5 ol.appendChild(li);// 將li元素添加到ol里面 } ol.children[0].className = "current";// ol中的第一個(gè)li背景色為purple
此時(shí)ol li元素即小圓點(diǎn)創(chuàng)建完畢 我們接著用js做動(dòng)畫
動(dòng)畫部分包括:
1.鼠標(biāo)經(jīng)過(guò)第幾個(gè)小圓點(diǎn),就要展示第幾張圖片,并且小圓點(diǎn)的顏色也發(fā)生變化
2.圖片自動(dòng)輪播,(這需要一個(gè)定時(shí)器)
3.鼠標(biāo)經(jīng)過(guò)圖片,圖片停止自動(dòng)播放(這需要清除定時(shí)器)
4.鼠標(biāo)離開圖片,圖片繼續(xù)自動(dòng)輪播 (重新開始定時(shí)器)
這里我們封裝了一個(gè)animate()動(dòng)畫函數(shù)
// 動(dòng)畫函數(shù) 第一個(gè)參數(shù),代表誰(shuí)動(dòng) 第二個(gè)參數(shù) 動(dòng)多少 // 讓圖片做勻速運(yùn)動(dòng),勻速動(dòng)畫的原理是 當(dāng)前的位置 + 速度 即 offsetLeft + speed function animate(obj,target){ // 首先清除掉定時(shí)器 clearInterval(obj.timer); // 用來(lái)判斷 是+ 還是 - 即說(shuō)明向左走還是向右走 var speed = obj.offsetLeft < target ? 15 : -15; obj.timer = setInterval(function(){ var result = target - obj.offsetLeft;//它們的差值不會(huì)超過(guò)speed obj.style.left = obj.offsetLeft + speed + "px"; // 有可能有小數(shù)的存在,所以在這里要做個(gè)判斷 if (Math.abs(result) <= Math.abs(speed)) { clearInterval(obj.timer); obj.style.left = target + "px"; } },10); }
定時(shí)器 函數(shù)
var timer = null; // 輪播圖的定時(shí)器 var key = 0;// 控制播放的張數(shù) var circle = 0;// 控制小圓點(diǎn) timer = setInterval(autoplay,1000);// 自動(dòng)輪播 function autoplay(){ /*自動(dòng)輪播時(shí),要對(duì)播放的張數(shù)key進(jìn)行一個(gè)判斷,如果播放的張數(shù)超過(guò)ulLis.length-1, 就要重頭開始播放. 因?yàn)槲覀兛寺×说谝粡埐⑵浞旁谧詈竺?所以我們要從第二張圖片開始播放*/ key++; // 先++ if(key > ulLis.length-1){// 后判斷 ul.style.left = 0; // 迅速調(diào)回 key = 1; // 因?yàn)榈?張是第一張,所以播放的時(shí)候是從第2張開始播放 } // 動(dòng)畫部分 animate(ul,-key*liWidth); // 小圓點(diǎn)circle 當(dāng)顯示第幾張圖片是,對(duì)應(yīng)的小圓點(diǎn)的顏色也發(fā)生變化 /*同理,對(duì)小圓點(diǎn)也要有一個(gè)判斷*/ circle++; if (circle > olLis.length-1) { circle = 0; } // 小圓點(diǎn)顏色發(fā)生變化 for (var i = 0 ; i < olLis.length;i++) { // 先清除掉所用的小圓點(diǎn)類名 olLis[i].className = ""; } // 給當(dāng)前的小圓點(diǎn) 添加一個(gè)類名 olLis[circle].className = "current"; }
好啦,這里我們展示了主要代碼,具體代碼,查看這里下載js實(shí)現(xiàn)輪播效果
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JS實(shí)現(xiàn)靜止元素自動(dòng)移動(dòng)示例
這篇文章主要介紹了JS實(shí)現(xiàn)靜止元素自動(dòng)移動(dòng)的具體實(shí)現(xiàn),需要的朋友可以參考下2014-04-04通過(guò)循環(huán)優(yōu)化 JavaScript 程序
這篇文章主要介紹了通過(guò)循環(huán)優(yōu)化 JavaScript 程序,對(duì)于提高 JavaScript 程序的性能這個(gè)問(wèn)題,最簡(jiǎn)單同時(shí)也是很容易被忽視的方法就是學(xué)習(xí)如何正確編寫高性能循環(huán)語(yǔ)句。下面我們來(lái)學(xué)習(xí)一下吧2019-06-06抓取JavaScript動(dòng)態(tài)加載的內(nèi)容的方法總結(jié)
JavaScript動(dòng)態(tài)加載的內(nèi)容常見于現(xiàn)代Web應(yīng)用中,用于增強(qiáng)用戶體驗(yàn)和減少初始頁(yè)面加載時(shí)間,然而,這些動(dòng)態(tài)加載的內(nèi)容對(duì)于傳統(tǒng)的網(wǎng)頁(yè)抓取工具來(lái)說(shuō)往往是不可見的,本文主要介紹了有JavaScript動(dòng)態(tài)加載的內(nèi)容如何抓取,需要的朋友可以參考下2024-09-09js中調(diào)用微信的掃描二維碼功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了在js中調(diào)用微信的掃描二維碼功能的實(shí)現(xiàn)代碼,本文給大家分享了注意事項(xiàng)及常見問(wèn)題分析,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04js學(xué)使用setTimeout實(shí)現(xiàn)輪循動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了js使用setTimeout實(shí)現(xiàn)輪循動(dòng)畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07