原生JS運(yùn)動(dòng)實(shí)現(xiàn)輪播圖
**基本原理:**通過(guò)控制包含n張圖片的ul的left值來(lái)實(shí)現(xiàn)圖片自動(dòng)運(yùn)動(dòng)的效果,其中列表中l(wèi)i元素的個(gè)數(shù)為n,第一個(gè)li和最后一個(gè)li里存放的圖片應(yīng)為同一張圖片,當(dāng)圖片運(yùn)動(dòng)到最后一張時(shí),將ul的left值設(shè)為0,即可達(dá)到圖片無(wú)線(xiàn)輪播的效果。
運(yùn)動(dòng)函數(shù)的實(shí)現(xiàn)
函數(shù)需傳入元素(即需要參與運(yùn)動(dòng)的元素)、目標(biāo)值(以對(duì)象的形式呈現(xiàn),如{left: 300})、callback(回調(diào)函數(shù))。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
//多物體多值運(yùn)動(dòng)+回調(diào)機(jī)制 function startMove(dom, attrObj, callback) { var key = true ; var iSpeed = null , iCur = null ; clearInterval(dom.timer); if (key) { dom.timer = setInterval( function () { //bStop用來(lái)判斷是否開(kāi)始執(zhí)行回調(diào)函數(shù) var bStop = true ; //判斷傳入目標(biāo)值中的“鍵”類(lèi)型是否為opacity for ( var attr in attrObj) { //若要改變的樣式為opacity,則將元素的opacity擴(kuò)大100被進(jìn)行操作 if (attr === 'opacity' ) { iCur = parseFloat(getStyle(dom, attr)) * 100; } else { iCur = parseInt(getStyle(dom, attr)); } //運(yùn)動(dòng)速度設(shè)為目標(biāo)值減去當(dāng)前值的一半,即當(dāng)前狀態(tài)離目標(biāo)值越接近,運(yùn)動(dòng)速度越小 iSpeed = (attrObj[attr] - iCur) / 2; //對(duì)速度進(jìn)行取整 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時(shí),元素的所有樣式均已達(dá)到目標(biāo)值,清理定時(shí)器并執(zhí)行回調(diào)函數(shù) if (bStop) { clearInterval(dom.timer); typeof callback == 'function' && callback(); } }, 30) } if (!key) { } } //用來(lái)獲取元素實(shí)時(shí)的樣式值 function getStyle(elem, prop){ if (window.getComputedStyle){ return window.getComputedStyle(elem, null )[prop]; } } |
HTML部分
HTML中包含一個(gè)div,用來(lái)顯示當(dāng)前要播放的圖片,該div中又包含一個(gè)ul(用來(lái)存放所有包含圖片的li)、三個(gè)div(其中兩個(gè)充當(dāng)圖片左右切換的按鈕,第三個(gè)存放圖片索引點(diǎn),通過(guò)點(diǎn)擊索引也可切換到要查看的圖片),代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
< 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)樣式表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
<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> |
圖片自動(dòng)運(yùn)動(dòng)及點(diǎn)擊運(yùn)動(dòng)事件綁定
要點(diǎn):
1、當(dāng)圖片運(yùn)動(dòng)到最后一張時(shí)(顯示圖片為第一張圖片),將ul的left值設(shè)為0即可實(shí)現(xiàn)無(wú)限輪播;
2、圖片每次運(yùn)動(dòng)的值為li的寬度;
3、圖片的運(yùn)動(dòng)需要一定的時(shí)間,因此在圖片運(yùn)動(dòng)過(guò)程中應(yīng)禁止產(chǎn)生其它定時(shí)器,否則會(huì)造成運(yùn)動(dòng)尺寸混亂而導(dǎo)致圖片輪播出現(xiàn)問(wèn)題,這里用lock來(lái)進(jìn)行實(shí)現(xiàn),在ul運(yùn)動(dòng)過(guò)程中將lock值設(shè)為false,運(yùn)動(dòng)結(jié)束后又將lock值設(shè)為true;
4、通過(guò)index值來(lái)實(shí)現(xiàn)索引顯示圖片功能,圖片輪播過(guò)程中,index初始值為0,當(dāng)圖片向右輪播時(shí)index值加1,圖片向左輪播時(shí),index值減1,index值為0時(shí),若讓圖片向左輪播,則將index值設(shè)為n(li個(gè)數(shù))并進(jìn)行輪播,而當(dāng)index值為3且圖片向右輪播時(shí),在ul運(yùn)動(dòng)完成后將index值設(shè)為0;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
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)) } //圖片運(yùn)動(dòng)過(guò)程中改變index點(diǎn)的樣式 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 //默認(rèn)輪播方向 'left->right' / undefined //點(diǎn)擊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); }) } } } |
以上即為通過(guò)原生JS運(yùn)動(dòng)所實(shí)現(xiàn)的圖片輪播。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/Bean_s/article/details/112002232