业务需求
日常开发中,表格宽高固定,内部从服务器获取数据并渲染,当数据逐条渲染排列,
总高度小于表格高度时,内容不滚动;
总高度大于等于表格高度时,列表数据垂直循环滚动。
原理
逻辑:当窗口高度小于内容高度时,窗口的scrollTop缓慢增加 ,内容由下向上滚动,当内容底部与窗口底部重合停止滚动;这是第一遍滚动
把数据复制两份,就会造成一种首尾相连循环滚动的假象,当第二遍的内容开头与 窗口的 scrollTop 重合,
这时候设置scrollTop = 0 就会实现循环无限滚动
实现的代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>列表循环滚动</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
width: 300px;
height: 200px;
border: 1px solid #ccc;
margin: 50px auto;
overflow: hidden;
}
ul {
list-style: none;
padding: 0;
}
li {
height: 40px;
line-height: 40px;
text-align: center;
border-bottom: 1px solid #eee;
}
</style>
</head>
<body>
<div class="box" id="box">
<ul id="list">
<li>列表项 1</li>
<li>列表项 2</li>
<li>列表项 3</li>
<li>列表项 4</li>
<li>列表项 5</li>
<li>列表项 6</li>
<li>列表项 7</li>
<li>列表项 8</li>
</ul>
</div>
<script>
function scrollList() {
const box = document.getElementById('box')
const list = document.getElementById('list')
// 克隆列表内容
const cloneList = list.cloneNode(true)
box.appendChild(cloneList)
let scrollTop = 0
const scrollHeight = list.clientHeight
let isHovered = false
// 鼠标悬停时暂停滚动
box.addEventListener('mouseenter', () => {
isHovered = true
})
box.addEventListener('mouseleave', () => {
isHovered = false
})
function scroll() {
if (!isHovered) {
scrollTop++
if (scrollTop >= scrollHeight) {
scrollTop = 0
}
box.scrollTop = scrollTop
}
requestAnimationFrame(scroll)
}
// 使用requestAnimationFrame实现平滑滚动
requestAnimationFrame(scroll)
}
// 页面加载完成后启动滚动
window.addEventListener('load', scrollList)
</script>
</body>
</html>
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。