原生JS运动实现轮播图
**基本原理:**通过控制包含n张图片的ul的left值来实现图片自动运动的效果,其中列表中li元素的个数为n,第一个li和最后一个li里存放的图片应为同一张图片,当图片运动到最后一张时,将ul的left值设为0,即可达到图片无线轮播的效果。
运动函数的实现
函数需传入元素(即需要参与运动的元素)、目标值(以对象的形式呈现,如{left: 300})、callback(回调函数)。
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
|
//多物体多值运动+回调机制
function startMove(dom, attrObj, callback) {
var key = true ;
var iSpeed = null ,
iCur = null ;
clearInterval(dom.timer);
if (key) {
dom.timer = setInterval( function () {
//bStop用来判断是否开始执行回调函数
var bStop = true ;
//判断传入目标值中的“键”类型是否为opacity
for ( var attr in attrObj) {
//若要改变的样式为opacity,则将元素的opacity扩大100被进行操作
if (attr === 'opacity' ) {
iCur = parseFloat(getStyle(dom, attr)) * 100;
} else {
iCur = parseInt(getStyle(dom, attr));
}
//运动速度设为目标值减去当前值的一半,即当前状态离目标值越接近,运动速度越小
iSpeed = (attrObj[attr] - iCur) / 2;
//对速度进行取整
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 ;
}
}
//当bStop为true时,元素的所有样式均已达到目标值,清理定时器并执行回调函数
if (bStop) {
clearInterval(dom.timer);
typeof callback == 'function' && callback();
}
}, 30)
}
if (!key) {
}
}
//用来获取元素实时的样式值
function getStyle(elem, prop){
if (window.getComputedStyle){
return window.getComputedStyle(elem, null )[prop];
}
}
|
HTML部分
HTML中包含一个div,用来显示当前要播放的图片,该div中又包含一个ul(用来存放所有包含图片的li)、三个div(其中两个充当图片左右切换的按钮,第三个存放图片索引点,通过点击索引也可切换到要查看的图片),代码如下:
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代码
此处采用的为内联样式表
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>
|
图片自动运动及点击运动事件绑定
要点:
1、当图片运动到最后一张时(显示图片为第一张图片),将ul的left值设为0即可实现无限轮播;
2、图片每次运动的值为li的宽度;
3、图片的运动需要一定的时间,因此在图片运动过程中应禁止产生其它定时器,否则会造成运动尺寸混乱而导致图片轮播出现问题,这里用lock来进行实现,在ul运动过程中将lock值设为false,运动结束后又将lock值设为true;
4、通过index值来实现索引显示图片功能,图片轮播过程中,index初始值为0,当图片向右轮播时index值加1,图片向左轮播时,index值减1,index值为0时,若让图片向左轮播,则将index值设为n(li个数)并进行轮播,而当index值为3且图片向右轮播时,在ul运动完成后将index值设为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))
}
//图片运动过程中改变index点的样式
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
//默认轮播方向 'left->right' / undefined
//点击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);
})
}
}
}
|
以上即为通过原生JS运动所实现的图片轮播。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/Bean_s/article/details/112002232