前言:虽然现在网上有很多组件库都有轮播图组件,但是我觉得这个东西还是需要自己动手写下好,里面其实有很多有用的知识点的,而且老是用组件库也不好,万一组件库中的轮播图不符合项目的要求或者UI不合适,诸如此类很多情况,还是自己写一个适合自己的最好。

功能分析

  • 初级轮播图功能介绍:

    ①左右两端有左右按钮;

    ②下方有小球指示当前是第几张图片;

    ③无切换效果;

    ④如果两秒中用户没有点击轮播图,则从左到右自动播放。

实现思路

HTML中需要包括一个大盒子class=wrap,为轮播图的盒子。一张一张的图片可以用无序列表存储,左右按钮使用button,下方圆点也用无序列表,并为每一个圆点设置计数器data-index。

HTML部分

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">
<!-- data-index是自定义属性 -->
<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部分

  1. 给wrap盒子一个宽高,list盒子和它同宽同高
  2. 每一张图片充满盒子,并且都用绝对定位固定在wrap盒子里,让他们有不同的颜色,初始透明度都是0即全透明
  3. 哪个需要展示,哪个的z-index就变大,并且透明度改为1
  4. 左右按钮直接使用定位固定在左右两端,小圆点内部使用浮动,再用定位固定在下端
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>
* {
margin: 0;
padding: 0;
list-style: none;
}
/* 轮播图大盒子 */
.wrap{
width: 800px;
height: 400px;
position: relative;
}
/* */
.list{
width: 800px;
height: 400px;
position: relative;
}
/* 每张图片 */
.item{
width: 100%;
height: 100%;
position: absolute;
left: 0;
/* 透明度设为0 */
opacity: 0;
}
/* 被激活的图片透明度设为1,且增大z-index */
.item.active {
opacity: 1;
z-index: 20;
}
/* 不同的图片不同的颜色 */
.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;
}
/* 按钮设置 */
.btn{
width: 50px;
height: 100px;
position: absolute;
top: 50%;
z-index: 200;
transform: translate(0,-50%);
}
#leftBtn{
left: 0;
}
#rightBtn{
right: 0;
}
/* 小圆点的设置 */
.pointList{
height: fit-content;
position: absolute;
bottom: 20px;
right: 20px;
z-index: 200;
}
.point{
width: 10px;
height: 10px;
background-color: antiquewhite;
float: left;
margin-right: 8px;
/* 边框圆的程度 */
border-radius: 100%;
/* 边框长度 */
border-width: 2px;
/* 实现边框 */
border-style: solid;
/* 圆圈边框颜色 */
border-color: slategray;
cursor: pointer;
}
.point.active {
background-color: cadetblue;
}
</style>

Js部分

  1. 获取元素:包括图片、圆点、按钮、轮播图大盒子
  2. 需要一个变量index记录当前图片的索引,并且在每次点击的时候要先将样式清空,再根据索引重新赋值(排他思想)
  3. 点击左右按钮的时候,只需要判断是否为第一张或者最后一张,然后进行+1 -1操作即可
  4. 点击小圆点时,需要记录点击的圆点的data-index,赋值给Index,然后再执行
  5. 定义计时器,当鼠标在wrap内,就取消计时,不在wrap内,就开始计时,两秒以后自动播放
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
<script>
// 轮播图图片
let items = document.querySelectorAll('.item')
// 下方圆点
let points = document.querySelectorAll('.point')
// 左右的按钮
let leftBtn = document.querySelector('#leftBtn')
let rightBtn = document.querySelector('#rightBtn')
// 轮播图盒子
let wrap = document.querySelector('.wrap')

// 需要一个变量index记录当前图片的索引,并且在每次点击的时候要先将样式清空,再根据索引重新赋值(排他思想)
var index = 0
// 移除所有的active
var removeActive = function(){
for(var i = 0; i < items.length; i++){
items[i].className = "item"
}
for(var i = 0; i < points.length; i++){
points[i].className = "point"
}
}
// 若当前处于index时,赋予active
var setActive = function(){
removeActive()
items[index].className = "item active"
points[index].className = "point active"
}
// 点击左边按钮改变index
var goLeft = function(){
// 处于第一张的时候,按下跳到第五张
if(index == 0){
index = 4
}else{
index--;
}
// 设置active
setActive();
}
// 点击右边按钮
var goRight = function(){
if(index == 4){
index = 0
}else{
index++;
}
// 设置active
setActive();
}
// 给按钮设置监听事件
leftBtn.addEventListener('click',function(){
goLeft();
});
rightBtn.addEventListener('click',function(){
goRight();
})
// 点击小圆点时,需要记录点击的圆点的data-index,赋值给Index,然后再执行
// 给五个圆点都增加监听事件,用for循环进行一次
for(var i = 0;i < points.length;i++){
points[i].addEventListener('click',function(){
var pointIndex = this.getAttribute('data-index')
index = pointIndex;
setActive();
})
}
// 定义计时器,当鼠标在wrap内,就取消计时,不在wrap内,就开始计时,两秒以后自动播放。
var timer
// 设置一个定时器,每两秒触发一次goRight()函数
function autoPlay() {
timer = setInterval(() => {
goRight()
}, 2000);
}
autoPlay()
// 鼠标移入wrap清除计时器
wrap.onmouseover = function(){
clearInterval(timer)
console.log('清除计时器')
}
// 鼠标移出wrap加入计时器
wrap.onmouseleave = function(){
autoPlay()
console.log('加入计时器')
}

</script>

参考:https://www.jb51.net/article/257977.htm