JS實(shí)現(xiàn)輪播圖小案例
本文實(shí)例為大家分享了JS實(shí)現(xiàn)輪播圖小案例的具體代碼,供大家參考,具體內(nèi)容如下
分析:
- 點(diǎn)擊左右箭頭 滑動(dòng)輪播圖
- 鼠標(biāo)不在輪播圖內(nèi)時(shí) 每隔2秒自動(dòng)滑動(dòng)輪播圖
- 鼠標(biāo)移入時(shí) 停止自動(dòng)滑動(dòng)輪播圖
- 點(diǎn)擊小圓圈 顯示對(duì)應(yīng)的輪播圖
1、鼠標(biāo)移入、移出顯示或隱藏左右箭頭:
// 獲取左右箭頭的元素 let arrow_l = this.document.querySelector('.arrow-l'); let arrow_r = this.document.querySelector('.arrow-r'); // 獲取到輪播圖盒子元素 let focus = this.document.querySelector('.focus'); // 輪播圖盒子添加鼠標(biāo)移入移出事件 顯示或隱藏 左右箭頭 focus.addEventListener('mouseenter', function(e) { arrow_l.style.display = 'block'; arrow_r.style.display = 'block'; // 鼠標(biāo)移入的時(shí)候清除定時(shí)函數(shù),不再自動(dòng)滑動(dòng)輪播圖 clearInterval(timer); timer = null; }); focus.addEventListener('mouseleave', function(e) { arrow_l.style.display = 'none'; arrow_r.style.display = 'none'; // 鼠標(biāo)移出 添加定時(shí)任務(wù),每2秒來(lái)觸發(fā)一次點(diǎn)擊右箭頭的點(diǎn)擊 timer = setInterval(function() { arrow_r.click(); }, 2000); })
2、添加ol內(nèi)的li標(biāo)簽:
// 獲取到ul列表(輪播圖列表)和ol列表 (小圓圈列表)元素 var ul = focus.querySelector('ul'); // 此時(shí)ol列表內(nèi)沒(méi)有元素 var ol = focus.querySelector('.circle'); // 循環(huán)輪播圖列表 有多少?gòu)堓啿D就添加多少個(gè)小圓圈 for (var i = 0; i < ul.children.length; i++) { // 創(chuàng)建li標(biāo)簽 var li = this.document.createElement('li'); // 給li標(biāo)簽添加自定義屬性 為輪播圖的下標(biāo) 用于 li.setAttribute('l-index', i); // ol標(biāo)簽添加li標(biāo)簽 ol.appendChild(li); // 每一個(gè)li標(biāo)簽添加點(diǎn)擊函數(shù) li.addEventListener('click', function() { // 清除所有小圓圈的樣式 for (var j = 0; j < ol.children.length; j++) { ol.children[j].className = ''; } // 點(diǎn)擊哪一個(gè)小圓圈 就添加樣式 this.className = 'current'; // 點(diǎn)擊小圓圈 更改num和circl 來(lái)更換輪播圖 num = this.getAttribute('l-index'); circl = this.getAttribute('l-index'); // 動(dòng)畫(huà)效果 animate(ul, -num * focusWidth); }) }
3、復(fù)制第一張輪播圖到ul的最后,顯得輪播圖更自然,添加記錄輪播圖的下標(biāo)和記錄小圓圈的下標(biāo),添加節(jié)流閥:
節(jié)流閥:
添加一個(gè)節(jié)流閥 默認(rèn)為true 如果點(diǎn)擊之后立即改為false 如果沒(méi)處理完上次點(diǎn)擊的事件 這個(gè)時(shí)間內(nèi)的點(diǎn)擊事件不再處理
類(lèi)似一個(gè)鎖,當(dāng)鎖住的時(shí)候只做一件事,別的點(diǎn)擊不會(huì)再做,等什么時(shí)候開(kāi)了鎖,什么時(shí)候才可以做。
// 克隆一個(gè)第一張輪播圖的節(jié)點(diǎn)添加到ul內(nèi) // 播放到最后一個(gè)的時(shí)候 轉(zhuǎn)到第一個(gè)看著有連貫性 ol.children[0].className = 'current'; let cloneLi = ul.children[0].cloneNode(true); ul.appendChild(cloneLi); // 添加一個(gè)下標(biāo) 來(lái)記錄輪播圖播放到了第幾張 num = 0; // 與num類(lèi)似,記錄小圓圈的下標(biāo) circl = 0; // 添加節(jié)流閥 flag = true;
4、右箭頭、左箭頭的點(diǎn)擊事件和小圓圈更改樣式:
// 點(diǎn)擊右箭頭的 點(diǎn)擊事件 arrow_r.addEventListener('click', function(e) { // 添加一個(gè)節(jié)流閥 默認(rèn)為T(mén)rue 如果點(diǎn)擊之后立即改為false 如果沒(méi)處理完上次點(diǎn)擊的事件 這個(gè)時(shí)間內(nèi)的點(diǎn)擊事件不再處理 if (flag) { // 改變節(jié)流閥的狀態(tài) flag = false; // 如果num下標(biāo)為最后一張 就恢復(fù)到第一張 把num下標(biāo)改為默認(rèn)0 if (num == ul.children.length - 1) { ul.style.left = 0; num = 0; } // num下標(biāo)加1 num++; // 改變動(dòng)畫(huà)效果 滑動(dòng)到 第幾張輪播圖 * 一張的寬度 的距離 animate(ul, -num * focusWidth, function() { // 回調(diào)函數(shù)設(shè)置節(jié)流閥為true 可以再次點(diǎn)擊 flag = true; }); // 小圓圈+1 circl++; // 如果小圓圈到了最后一個(gè) 恢復(fù)為0 if (circl == ul.children.length - 1) { circl = 0; } // 改變小圓圈的樣式 circlChange(); } })
// 左箭頭的點(diǎn)擊事件 arrow_l.addEventListener('click', function(e) { if (flag) { flag = false; // 判斷為0時(shí)說(shuō)明是從第一張開(kāi)始往左點(diǎn) if (num == 0) { // 更改num下標(biāo)為最后一個(gè) num = ul.children.length - 1; // 更改輪播圖為最后一個(gè) ul.style.left = -num * focusWidth + 'px'; } // num -1 num--; // 動(dòng)畫(huà)效果 animate(ul, -num * focusWidth, function() { flag = true; }); // 如果小圓圈為0 說(shuō)明到了第一個(gè)輪播圖 if (circl == 0) { // 小圓圈到最后一個(gè) circl = ul.children.length - 1; } // 小圓圈-1 circl--; // 改變小圓圈的樣式 circlChange(); } })
function circlChange() { // 遍歷ol列表 刪除每一個(gè)小圓圈的樣式 for (var i = 0; i < ol.children.length; i++) { ol.children[i].className = ''; }; // 給當(dāng)前circl下標(biāo)的小圓圈添加樣式 ol.children[circl].className = 'current'; }
5、輪播圖動(dòng)畫(huà)函數(shù)的封裝:
function animate(obj, target, callback) { // console.log(callback); callback = function() {} 調(diào)用的時(shí)候 callback() // 先清除以前的定時(shí)器,只保留當(dāng)前的一個(gè)定時(shí)器執(zhí)行 clearInterval(obj.timer); obj.timer = setInterval(function() { // 步長(zhǎng)值寫(xiě)到定時(shí)器的里面 // 把我們步長(zhǎng)值改為整數(shù) 不要出現(xiàn)小數(shù)的問(wèn)題 // var step = Math.ceil((target - obj.offsetLeft) / 10); var step = (target - obj.offsetLeft) / 10; step = step > 0 ? Math.ceil(step) : Math.floor(step); if (obj.offsetLeft == target) { // 停止動(dòng)畫(huà) 本質(zhì)是停止定時(shí)器 clearInterval(obj.timer); // 回調(diào)函數(shù)寫(xiě)到定時(shí)器結(jié)束里面 // if (callback) { // // 調(diào)用函數(shù) // callback(); // } callback && callback(); } // 把每次加1 這個(gè)步長(zhǎng)值改為一個(gè)慢慢變小的值 步長(zhǎng)公式:(目標(biāo)值 - 現(xiàn)在的位置) / 10 obj.style.left = obj.offsetLeft + step + 'px'; }, 15); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JS target與currentTarget區(qū)別說(shuō)明
target在事件流的目標(biāo)階段;currentTarget在事件流的捕獲,目標(biāo)及冒泡階段。只有當(dāng)事件流處在目標(biāo)階段的時(shí)候,兩個(gè)的指向才是一樣的,而當(dāng)處于捕獲和冒泡階段的時(shí)候,target指向被單擊的對(duì)象而currentTarget指向當(dāng)前事件活動(dòng)的對(duì)象(一般為父級(jí))。2011-08-08javascript 像素拼圖實(shí)現(xiàn)代碼
非常不錯(cuò)的像素拼圖效果2009-04-04QTreeWidget中MainWindow窗體中布局器不起作用詳解
本文主要介紹了QTreeWidget中MainWindow窗體中布局器不起作用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04細(xì)數(shù)promise與async/await的使用及區(qū)別說(shuō)明
這篇文章主要介紹了細(xì)數(shù)promise與async/await的使用及區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07JavaScript創(chuàng)建類(lèi)/對(duì)象的幾種方式概述及實(shí)例
JS中的對(duì)象強(qiáng)調(diào)的是一種復(fù)合類(lèi)型,JS中創(chuàng)建對(duì)象及對(duì)對(duì)象的訪問(wèn)是極其靈活的,下面與大家分享下創(chuàng)建類(lèi)/對(duì)象的幾種方式,感興趣的朋友可以了解下哈2013-05-05實(shí)現(xiàn)js保留小數(shù)點(diǎn)后N位的代碼
最近在做項(xiàng)目的時(shí)候,遇到要保留小數(shù)點(diǎn)后N位的問(wèn)題,經(jīng)過(guò)一番思索,最終完成了,這里記錄一下,下次需要直接就能拉出來(lái)用了2014-11-11