实现效果:
自动向右循环播放
鼠标悬停,移出继续播放
点击向右按钮,跳到下一张
点击向左按钮,跳到上一张
保证图片的过渡效果完整呈现后,才能跳到下一张
底部圆点随图片位置切换激活状态
实现思路:
把第一张图片复制到最后一张
当播放到最后一张时,无缝切换到第一张,然后继续放第二张
注意点↓!
代码执行过快时,可以用异步任务,保证代码执行的先后顺序
setTimeout(function(){
// 跳到第二张
img_location += 1;
olist.style.transition = "left 0.5s ease 0s";
olist.style.left = -650*img_location+"px";
},0) // 时间可以设置为0
需要页面自动执行时,可以定义函数,模拟点击行为,不用重写一遍
// 定义一个全局函数,自动跳到下一张,方便鼠标移入移出时调用
function move(){
timer = setInterval(function(){
// 每隔1s点击向右按钮
rightbtn.click();
},1000)
}
实现代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>跑马灯轮播图</title>
<style>
* {
margin: 0;
padding: 0;
}
.carousel {
width: 650px;
margin: 50px auto;
position: relative;
overflow: hidden;
/* 超出部分隐藏 */
}
/* 标题-轮播图 */
h1 {
text-align: center;
}
.carousel ul {
list-style: none;
/* 消除ul自带圆点 */
}
.carousel #list {
width: 6000px;
position: relative;
left: 0px;
/* 初始位置 */
transition: left 0.5s ease 0s;
/*图片跳转的过渡效果*/
}
.carousel #list img {
width: 650px;
}
.carousel #list li {
float: left;
/* li排成一排显示 */
}
/* 上一张/下一张控制按钮 */
.carousel>a {
position: absolute;
width: 30px;
height: 50px;
/* 垂直居中,距顶部一半的父元素盒子宽度,再向上移动自身的一半 */
top: 50%;
margin-top: -25px;
background-color: rgba(163, 166, 167, 0.5);
}
.carousel>a>img {
margin-left: -8px;
}
.carousel .leftbtn {
left: 20px;
}
.carousel .rightbtn {
right: 20px;
}
/* 底部定位圆点list */
.carousel #location_list {
width: 120px;
position: absolute;
top: 350px;
left: 270px;
}
.carousel #location_list li {
float: left;
width: 10px;
height: 10px;
border-radius: 50%;
margin: 5px;
border: 1px solid white;
}
/* 圆点被激活时的样式,动态为圆点增加class */
.carousel #location_list li.active {
background-color: bisque;
}
</style>
</head>
<body>
<h1>轮播图</h1>
<div class="carousel">
<!--图片列表 -->
<ul id="list">
<li><img src="images/number/1.jpg" alt="" /></li>
<li><img src="images/number/2.jpg" alt="" /></li>
<li><img src="images/number/3.jpg" alt="" /></li>
<li><img src="images/number/4.jpg" alt="" /></li>
<li><img src="images/number/5.jpg" alt="" /></li>
</ul>
<!-- 左右按钮 -->
<a href="javascript:;" class="leftbtn"><img src="./images/lunbo/chevron-left.png" alt="" srcset=""></a>
<a href="javascript:;" class="rightbtn"><img src="./images/lunbo/chevron-right.png" alt="" srcset=""></a>
<!-- 圆点列表 -->
<ul id="location_list">
<!-- 默认激活第一个 -->
<li class="active"></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</div>
<script>
var carousel = document.querySelector(".carousel");
// 获取图片列表ul
var olist = document.getElementById("list");
// 获取定位数组
var location_list = document.querySelectorAll('#location_list>li');
// 向左按钮
var leftbtn = document.querySelector('.leftbtn');
// 向右按钮
var rightbtn = document.querySelector('.rightbtn');
// 将第一张图片加到最后一张,方便循环
var oli = document.querySelector("#list li:first-child")
olist.innerHTML += oli.innerHTML;
// 当前显示的图片定位
var img_location = 0;
// 当前的圆点定位
var dot_location = 0
// 定义一个全局定时器变量
var timer = null;
// 默认不上锁,该状态为了保证过渡效果能完整呈现
var islock = false;
// 定义一个全局函数,自动跳到下一张,方便鼠标移入移出时调用
function move() {
timer = setInterval(function () {
// 每隔1s点击向右按钮
rightbtn.click();
}, 1000)
}
// 页面加载后自动调用,实现自动跳转下一张
move();
// 鼠标移入,清除定时器
carousel.onmouseenter = function () {
clearInterval(timer);
}
// 鼠标移出,调用自动播放
carousel.onmouseleave = function () {
move();
}
// 点击按钮切换下一张
rightbtn.onclick = function () {
if (islock) { return; }
islock = true;
if (img_location === 5) {
// 清除过渡效果,从最后一张无缝衔接到开头
olist.style.transition = "none";
olist.style.left = "0px";
img_location = 0;
}
// 由于代码执行过快,所以需要放到异步执行语句里
setTimeout(function () {
// 跳到第二张
img_location += 1;
dot_location += 1;
olist.style.left = -650 * img_location + "px";
olist.style.transition = "left 0.5s ease 0s";
// 如果跳转后是第6张图片,实际上就是第一张图,圆点应该定位在第1个
if (img_location === 5) {
dot_location = 0;
location_list[dot_location].className = "active";
location_list[4].className = "none";
} else {
// 激活当前定位的圆点
location_list[dot_location].className = "active";
// 上一个圆点取消激活状态
location_list[dot_location - 1].className = "none"
}
}, 0)
setTimeout(function () {
islock = false;
}, 500)
};
// 点击按钮切换上一张
leftbtn.onclick = function () {
if (islock) { return; }
islock = true;
// 清除过渡效果,从第一张无缝衔接到最后一张
if (img_location === 0) {
img_location = 5;
olist.style.transition = "none";
olist.style.left = -650 * img_location + "px";
}
// 由于代码执行过快,所以需要放到异步执行语句里
setTimeout(function () {
// 跳到上一张图
img_location -= 1;
dot_location -= 1;
olist.style.transition = "left 0.5s ease 0s";
olist.style.left = -650 * img_location + "px";
// 如果跳完后是第五张图,圆点位置也要相应变成最后一个
if (img_location === 4) {
dot_location = 4;
location_list[dot_location].className = "active";
location_list[0].className = "none";
} else {
location_list[dot_location].className = "active";
location_list[dot_location + 1].className = "none"
}
}, 0)
setTimeout(function () {
islock = false;
}, 500)
}
</script>
</body>
</html>