JavaScript实现轮播图方法,代码简单
轮播图有很多种实现方法,这是其中一种最清晰的方法。思路很清晰,代码很简单,欢迎大佬多指教。
效果图
先来看下效果图,嫌麻烦就不用具体图片来实现了,主要是理清思路。(自动轮播,左右按钮切换图片,小圆点切换图片,鼠标移入暂停轮播,鼠标移出继续轮播)
HTML
首先是html内容,布局很简单,一个图片列表,一个点列表,两个按钮。注意data-index使用HTML5中的data-xx属性来嵌入自定义数据(下面JS代码会提到)。记得给默认显示的图片和对应的小圆点加上active类哦。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
< div class = "wrap" > < ul class = "list" > < li class = "item active" >0</ li > < li class = "item" >1</ li > < li class = "item" >2</ li > < li class = "item" >3</ li > < li class = "item" >4</ li > </ ul > < ul class = "pointList" > < li class = "point active" data-index = 0 ></ li > < li class = "point" data-index = 1 ></ li > < li class = "point" data-index = 2 ></ li > < li class = "point" data-index = 3 ></ li > < li class = "point" data-index = 4 ></ li > </ ul > < button class = "btn" id = "leftBtn" > < </ button > < button class = "btn" id = "rightBtn" > > </ button > </ div > |
CSS
思路:父容器list相对定位,item绝对定位,实现让所有图片重叠在父容器内。利用z-index来设置图片高度,图片高度最高会显示在顶层上。那么整个容器中,左右切换按钮和小圆点始终要在最顶层,不能被图片覆盖,所以他们的z-index一定要比图片高。active是一个样式,给某张图片绑定这个样式就能在最上层显示。然后就是图片切换的渐变效果,opacity完全不透明到透明,再加个transition动画效果。最后就是cursor给小圆点添加“小手指”,其他就没什么好说的了。
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
<style> .wrap { width : 800px ; height : 400px ; position : relative ; } .list { width : 800px ; height : 400px ; position : relative ; padding-left : 0px ; } .item { width : 100% ; height : 100% ; list-style : none ; position : absolute ; left : 0 ; opacity: 0 ; transition: all . 8 s; } .item:nth-child( 1 ) { background-color : skyblue; } .item:nth-child( 2 ) { background-color : yellowgreen; } .item:nth-child( 3 ) { background-color : rebeccapurple; } .item:nth-child( 4 ) { background-color : pink; } .item:nth-child( 5 ) { background-color : orange; } .item.active { z-index : 10 ; opacity: 1 ; } .btn { width : 60px ; height : 100px ; z-index : 100 ; top : 150px ; position : absolute ; } #leftBtn { left : 0px ; } #rightBtn { right : 0px ; } .pointList { list-style : none ; padding-left : 0px ; position : absolute ; right : 20px ; bottom : 20px ; z-index : 200 ; } .point { width : 10px ; height : 10px ; background-color : antiquewhite; border-radius: 100% ; float : left ; margin-right : 8px ; border-style : solid ; border-width : 2px ; border-color : slategray; cursor : pointer ; } .point.active{ background-color : cadetblue; } </style> |
Javascript
Index可以说是整个代码里面的"核心",先封装一个清除active的方法,这里面要清除图片的active(显示在最上层),比如切换到下一张图上张图的active就要清除。还有point的active(图片对应小圆点改变样式)。然后goIndex这个方法就是给图片和对应的小圆点同时加上active,左右按钮绑定的方法就不说了。
用getAttribute拿到刚才给li标签绑定的data-index属性,绑定图片index = pointindex,就能实现点击小圆点图片切换了。由于上面goIndex方法早已经绑定好了给图片添加active样式的时候也给小圆点添加的样式了,就可以实现图片切换小圆点跟随变化的效果。
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
<script> var items = document.querySelectorAll( ".item" ); //图片节点 var points = document.querySelectorAll( ".point" ) //点 var left = document.getElementById( "leftBtn" ); var right = document.getElementById( "rightBtn" ); var all = document.querySelector( ".wrap" ) var index = 0; var time = 0; //定时器跳转参数初始化 //封装一个清除active方法 var clearActive = function () { for (i = 0; i < items.length; i++) { items[i].className = 'item' ; } for (j = 0; j < points.length; j++) { points[j].className = 'point' ; } } //改变active方法 var goIndex = function () { clearActive(); items[index].className = 'item active' ; points[index].className = 'point active' } //左按钮事件 var goLeft = function () { if (index == 0) { index = 4; } else { index--; } goIndex(); } //右按钮事件 var goRight = function () { if (index < 4) { index++; } else { index = 0; } goIndex(); } //绑定点击事件监听 left.addEventListener( 'click' , function () { goLeft(); time = 0; //计时器跳转清零 }) right.addEventListener( 'click' , function () { goRight(); time = 0; //计时器跳转清零 }) for (i = 0;i < points.length;i++){ points[i].addEventListener( 'click' , function (){ var pointIndex = this .getAttribute( 'data-index' ) index = pointIndex; goIndex(); time = 0; //计时器跳转清零 }) } //计时器轮播效果 var timer; function play(){ timer = setInterval(() => { time ++; if (time == 20 ){ goRight(); time = 0; } },100) } play(); //移入清除计时器 all.onmousemove = function (){ clearInterval(timer) } //移出启动计时器 all.onmouseleave = function (){ play(); } </script> |
总结:这个简单的轮播图实现例子是第一次写最容易理解,逻辑最清晰的一种。下面我把完整的代码块放出来,直接复制粘贴就可以运行。
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
|
<!DOCTYPE html> < html > < head > < style > .wrap { width: 800px; height: 400px; position: relative; } .list { width: 800px; height: 400px; position: relative; padding-left: 0px; } .item { width: 100%; height: 100%; list-style: none; position: absolute; left: 0; opacity: 0; transition: all .8s; } .item:nth-child(1) { background-color: skyblue; } .item:nth-child(2) { background-color: yellowgreen; } .item:nth-child(3) { background-color: rebeccapurple; } .item:nth-child(4) { background-color: pink; } .item:nth-child(5) { background-color: orange; } .item.active { z-index: 10; opacity: 1; } .btn { width: 60px; height: 100px; z-index: 100; top: 150px; position: absolute; } #leftBtn { left: 0px; } #rightBtn { right: 0px; } .pointList { list-style: none; padding-left: 0px; position: absolute; right: 20px; bottom: 20px; z-index: 200; } .point { width: 10px; height: 10px; background-color: antiquewhite; border-radius: 100%; float: left; margin-right: 8px; border-style: solid; border-width: 2px; border-color: slategray; cursor: pointer; } .point.active{ background-color: cadetblue; } </ style > </ head > < body > < div class = "wrap" > < ul class = "list" > < li class = "item active" >0</ li > < li class = "item" >1</ li > < li class = "item" >2</ li > < li class = "item" >3</ li > < li class = "item" >4</ li > </ ul > < ul class = "pointList" > < li class = "point active" data-index = 0 ></ li > < li class = "point" data-index = 1 ></ li > < li class = "point" data-index = 2 ></ li > < li class = "point" data-index = 3 ></ li > < li class = "point" data-index = 4 ></ li > </ ul > < button class = "btn" id = "leftBtn" > < </ button > < button class = "btn" id = "rightBtn" > > </ button > </ div > < script > var items = document.querySelectorAll(".item");//图片 var points = document.querySelectorAll(".point")//点 var left = document.getElementById("leftBtn"); var right = document.getElementById("rightBtn"); var all = document.querySelector(".wrap") var index = 0; var time = 0;//定时器跳转参数初始化 //清除active方法 var clearActive = function () { for (i = 0; i < items.length ; i++) { items[i] .className = 'item' ; } for ( j = 0 ; j < points.length; j++) { points[j] .className = 'point' ; } } //改变active方法 var goIndex = function () { clearActive(); items[index] .className = 'item active' ; points[index] .className = 'point active' } //左按钮事件 var goLeft = function () { if (index == 0) { index = 4 ; } else { index--; } goIndex(); } //右按钮事件 var goRight = function () { if (index < 4) { index++; } else { index = 0 ; } goIndex(); } //绑定点击事件监听 left.addEventListener('click', function () { goLeft(); time = 0 ;//计时器跳转清零 }) right.addEventListener('click', function () { goRight(); time = 0 ;//计时器跳转清零 }) for( i = 0 ;i < points.length;i++){ points[i].addEventListener('click',function(){ var pointIndex = this .getAttribute('data-index') index = pointIndex ; goIndex(); time = 0 ;//计时器跳转清零 }) } //计时器 var timer; function play(){ timer = setInterval (() => { time ++; if(time == 20 ){ goRight(); time = 0; } },100) } play(); //移入清除计时器 all.onmousemove = function(){ clearInterval(timer) } //移出启动计时器 all.onmouseleave = function(){ play(); } </ script > </ body > </ html > |