结构
<body>
<!-- 外层容器 -->
<div id="outer">
<!-- 图片列表 -->
<ul id="img-list">
<li>
<img src="./imgs/1.jpg" alt="">
</li>
<li>
<img src="./imgs/2.jpg" alt="">
</li>
<li>
<img src="./imgs/3.jpg" alt="">
</li>
<li>
<img src="./imgs/4.jpg" alt="">
</li>
<li>
<img src="./imgs/5.jpg" alt="">
</li>
<li>
<img src="./imgs/6.jpg" alt="">
</li>
<!-- 为了保证效果,在最后一张图片后添加 第一张图片 -->
<li>
<img src="./imgs/1.jpg" alt="">
</li>
</ul>
</div>
</body>
- 依次放入图片即可,需要包一个外层容器 outer
- 在最后一张图片后,添加第一张图片,保证轮播时平滑。
样式
<style>
/* 样式重置 */
* {
padding: 0;
margin: 0;
}
li {
list-style: none;
}
/*
外层容器样式
overflow: hidden; 裁剪多余的图片
position: relative; 开启相对定位
*/
#outer {
width: 220px;
height: 200px;
margin: 0 auto;
padding: 10px 0;
background-color: wheat;
overflow: hidden;
position: relative;
}
/*
图片大小为 200 * 200,开启浮动后,显示单张图片
开启绝对定位,通过修改 left 实现轮播
*/
#img-list {
height: 200px;
position: absolute;
left: 0;
}
/* 开启浮动,横向布局 */
#img-list li {
float: left;
margin: 0 10px;
}
/* 图片默认为 baseline 对其,修改使其无间隔 */
#img-list li img {
vertical-align: bottom;
}
</style>
- 首先进行样式重置
- 外层容器的大小刚好是一张图片的大小。也可以加上少许padding进行区分
overflow: hidden;
,设置多余内容进行裁剪,显示第一张图片给每个
img
外层的li
开启浮动,进行横向布局。开启绝对定位(用于修改left的值进行轮播)交互
<script>
window.onload = function () {
// 灵活设置 img-list 的宽度(图片数量不固定)
var imgs = document.getElementById("img-list");
var count = imgs.querySelectorAll("li img").length;
imgs.style.width = 220 * count + "px";
// 起始索引
var index = 0;
// 轮播
autoPlay();
// 自动播放:就是一个定时器,其中需要改变 index + 照片移动
function autoPlay() {
setInterval(function () {
index++;
index %= count;
move(imgs, "left", index * -220, 10);
}, 2000)
};
// 要执行动画的对象、要变化的属性、终止条件、变化速度
function move(obj, attr, end, speed) {
// 清除上一个定时器
clearInterval(obj.timer);
// 获取属性当前值
var cur = parseInt(getComputedStyle(obj)[attr]);
// 判断变化的方向。
if (cur > end) {
speed = -speed;
}
// 设置定时器,比如功能从 0 --> -220,每次变化 10
obj.timer = setInterval(() => {
var oldV = getComputedStyle(obj)[attr];
var newV = parseInt(oldV) + speed;
if ((newV > end && speed > 0) || (newV < end && speed < 0)) {
newV = end;
// 防止 end = 190,newV = 180 + 20 > 190 类似情况
}
obj.style[attr] = newV + 'px';
// 结束,关闭定时器
if (newV === end) {
clearInterval(obj.timer);
// 结束后,如果是最后一张。状态重置,重新改变 left
if (index >= count - 1) {
index = 0;
imgs.style.left = 0;
}
}
}, 30)
}
}
</script>
ul
的宽度进行动态设置(图片数量不确定)- 定义
index
表示图片的下标索引 autoPlay
定义自动播放,即一个定时器,定时执行的内容包括:改变index
值,改变 left 的值(通过move 函数)move
函数:参数列表,需要执行变化的的对象,要变化的属性,终止条件,变化的速度- 在此例中,依次为
ul
,left
,-220, -440...
(图片对应left为[0,-220,-440…]),10
- 在此例中,依次为