如何使用JavaScript實(shí)現(xiàn)無(wú)縫滾動(dòng)自動(dòng)播放輪播圖效果
在一些項(xiàng)目開發(fā)中,我們經(jīng)常需要使用到輪播圖,但是沒(méi)有深入學(xué)習(xí)的情況下做輪播圖是非常困難的。
思路
分成小問(wèn)題來(lái)解決
1. 動(dòng)態(tài)生成序號(hào)12345
頁(yè)面有多少li(圖片),就有多少序號(hào)
2. 點(diǎn)擊序號(hào)、顯示高亮、切換圖片
2.1 給序號(hào)注冊(cè)onclick事件
2.2 取消其他序號(hào)高亮顯示,讓當(dāng)前點(diǎn)擊的序號(hào)高亮顯示
2.3 點(diǎn)擊序號(hào),動(dòng)畫的方式切換到當(dāng)前點(diǎn)擊的圖片位置(設(shè)置自定義屬性,記錄當(dāng)前索引,有了索引就可用動(dòng)畫進(jìn)行移動(dòng))
3. 鼠標(biāo)放到盒子上的時(shí)候顯示左右箭頭,移開時(shí)候隱藏
onmouseenter和onmouseleave
4. 實(shí)現(xiàn)左右箭頭播放上一張下一張(無(wú)縫滾動(dòng))
5. 隔多少時(shí)間自動(dòng)播放
setInterval
和 element1..click()
聯(lián)合即可實(shí)現(xiàn)
代碼: index.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> * { padding: 0; margin: 0; list-style: none; border: 0; } body { margin: 0; background-color: rgb(55, 190, 89); } .all { width: 500px; height: 200px; padding: 4px; margin: 100px auto; position: relative; background-color: #fff; border-radius: 20px; } .screen { width: 500px; height: 200px; border-radius: 17px; overflow: hidden; position: relative; } .screen li { width: 500px; height: 200px; overflow: hidden; float: left; } .screen ul { position: absolute; left: 0; top: 0px; width: 3000px; } .all ol { position: absolute; right: 180px; bottom: 10px; line-height: 20px; text-align: center; } .all ol li { float: left; width: 20px; height: 20px; background: #fff; border-radius: 10px; border: 1px solid #ccc; margin-left: 10px; cursor: pointer; opacity: 0.5; /* 透明度 */ } .all ol li.current { opacity: 1.0; } #arr { display: none; z-index: 1000; } #arr span { width: 40px; height: 40px; position: absolute; left: 5px; top: 50%; margin-top: -20px; background: #000; cursor: pointer; line-height: 40px; text-align: center; font-weight: bold; font-family: '黑體'; font-size: 30px; color: #fff; opacity: 0.5; border: 1px solid #fff; border-radius: 5px; } #arr #right { right: 5px; left: auto; } </style> </head> <body> <div class="all" id='box'> <div class="screen"> <ul> <li><img src="images/wf1.jpg" width="500" height="200" /></li> <li><img src="images/wf2.jpg" width="500" height="200" /></li> <li><img src="images/wf3.jpg" width="500" height="200" /></li> <li><img src="images/wf4.jpg" width="500" height="200" /></li> <li><img src="images/wf5.jpg" width="500" height="200" /></li> </ul> <ol> </ol> </div> <div id="arr"><span id="left"><</span><span id="right">></span></div> </div> <script src="common.js"></script> <script src="animate.js"></script> <script src="index.js"></script> </body> </html>
index.js
//獲取元素 var box = my$('box'); var screen = box.children[0]; var ul = screen.children[0]; var ol = screen.children[1] //獲取箭頭 var arr = my$('arr'); var arrLeft = my$('left'); var arrRight = my$('right'); var count = ul.children.length; /* 獲取圖片數(shù)量 還沒(méi)有放cloneLi,所以數(shù)值是5*/ var imgWidth = screen.offsetWidth; /* 獲取的圖片(盒子)的寬高 */ //1.動(dòng)態(tài)生成序號(hào) for (i = 0; i < count; i++) { // 在ol內(nèi)創(chuàng)建li var li = document.createElement('li'); ol.appendChild(li); // li內(nèi)賦予數(shù)值 setInnerText(li, i + 1); li.onclick = liClick; // 設(shè)置標(biāo)簽的自定義屬性(創(chuàng)建索引) li.setAttribute('index', i); } // 2.點(diǎn)擊序號(hào),切換,顯示高亮 function liClick() { // 取消其他的li的高亮,顯示當(dāng)前l(fā)i高亮 for (i = 0; i < ol.children.length; i++) { var li = ol.children[i]; li.className = ''; this.className = 'current'; } // 獲取的自定義屬性是字符串類型,要轉(zhuǎn)成整數(shù) var liIndex = parseInt(this.getAttribute('index')); animate(ul, -liIndex * imgWidth); //使得后面定義的全局變量index等于li的屬性liIndex index = liIndex; } //ol內(nèi)的第一個(gè)li顯示高亮色 ol.children[0].className = 'current'; //3.鼠標(biāo)放上去的時(shí)候顯示箭頭 // onmouseover和onmouseout會(huì)觸發(fā)事件冒泡;onmouseleave和onmouseenter不會(huì)觸發(fā)事件冒泡 box.onmouseenter = function () { arr.style.display = 'block'; clearInterval(timeId); } box.onmouseleave = function () { arr.style.display = 'none'; timeId = setInterval(function () { arrRight.click(); }, 2500) } // 4.實(shí)現(xiàn)上一張,下一張的功能 var index = 0; //第一張圖片的索引 arrRight.onclick = function () { // 判斷是否是克隆的第一張圖片,如果是克隆的第一張圖片,此時(shí)修改ul的坐標(biāo),顯示真正的第一張圖片 if (index === count) { ul.style.left = '0px'; index = 0; } // 如果是最后一張圖片,不讓index++ index++; // 有5張圖片,但是還有一張克隆的圖片,克隆圖片索引是5 if (index < count) { //獲取圖片對(duì)應(yīng)的序號(hào),讓序號(hào)進(jìn)行點(diǎn)擊 ol.children[index].click(); } else { animate(ul, -index * imgWidth); // 取消所有的高亮現(xiàn)實(shí),讓第一個(gè)序號(hào)高亮顯示 for (var i = 0; i < ol.children.length; i++) { var li = ol.children[i]; li.className = ''; } ol.children[0].className = 'current'; } // } arrLeft.onclick = function () { if (index === 0) { index = count; ul.style.left = -index * imgWidth + 'px'; } index--; ol.children[index].click(); } // 無(wú)縫滾動(dòng) var firstLi = ul.children[0]; // 克隆li //cloneNode() 復(fù)制節(jié)點(diǎn):參數(shù) true 復(fù)制節(jié)點(diǎn)中的內(nèi)容 ;false 只復(fù)制當(dāng)前節(jié)點(diǎn),不復(fù)制里面的內(nèi)容 var cloneLi = firstLi.cloneNode(true); ul.appendChild(cloneLi) // 5.自動(dòng)播放 var timeId = setInterval(function () { // 切換到下一張圖片 arrRight.click(); }, 2500)
common.js
function my$(id) { return document.getElementById(id); } // 處理瀏覽器兼容性 // 獲取第一個(gè)子元素 function getFirstElementChild(element) { var node, nodes = element.childNodes, i = 0; while (node = nodes[i++]) { if (node.nodeType === 1) { return node; } } return null; } // 處理瀏覽器兼容性 // 獲取下一個(gè)兄弟元素 function getNextElementSibling(element) { var el = element; while (el = el.nextSibling) { if (el.nodeType === 1) { return el; } } return null; } // 處理innerText和textContent的兼容性問(wèn)題 // 設(shè)置標(biāo)簽之間的內(nèi)容 function setInnerText(element, content) { // 判斷當(dāng)前瀏覽器是否支持 innerText if (typeof element.innerText === 'string') { element.innerText = content; } else { element.textContent = content; } } // 處理注冊(cè)事件的兼容性問(wèn)題 // eventName, 不帶on, click mouseover mouseout function addEventListener(element, eventName, fn) { // 判斷當(dāng)前瀏覽器是否支持addEventListener 方法 if (element.addEventListener) { element.addEventListener(eventName, fn); // 第三個(gè)參數(shù) 默認(rèn)是false } else if (element.attachEvent) { element.attachEvent('on' + eventName, fn); } else { // 相當(dāng)于 element.onclick = fn; element['on' + eventName] = fn; } } // 處理移除事件的兼容性處理 function removeEventListener(element, eventName, fn) { if (element.removeEventListener) { element.removeEventListener(eventName, fn); } else if (element.detachEvent) { element.detachEvent('on' + eventName, fn); } else { element['on' + eventName] = null; } } // 獲取頁(yè)面滾動(dòng)距離的瀏覽器兼容性問(wèn)題 // 獲取頁(yè)面滾動(dòng)出去的距離 function getScroll() { var scrollLeft = document.body.scrollLeft || document.documentElement.scrollLeft; var scrollTop = document.body.scrollTop || document.documentElement.scrollTop; return { scrollLeft: scrollLeft, scrollTop: scrollTop } } // 獲取鼠標(biāo)在頁(yè)面的位置,處理瀏覽器兼容性 function getPage(e) { var pageX = e.pageX || e.clientX + getScroll().scrollLeft; var pageY = e.pageY || e.clientY + getScroll().scrollTop; return { pageX: pageX, pageY: pageY } } //格式化日期對(duì)象,返回yyyy-MM-dd HH:mm:ss的形式 function formatDate(date) { // 判斷參數(shù)date是否是日期對(duì)象 // instanceof instance 實(shí)例(對(duì)象) of 的 // console.log(date instanceof Date); if (!(date instanceof Date)) { console.error('date不是日期對(duì)象') return; } var year = date.getFullYear(), month = date.getMonth() + 1, day = date.getDate(), hour = date.getHours(), minute = date.getMinutes(), second = date.getSeconds(); month = month < 10 ? '0' + month : month; day = day < 10 ? '0' + day : day; hour = hour < 10 ? '0' + hour : hour; minute = minute < 10 ? '0' + minute : minute; second = second < 10 ? '0' + second : second; return year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second; } // 獲取兩個(gè)日期的時(shí)間差 function getInterval(start, end) { // 兩個(gè)日期對(duì)象,相差的毫秒數(shù) var interval = end - start; // 求 相差的天數(shù)/小時(shí)數(shù)/分鐘數(shù)/秒數(shù) var day, hour, minute, second; // 兩個(gè)日期對(duì)象,相差的秒數(shù) // interval = interval / 1000; interval /= 1000; day = Math.round(interval / 60 / 60 / 24); hour = Math.round(interval / 60 / 60 % 24); minute = Math.round(interval / 60 % 60); second = Math.round(interval % 60); return { day: day, hour: hour, minute: minute, second: second } }
animage.js
// var timerId = null; // 封裝動(dòng)畫的函數(shù) function animate(element, target) { // 通過(guò)判斷,保證頁(yè)面上只有一個(gè)定時(shí)器在執(zhí)行動(dòng)畫 if (element.timerId) { clearInterval(element.timerId); element.timerId = null; } element.timerId = setInterval(function () { // 步進(jìn) 每次移動(dòng)的距離 var step = 10; // 盒子當(dāng)前的位置 var current = element.offsetLeft; // 當(dāng)從400 到 800 執(zhí)行動(dòng)畫 // 當(dāng)從800 到 400 不執(zhí)行動(dòng)畫 // 判斷如果當(dāng)前位置 > 目標(biāo)位置 此時(shí)的step 要小于0 if (current > target) { step = - Math.abs(step); } // Math.abs(current - target) <= Math.abs(step) if (Math.abs(current - target) <= Math.abs(step)) { // 讓定時(shí)器停止 clearInterval(element.timerId); // 讓盒子到target的位置 element.style.left = target + 'px'; return; } // 移動(dòng)盒子 current += step; element.style.left = current + 'px'; }, 5); }
總結(jié)
到此這篇關(guān)于如何使用JavaScript實(shí)現(xiàn)無(wú)縫滾動(dòng)自動(dòng)播放輪播圖效果的文章就介紹到這了,更多相關(guān)js無(wú)縫滾動(dòng)自動(dòng)播放內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 基于JavaScript實(shí)現(xiàn)新增內(nèi)容滾動(dòng)播放效果附完整代碼
- 基于JavaScript怎么實(shí)現(xiàn)讓歌詞滾動(dòng)播放
- javascript+html5實(shí)現(xiàn)仿flash滾動(dòng)播放圖片的方法
- JS幻燈片可循環(huán)播放可平滑旋轉(zhuǎn)帶滾動(dòng)導(dǎo)航(自寫)
- javascript實(shí)現(xiàn)圖片循環(huán)漸顯播放的方法
- vue+video.js實(shí)現(xiàn)視頻播放列表
- JavaScript實(shí)現(xiàn)帶播放列表的音樂(lè)播放器實(shí)例分享
- js實(shí)現(xiàn)列表自動(dòng)滾動(dòng)循環(huán)播放
相關(guān)文章
input鏈接頁(yè)面、打開新網(wǎng)頁(yè)等等的具體實(shí)現(xiàn)
input可以鏈接到某頁(yè)、返回、打開新網(wǎng)頁(yè)、打開無(wú)邊框的新窗口等等,本文整理了一些,感興趣的朋友可以參考下2013-12-12

JavaScript初學(xué)者應(yīng)注意的七個(gè)細(xì)節(jié)小結(jié)

javascript中利用數(shù)組實(shí)現(xiàn)的循環(huán)隊(duì)列代碼

JavaScript如何獲取父級(jí)元素和子級(jí)元素代碼示例