js代碼實(shí)現(xiàn)輪播圖
本文實(shí)例為大家分享了js實(shí)現(xiàn)輪播圖的具體代碼,供大家參考,具體內(nèi)容如下
又從頭到尾把輪播圖研究了一遍,感覺理解更深刻了。
就怕自己搞不懂,分析了各個步驟的思路,為啥用,怎么用。
總算搞清楚了。
話不多說,干貨奉上.
效果圖:
//1,左右按鈕初始隱藏 鼠標(biāo)進(jìn)入box 按鈕顯示 鼠標(biāo)離開box 按鈕隱藏 //獲取元素 var box = document.getElementById('box'); var leftbtn = document.getElementById('leftbtn'); var rigbtn = document.getElementById('rigbtn'); //因?yàn)閳D片寬度是多個事件需要用到 所以要定義為全局變量 var pic_width = box.clientWidth; //注冊事件 box.addEventListener('mouseenter', function() { leftbtn.style.display = 'block'; rigbtn.style.display = 'block'; //清除定時器 停止自動播放 clearInterval(timer); //停止播放后 清空定時器變量 提升運(yùn)行效率 timer = null; }); box.addEventListener('mouseleave', function() { leftbtn.style.display = 'none'; rigbtn.style.display = 'none'; //timer在11條里聲明過了 這里就不需要再加var進(jìn)行聲明了 timer = setInterval(function() { rigbtn.click(); }, 1500); }); //6,創(chuàng)建動畫函數(shù)animate 點(diǎn)擊小圓點(diǎn) 圖片會移動 //因?yàn)閳D片需要緩慢移動到目標(biāo)位置 而不是瞬移 所以需要讓動畫函數(shù)帶緩動效果 function animate(obj, target, callback) { //obj是移動的對象 target是移動的目標(biāo)位置 callback是回調(diào)函數(shù) clearInterval(obj.timer); //創(chuàng)建緩動函數(shù) 緩動的核心思想就是把移動到目標(biāo)位置的距離分成若干小步 //一定時間內(nèi)走一小步,讓這個距離在若干時間完成若干小步后走完 function move() { //定義每一小步走的距離 把一次移動到目標(biāo)位置的距離分為10份 //每一份就是一個step var step = (target - obj.offsetLeft) / 10; //step可能不是整數(shù) 導(dǎo)致最終移動距離有誤差 //所以要把每一步的step變成整數(shù) //如果step是正數(shù) 就取大于step的最小整數(shù) //如果step是負(fù)數(shù) 就取小于step的最大整數(shù) 用Math()的知識 /*if(step > 0) { step = Math.ceil(step);//向上取整 } else { step = Math.floor(step);//向下取整 }*/ //可以將上面的if else語句簡化為三元運(yùn)算符 step = step > 0 ? Math.ceil(step) : Math.floor(step); //如果走到了目標(biāo)位置 就清除定時器 if(obj.offsetLeft == target) { clearInterval(obj.timer); //因?yàn)榛卣{(diào)函數(shù)是定時器結(jié)束后再調(diào)用函數(shù) //所以這里清除定時器后 需要判斷一下是否有回調(diào)函數(shù) 有就調(diào)用 沒有就不調(diào)用 /*if(callback) { callback(); }*/ //上面的判斷語句可以簡化為 callback&&callback(); } //把每一小步移動的距離和offsetLeft之和,給obj的left值 //注意,這里obj.style.left對應(yīng)的是數(shù)值+像素單位,一定不要忘了+'px' obj.style.left = obj.offsetLeft + step + 'px'; } //給obj創(chuàng)建專屬的定時器 //用定時器實(shí)現(xiàn)一定時間走一小步的結(jié)果 這里是40毫秒移動一個step的距離 //注意,專屬定時器不需要用var了 obj.timer = setInterval(move, 40); } //2,動態(tài)添加小圓點(diǎn) 圖片的數(shù)量就是小圓點(diǎn)的個數(shù) //獲取元素 var ul01 = document.getElementById('ul01'); var ul02 = document.getElementById('ul02'); //添加多個li 用for循環(huán) for(var i = 0; i < ul01.children.length; i++) { //創(chuàng)建元素creLi var creLi = document.createElement('li'); //3,創(chuàng)建自定義屬性data-index 用來獲取小圓點(diǎn)的索引號 creLi.setAttribute('data-index', i); //添加元素 ul02.appendChild(creLi); //4,當(dāng)前點(diǎn)擊的小圓點(diǎn) 顏色發(fā)生變化 創(chuàng)建類urrent //因?yàn)閳D片默認(rèn)開始顯示第一張 所以先讓第一個小圓點(diǎn)小時current類 ul02.children[0].className = 'current'; //5,給小圓點(diǎn)創(chuàng)建點(diǎn)擊事件 點(diǎn)擊小圓點(diǎn) 當(dāng)前點(diǎn)擊的小圓點(diǎn)變色 //用排他思想 for循環(huán) //注冊點(diǎn)擊事件 creLi.addEventListener('click', function() { //干掉所有人 for(var i = 0; i < ul02.children.length; i++) { ul02.children[i].className = ''; } //留下我自己 this.className = 'current'; //7,點(diǎn)擊小圓點(diǎn) 圖片跟著動 調(diào)用動畫函數(shù) //分析 點(diǎn)擊圓點(diǎn)1 圖片向左移動0個圖片的寬度box.clientWidth //點(diǎn)擊圓點(diǎn)2 圖片向左移動1個圖片的寬度 以此類推 //圖片移動的距離 就是 當(dāng)前被點(diǎn)擊圓點(diǎn)的索引號乘以圖片的寬度 //獲取自定義屬性 當(dāng)前被點(diǎn)擊的小圓點(diǎn)的索引號 var index = this.getAttribute('data-index'); num = index; circle = index; animate(ul01, -index*pic_width); }); } //8,右側(cè)按鈕 //8.1 點(diǎn)擊右側(cè)按鈕 圖片向左移動 //點(diǎn)擊1次 圖片向左移動1個圖片寬度 顯示圖片2 //點(diǎn)擊2次 向左移動2個圖片寬度 顯示圖片3 以此類推 //當(dāng)顯示到第3張圖片即最后一張圖片時 再點(diǎn)擊右側(cè)按鈕 會顯示空白 //重點(diǎn): 實(shí)現(xiàn)無縫鏈接,即當(dāng)顯示到最后一張圖片時 再點(diǎn)擊右側(cè)按鈕 會顯示圖片1 //怎么做 在圖片3后面克隆一張圖片1 //顯示圖片3時 再點(diǎn)擊按鈕 ul01繼續(xù)向左移動 顯示圖片1 //然后迅速跳轉(zhuǎn)到跳轉(zhuǎn)到圖片1 讓ul01.style.left歸零 //設(shè)置次數(shù)變量num var num = 0; //克隆圖片1 先克隆 再添加 注意 克隆圖片也是全局事件 不是局部的 var liCopy = ul01.children[0].cloneNode(true)//深克隆 ul01.appendChild(liCopy);//添加新的li后,注意取css里修改ul01的寬度 //console.log(ul01.children.length); 元素個數(shù)變成了4 //獲取元素rigbtn var rigbtn = document.getElementById('rigbtn'); //給按鈕點(diǎn)擊事件安裝節(jié)流閥 var flag = true; //左右按鈕都要用 所以設(shè)置全局變量 //注冊點(diǎn)擊事件 rigbtn.addEventListener('click', function() { if(flag) { //初始狀態(tài) 先把節(jié)流閥關(guān)了 讓自動播放的圖片播放完一張圖片前 點(diǎn)擊按鈕無效 flag = false; //先做個判斷 //點(diǎn)擊第2次的時候 顯示圖片3 再點(diǎn)擊 就顯示克隆的圖片1 //這時候 讓ul01位置歸零 讓num的值歸零以便從頭開始 if(num == ul01.children.length - 1) { ul01.style.left = 0; num = 0; } //點(diǎn)擊1次 移動距離就是1*pic_width //點(diǎn)擊1次 讓num自增1 num++; //注意 這里如果先自增 再做判斷 //會出現(xiàn)一個bug 就是當(dāng)再次顯示圖片1時 點(diǎn)擊無效 重新點(diǎn)擊才會顯示圖片2 //因?yàn)辄c(diǎn)擊第三次時 本來應(yīng)該跳轉(zhuǎn)到圖片1的 結(jié)果num被歸零了 再點(diǎn)擊還是顯示圖片1 //調(diào)用動畫函數(shù) animate(ul01, -num*pic_width, function() { //function(){}是回調(diào)函數(shù) //動畫結(jié)束一個動作后 即播放完該圖片后 再回頭打開節(jié)流閥 讓下一次點(diǎn)擊生效 flag = true; }); circle++; if(circle == ul02.children.length) { circle = 0; } //因?yàn)檫@段排他思想的小圓點(diǎn)代碼重復(fù)使用 所以可以封裝成一個函數(shù)進(jìn)行調(diào)用 /*for(var i = 0; i < ul02.children.length; i++) { ul02.children[i].className = ''; } ul02.children[circle].className = 'current';*/ cir(); } }); function cir() { for(var i = 0; i < ul02.children.length; i++) { ul02.children[i].className = ''; } ul02.children[circle].className = 'current'; } //9,點(diǎn)擊按鈕 圖片移動 小圓點(diǎn)跟著移動 點(diǎn)擊小圓點(diǎn) 圖片跟著移動 num次數(shù)也變化 //讓圖片 小圓點(diǎn) 按鈕次數(shù) 一起變化的核心 就是圖片動 num變化 小圓點(diǎn)當(dāng)前的current類發(fā)生變化 //即 圖片移動 當(dāng)前小圓點(diǎn)變色 點(diǎn)擊按鈕 當(dāng)前小圓點(diǎn)變色 //當(dāng)前小圓點(diǎn)變色 圖片移動 按鈕次數(shù)發(fā)生變化 num index 圖片距離 一起變化 //但是index是局部變量 怎么讓三者綁定呢 //就要重新創(chuàng)建一個全局變量 代替index 作為小圓點(diǎn)當(dāng)前的索引號 讓三者綁定 var circle = 0; //10,點(diǎn)擊左側(cè)按鈕 //和右側(cè)按鈕點(diǎn)擊事件的代碼基本相同 但是方向相反 需要修改一些數(shù)據(jù) //直接把右側(cè)按鈕點(diǎn)擊事件的代碼復(fù)制過來 然后修改數(shù)據(jù) //獲取元素leftbtn var leftbtn = document.getElementById('leftbtn'); //注冊點(diǎn)擊事件 leftbtn.addEventListener('click', function() { //同理,給左側(cè)按鈕也加個節(jié)流閥 if(flag) { flag = false; //先做個判斷 //開始時 未點(diǎn)擊 num為0 if(num == 0) { num = ul01.children.length-1; ul01.style.left = -num*pic_width + 'px'; } //點(diǎn)擊左側(cè)按鈕時 num自減 num--; animate(ul01, -num*pic_width, function() { flag = true; }); circle--; if(circle < 0) { circle = ul02.children.length - 1; } //因?yàn)檫@段排他思想的小圓點(diǎn)代碼重復(fù)使用 所以可以封裝成一個函數(shù)進(jìn)行調(diào)用 /*for(var i = 0; i < ul02.children.length; i++) { ul02.children[i].className = ''; } ul02.children[circle].className = 'current';*/ cir(); } }); //11,圖片自動播放 相當(dāng)于每隔一定時間 用定時器調(diào)用點(diǎn)擊右側(cè)按鈕的時間 var timer = setInterval(function() { rigbtn.click(); }, 1500); //12,鼠標(biāo)進(jìn)入box 停止自動播放 鼠標(biāo)離開box 繼續(xù)自動播放 //13,節(jié)流閥 控制圖片播放的頻率 //當(dāng)前 快速點(diǎn)擊按鈕 圖片高速播放 timer定時器還沒執(zhí)行結(jié)束 就開始播放下一張圖片了 //用flag控制 flag為true 打開節(jié)流閥 啟用定時器 播放圖片 //flag為false 關(guān)閉節(jié)流閥 關(guān)閉的定時器 點(diǎn)擊按鈕無效 停止播放圖片 //給按鈕點(diǎn)擊事件安裝節(jié)流閥
精彩專題分享:jQuery圖片輪播 JavaScript圖片輪播 Bootstrap圖片輪播
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 原生js實(shí)現(xiàn)簡單輪播圖
- js輪播圖之旋轉(zhuǎn)木馬效果
- javascript實(shí)現(xiàn)點(diǎn)擊按鈕切換輪播圖功能
- js代碼編寫無縫輪播圖
- 如何使用JavaScript實(shí)現(xiàn)無縫滾動自動播放輪播圖效果
- JS+css3實(shí)現(xiàn)幻燈片輪播圖
- js實(shí)現(xiàn)輪播圖效果 純js實(shí)現(xiàn)圖片自動切換
- js實(shí)現(xiàn)無縫輪播圖插件封裝
- 原生JS實(shí)現(xiàn)無縫輪播圖片
- js實(shí)現(xiàn)輪播圖特效
- js實(shí)現(xiàn)無縫輪播圖特效
- JavaScript 實(shí)現(xiàn)輪播圖特效的示例
相關(guān)文章
使用uniapp打包微信小程序時主包和vendor.js過大解決(uniCloud的插件分包)
每個使用分包小程序必定含有一個主包,所謂的主包,即放置默認(rèn)啟動頁面/TabBar頁面,以及一些所有分包都需用到公共資源/JS 腳本,下面這篇文章主要給大家介紹了關(guān)于使用uniapp打包微信小程序時主包和vendor.js過大解決的相關(guān)資料,,需要的朋友可以參考下2023-02-02JS字符串與二進(jìn)制的相互轉(zhuǎn)化實(shí)例代碼詳解
這篇文章主要介紹了JS字符串與二進(jìn)制的相互轉(zhuǎn)化 ,在文中給大家提到了Js之字符串和字節(jié)碼之間的相互轉(zhuǎn)換,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-06-06laydate 顯示結(jié)束時間不小于開始時間的實(shí)例
下面小編就為大家?guī)硪黄猯aydate 顯示結(jié)束時間不小于開始時間的實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08JavaScript高級程序設(shè)計(jì) 閱讀筆記(二十一) JavaScript中的XML
雖然XML和DOM已經(jīng)變成Web開發(fā)的重要組成部分,但目前僅IE跟Mozilla支持客戶端的XML處理2012-09-09網(wǎng)頁自動刷新,不產(chǎn)生嗒嗒聲的一個解決方法
網(wǎng)頁自動刷新,不產(chǎn)生嗒嗒聲的一個解決方法...2007-03-03