如何使用JavaScript實(shí)現(xiàn)無縫滾動(dòng)自動(dòng)播放輪播圖效果
在一些項(xiàng)目開發(fā)中,我們經(jīng)常需要使用到輪播圖,但是沒有深入學(xué)習(xí)的情況下做輪播圖是非常困難的。

思路
分成小問題來解決
1. 動(dòng)態(tài)生成序號(hào)12345

頁面有多少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)左右箭頭播放上一張下一張(無縫滾動(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ù)量 還沒有放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();
}
// 無縫滾動(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的兼容性問題
// 設(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è)事件的兼容性問題
// 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;
}
}
// 獲取頁面滾動(dòng)距離的瀏覽器兼容性問題
// 獲取頁面滾動(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)在頁面的位置,處理瀏覽器兼容性
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) {
// 通過判斷,保證頁面上只有一個(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)無縫滾動(dòng)自動(dòng)播放輪播圖效果的文章就介紹到這了,更多相關(guān)js無縫滾動(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)帶播放列表的音樂播放器實(shí)例分享
- js實(shí)現(xiàn)列表自動(dòng)滾動(dòng)循環(huán)播放
相關(guān)文章
javascript的漸進(jìn)增強(qiáng)與平穩(wěn)退化淺談
2013-11-11
layui表格數(shù)據(jù)復(fù)選框回顯設(shè)置方法
今天小編就為大家分享一篇layui表格數(shù)據(jù)復(fù)選框回顯設(shè)置方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09
JS動(dòng)態(tài)插入腳本和插入引用外部鏈接腳本的方法
js 動(dòng)態(tài)插入腳本的是在頁面加載時(shí)不存在,但將來的某一時(shí)刻通過修改該 DOM 動(dòng)態(tài)添加的腳本。接下來通過本文給大家介紹JS動(dòng)態(tài)插入腳本和插入引用外部鏈接腳本,需要的朋友可以參考下2018-05-05
JavaScript中SQL語句的應(yīng)用實(shí)現(xiàn)
最近一直在用javascript在做項(xiàng)目 可是做著做著 感覺很多功能代碼都是重復(fù)的。2010-05-05
JavaScript判斷兩個(gè)對(duì)象是否相等的方法總結(jié)
判斷兩個(gè)對(duì)象是否相等是js中的一個(gè)很常見的內(nèi)容,不同的編程語言和環(huán)境可能會(huì)有不同的方式來實(shí)現(xiàn)這一目標(biāo),在 JavaScript 中,判斷兩個(gè)對(duì)象是否相等主要有以下幾種方法,感興趣的小伙伴跟著小編一起來看看吧2024-08-08
js實(shí)現(xiàn)tab選項(xiàng)卡函數(shù)代碼
js實(shí)現(xiàn)tab選項(xiàng)卡函數(shù)代碼,需要的朋友可以參考下,這樣的代碼也是比較常用的,相當(dāng)原理也比較簡(jiǎn)單。2010-04-04

