原生JS運動實現(xiàn)輪播圖
原生JS運動實現(xiàn)輪播圖
**基本原理:**通過控制包含n張圖片的ul的left值來實現(xiàn)圖片自動運動的效果,其中列表中l(wèi)i元素的個數(shù)為n,第一個li和最后一個li里存放的圖片應(yīng)為同一張圖片,當(dāng)圖片運動到最后一張時,將ul的left值設(shè)為0,即可達到圖片無線輪播的效果。
運動函數(shù)的實現(xiàn)
函數(shù)需傳入元素(即需要參與運動的元素)、目標(biāo)值(以對象的形式呈現(xiàn),如{left: 300})、callback(回調(diào)函數(shù))。
//多物體多值運動+回調(diào)機制 function startMove(dom, attrObj, callback) { var key = true; var iSpeed = null, iCur = null; clearInterval(dom.timer); if (key) { dom.timer = setInterval(function() { //bStop用來判斷是否開始執(zhí)行回調(diào)函數(shù) var bStop = true; //判斷傳入目標(biāo)值中的“鍵”類型是否為opacity for (var attr in attrObj) { //若要改變的樣式為opacity,則將元素的opacity擴大100被進行操作 if (attr === 'opacity') { iCur = parseFloat(getStyle(dom, attr)) * 100; } else { iCur = parseInt(getStyle(dom, attr)); } //運動速度設(shè)為目標(biāo)值減去當(dāng)前值的一半,即當(dāng)前狀態(tài)離目標(biāo)值越接近,運動速度越小 iSpeed = (attrObj[attr] - iCur) / 2; //對速度進行取整 iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed); if (attr === 'opacity') { dom.style.opacity = (iCur + iSpeed) / 100; } else { dom.style[attr] = iCur + iSpeed + 'px'; } if (iCur !== attrObj[attr]) { bStop = false; } } //當(dāng)bStop為true時,元素的所有樣式均已達到目標(biāo)值,清理定時器并執(zhí)行回調(diào)函數(shù) if (bStop) { clearInterval(dom.timer); typeof callback == 'function' && callback(); } }, 30) } if (!key) { } } //用來獲取元素實時的樣式值 function getStyle(elem, prop){ if (window.getComputedStyle){ return window.getComputedStyle(elem, null)[prop]; } }
HTML部分
HTML中包含一個div,用來顯示當(dāng)前要播放的圖片,該div中又包含一個ul(用來存放所有包含圖片的li)、三個div(其中兩個充當(dāng)圖片左右切換的按鈕,第三個存放圖片索引點,通過點擊索引也可切換到要查看的圖片),代碼如下:
<div class="wrapper"> <ul class="sliderPage"> <li> <img src="./image/dog/阿拉斯加.jpeg"/> </li> <li> <img src="./image/dog/比熊.jpeg"/> </li> <li> <img src="./image/dog/邊牧.jpeg"/> </li> <li> <img src="./image/dog/柯基.jpeg"/> </li> <li> <img src="./image/dog/阿拉斯加.jpeg"/> </li> </ul> <div class="btn leftBtn"><</div> <div class="btn rightBtn">></div> <div class="sliderIndex"> <span class="active"></span> <span></span> <span></span> <span></span> </div> </div>
CSS代碼
此處采用的為內(nèi)聯(lián)樣式表
<style> *{ margin: 0; padding: 0; list-style: none; } .wrapper{ position: relative; margin: 100px auto 0; width: 600px; height: 360px; overflow: hidden; } .wrapper .sliderPage{ position: absolute; left: 0; width: 3000px; height: 360px; } .wrapper .sliderPage li{ width: 600px; height: 360px; float: left; } .wrapper .sliderPage li img{ width: 100%; height: 100%; } .btn{ position: absolute; top: 50%; width: 20px; height: 20px; color: #fff; text-align: center; line-height: 20px; background-color: #000; opacity: 0.2; cursor: pointer; } .leftBtn{ left: 5px; } .rightBtn{ right: 5px; } .wrapper:hover .btn{ opacity: 0.8; } .sliderIndex{ position: absolute; width: 100%; bottom: 10px; cursor: pointer; text-align: center; } span{ width: 8px; height: 8px; background-color: #cccccc; border-radius: 50%; display: inline-block; margin-right: 5px; } .active{ background-color: orange; } </style>
圖片自動運動及點擊運動事件綁定
要點:
1、當(dāng)圖片運動到最后一張時(顯示圖片為第一張圖片),將ul的left值設(shè)為0即可實現(xiàn)無限輪播;
2、圖片每次運動的值為li的寬度;
3、圖片的運動需要一定的時間,因此在圖片運動過程中應(yīng)禁止產(chǎn)生其它定時器,否則會造成運動尺寸混亂而導(dǎo)致圖片輪播出現(xiàn)問題,這里用lock來進行實現(xiàn),在ul運動過程中將lock值設(shè)為false,運動結(jié)束后又將lock值設(shè)為true;
4、通過index值來實現(xiàn)索引顯示圖片功能,圖片輪播過程中,index初始值為0,當(dāng)圖片向右輪播時index值加1,圖片向左輪播時,index值減1,index值為0時,若讓圖片向左輪播,則將index值設(shè)為n(li個數(shù))并進行輪播,而當(dāng)index值為3且圖片向右輪播時,在ul運動完成后將index值設(shè)為0;
var timer = null; var sliderPage = document.getElementsByTagName('ul')[0]; var moveWidth = sliderPage.children[0].offsetWidth; var num = sliderPage.children.length - 1; var leftBtn = document.getElementsByClassName('leftBtn')[0]; var rightBtn = document.getElementsByClassName('rightBtn')[0]; var lock = true; var index = 0; var indexArray = document.getElementsByClassName('sliderIndex')[0].getElementsByTagName('span'); //索引切換 for (var i = 0; i < indexArray.length; i ++){ (function(myindex){ indexArray[myindex].onclick = function(){ lock = false; clearTimeout(timer); index = myindex; changeIndex(index); startMove(sliderPage, {left: -index * moveWidth}, function(){ lock = true; timer = setTimeout(autoMove, 3000); }) } }(i)) } //圖片運動過程中改變index點的樣式 function changeIndex(index){ for (var i = 0; i < indexArray.length; i++){ indexArray[i].className = ''; } indexArray[index].className = 'active'; } timer = setTimeout(autoMove, 3000); //向左翻 leftBtn.onclick = function (){ autoMove('right->left'); } //向右翻 rightBtn.onclick = function (){ autoMove('left->right'); } //direction //默認輪播方向 'left->right' / undefined //點擊left按鈕 'right->left' function autoMove(direction){ clearTimeout(timer); if (lock){ lock = false; if (!direction || direction === 'left->right'){ index++; startMove(sliderPage, {left: sliderPage.offsetLeft - moveWidth}, function(){ if (sliderPage.offsetLeft === - num * moveWidth){ index = 0; sliderPage.style.left = '0px'; } timer = setTimeout(autoMove, 3000); lock = true; changeIndex(index); }); }else if(direction === 'right->left'){ if (sliderPage.offsetLeft === 0){ index = num; sliderPage.style.left = - num * moveWidth + 'px'; } index--; startMove(sliderPage, {left: sliderPage.offsetLeft + moveWidth}, function () { timer = setTimeout(autoMove, 3000); lock = true; changeIndex(index); }) } } }
以上即為通過原生JS運動所實現(xiàn)的圖片輪播。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript實現(xiàn)背景圖像切換3D動畫效果示例詳解
這篇文章主要為大家介紹了JavaScript實現(xiàn)背景圖像切換3D動畫效果示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09原生JS利用transform實現(xiàn)banner的無限滾動示例代碼
這篇文章主要介紹了原生JS利用transform實現(xiàn)banner的無限滾動示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06JS獲取子節(jié)點、父節(jié)點和兄弟節(jié)點的方法實例總結(jié)
這篇文章主要介紹了JS獲取子節(jié)點、父節(jié)點和兄弟節(jié)點的方法,結(jié)合實例形式總結(jié)分析了JavaScript針對子節(jié)點、父節(jié)點和兄弟節(jié)點獲取相關(guān)操作技巧與使用注意事項,需要的朋友可以參考下2018-07-07微信小程序數(shù)據(jù)操作指南之從綁定到更新的操作方法
在微信小程序開發(fā)中,數(shù)據(jù)操作是不可或缺的一環(huán),文章詳細介紹了數(shù)據(jù)綁定、更新等方法,并提供示例和注意事項,幫助開發(fā)者更好地應(yīng)用這些技術(shù),本文給大家介紹微信小程序數(shù)據(jù)操作指南之從綁定到更新,感興趣的朋友跟隨小編一起看看吧2024-10-10JavaScript+CSS實現(xiàn)的可折疊二級菜單實例
這篇文章主要介紹了JavaScript+CSS實現(xiàn)的可折疊二級菜單,以完整實例形式分析了JavaScript基于頁面元素節(jié)點及樣式的動態(tài)操作實現(xiàn)折疊菜單的相關(guān)技巧,需要的朋友可以參考下2016-02-02javascript設(shè)計模式 – 橋接模式原理與應(yīng)用實例分析
這篇文章主要介紹了javascript設(shè)計模式 – 橋接模式,結(jié)合實例形式分析了javascript橋接模式基本概念、原理、用法及操作注意事項,需要的朋友可以參考下2020-04-04利用JavaScript在網(wǎng)頁實現(xiàn)八數(shù)碼啟發(fā)式A*算法動畫效果
這篇文章主要介紹了利用JavaScript在網(wǎng)頁實現(xiàn)八數(shù)碼啟發(fā)式A*算法動畫效果,需要的朋友可以參考下2017-04-04asp.net HttpHandler實現(xiàn)圖片防盜鏈
這個例子來自于《Maximizing ASP.NET Real World, Object-Oriented Development》一書, 需要的朋友可以參考下。2009-11-11