这段代码实现了一个具有自动轮播、手动切换功能的图片轮播图,并且配有指示器(小圆点)来显示当前图片位置。轮播图可通过左右箭头按钮进行手动切换,也能自动定时切换,当鼠标悬停在轮播图上时,自动轮播会暂停,鼠标移开后继续。
代码详细分析
1. HTML 部分
<div class="box">
<div class="wipper">
<div><img src="../png/NTE_features1.jpg" alt="都市特色1" /></div>
<div><img src="../png/NTE_features2.jpg" alt="都市特色2" /></div>
<div><img src="../png/NTE_features3.jpg" alt="都市特色3" /></div>
<div><img src="../png/NTE_features4.jpg" alt="都市特色4" /></div>
<div><img src="../png/NTE_features5.jpg" alt="都市特色5" /></div>
<div><img src="../png/NTE_features6.jpg" alt="都市特色6" /></div>
<div><img src="../png/NTE_features1.jpg" alt="都市特色1" /></div>
</div>
</div>
<div class="pre"></div>
<div class="next"></div>
<div class="lis">
<span class="current"></span>
<span class="current"></span>
<span class="current"></span>
<span class="current"></span>
<span class="current"></span>
<span class="current"></span>
</div>
.box
容器:作为轮播图的整体容器,用于包裹图片和控制溢出内容。.wipper
容器:用来包含所有图片,通过改变其transform
属性实现图片的滚动。- 图片元素:每个
<div>
中包含一张图片,为了实现无缝循环,最后一张图片重复第一张。 .pre
和.next
按钮:分别作为上一张和下一张的切换按钮。.lis
指示器:包含多个<span>
元素,用于指示当前显示的图片位置。
2. CSS 部分
.box {
width: 1120px;
height: 530px;
margin: 0px auto;
margin-top: -60px;
overflow: hidden;
position: relative;
border: 9px solid #585858;
}
.wipper {
width: 8400px;
height: 530px;
position: absolute;
left: 0;
}
.wipper div {
width: 1200px;
height: 650px;
float: left;
text-align: center;
}
.wipper div img {
width: 100%;
height: 100%;
object-fit: cover;
}
.lis {
text-align: center;
border-radius: 5px;
position: absolute;
bottom: -30px;
left: 50%;
transform: translateX(-50%);
}
.lis span {
display: inline-block;
width: 12px;
height: 12px;
border-radius: 50%;
background-color: #fff;
margin: 0 5px;
cursor: pointer;
}
.lis span.current {
background-color: #e8e8e8;
}
.box
样式:设置轮播图容器的宽度、高度、边距、溢出处理和边框样式。.wipper
样式:设置图片容器的宽度和高度,并将其定位为绝对定位,方便移动。.wipper div
样式:设置每个图片容器的宽度、高度和浮动方式,使其水平排列。.wipper div img
样式:设置图片的宽度、高度和填充方式,确保图片填满容器。.lis
样式:设置指示器的位置和样式。.lis span
样式:设置每个指示器小圆点的样式,包括大小、颜色和鼠标指针样式。.lis span.current
样式:设置当前激活的指示器小圆点的样式。
3. JavaScript 部分
// 获取元素
var box = document.getElementsByClassName("box")[0];
var wipper = document.getElementsByClassName("wipper")[0];
var divs = wipper.getElementsByTagName("div");
var pre = document.getElementsByClassName("pre")[0];
var next = document.getElementsByClassName("next")[0];
var lis = document.getElementsByClassName("lis")[0];
var spans = lis.getElementsByTagName("span");
// 定义一个 index 保存当前图片索引
var index = 0;
// 下一张按钮点击事件
function nextClick() {
index++;
wipper.style.transition = "all .5s";
wipper.style.transform = "translateX(" + -index * divs[0].offsetWidth + "px)";
if (index == divs.length - 1) {
index = 0;
setTimeout(() => {
wipper.style.transform = "translate(0,0)";
wipper.style.transition = "none";
}, 300);
}
for (var i = 0; i < spans.length; i++) {
spans[i].className = "";
spans[index].className = "current";
}
}
next.onclick = nextClick;
// 上一张
function preClick() {
index--;
if (index == -1) {
wipper.style.transform = "translateX(" + -5 * divs[0].offsetWidth + "px)";
wipper.style.transition = "none";
index = 4;
setTimeout(() => {
wipper.style.transform = "translateX(" + -index * divs[0].offsetWidth + "px)";
wipper.style.transition = "all .5s";
}, 0);
} else {
wipper.style.transform = "translateX(" + -index * divs[0].offsetWidth + "px)";
wipper.style.transition = "all .5s";
}
for (var i = 0; i < spans.length; i++) {
spans[i].className = "";
spans[index].className = "current";
}
}
pre.onclick = preClick;
// 自动轮播
var timer = setInterval(nextClick, 3000);
// 小圆点的点击事件
for (var i = 0; i < spans.length; i++) {
(function (i) {
spans[i].onclick = function () {
var allSpans = this.parentNode.children;
for (var j = 0; j < allSpans.length; j++) {
allSpans[j].className = "";
}
this.className = "current";
index = i;
wipper.style.transform = "translateX(" + -index * divs[0].offsetWidth + "px)";
wipper.style.transition = "all .5s";
};
})(i);
}
// 移入 box,清除定时器
box.onmouseenter = function () {
clearInterval(timer);
};
// 移出 box,重新调用定时器
box.onmouseleave = function () {
timer = setInterval(nextClick, 3000);
};
- 获取元素:通过
document.getElementsByClassName
和document.getElementsByTagName
方法获取所需的 HTML 元素。 - 定义
index
变量:用于保存当前显示的图片索引。 nextClick
函数:处理下一张按钮的点击事件,增加index
值,通过改变wipper
的transform
属性实现图片切换。当到达最后一张图片时,使用setTimeout
函数实现无缝循环。同时更新指示器的样式。preClick
函数:处理上一张按钮的点击事件,减少index
值,处理到达第一张图片的情况,同样更新指示器的样式。- 自动轮播:使用
setInterval
函数定时调用nextClick
函数,实现自动轮播。 - 小圆点点击事件:为每个指示器小圆点添加点击事件,点击时更新
index
值和指示器样式,并切换到相应的图片。 - 鼠标悬停处理:当鼠标移入轮播图时,清除定时器,暂停自动轮播;鼠标移出时,重新启动定时器。
总结
这段代码通过 HTML 构建轮播图的结构,CSS 设置样式,JavaScript 实现交互功能,包括手动切换、自动轮播和指示器更新。整体实现了一个功能完善、用户体验良好的图片轮播图。
效果如图