需求
有一行列表,每页展示五条,五秒后,列表滚动,展示6-10条数据,无缝滚动。
完整实例代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
div {
position: relative;
/* 外层的高度应该是每条数据的高度之和 */
height: 200px;
overflow: hidden;
}
#list {
width: 100%;
background: red;
position: relative;
transition: top 2s;
-webkit-transition: top 2s;
/* 一定要加,否则第一次滚动动画不会触发 */
top: 0;
}
li {
list-style: none;
text-align: center;
height: 40px;
line-height: 40px;
box-sizing: border-box;
border-bottom: 1px solid blue;
}
</style>
</head>
<body>
<div>
<ul id="list">
</ul>
</div>
</body>
</html>
<script src="./jquery.min.js"></script>
<script>
// 模拟数据
let liHtml = "";
for (let i = 0; i < 25; i++) {
liHtml += `
<li>${i + 1}</li>
`;
}
$("#list").append(liHtml);
// 实现逻辑
let _timer, _activeIndex = 0;
// 设置定时器, 每五秒滚动一次
if (!_timer) {
_timer = setInterval(_ => {
// 25条数据,5条一页
if (_activeIndex < 25 / 5 - 1) {
_activeIndex += 1;
setScrollAnimate(_activeIndex, true);
} else {
// 当数据循环结束后,重头开始,
// 此时,transition如存在,则会有从下往上滚动的效果,视觉效果不好
_activeIndex = 0;
setScrollAnimate(_activeIndex, false);
}
}, 5000);
}
function setScrollAnimate(activeIndex, isTransition) {
$("#list").css({
top: -activeIndex * 40 * 5 + "px",
transition: isTransition ? "top 0.5s" : "none"
});
}
</script>