前言
在HTML中实现列表循环滚动效果,通常可以通过CSS动画或JavaScript来实现。
以下是几种常见的实现方式,适用于不同场景:
方法1:纯CSS实现
利用CSS的animation和transform属性,通过 translateY 实现滚动,并配合infinite属性实现循环。
垂直循环滚动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <style> .scroll-container { width: 300px; height: 200px; overflow: hidden; border: 1px solid #ccc; } .scroll-list { list-style: none; margin: 0; padding: 0; animation: scroll 10s linear infinite; } .scroll-list li { padding: 10px; background: #f5f5f5; margin-bottom: 5px; } @keyframes scroll { 0% { transform: translateY(0); } 100% { transform: translateY(-50%); } } .scroll-container:hover .scroll-list { animation-play-state: paused; } </style> </head> <body> <div class="scroll-container"> <ul class="scroll-list"> <li>列表项 1</li> <li>列表项 2</li> <li>列表项 3</li> <li>列表项 4</li> <li>列表项 5</li> <li>列表项 1</li> <li>列表项 2</li> <li>列表项 3</li> <li>列表项 4</li> <li>列表项 5</li> </ul> </div> </body> </html>
|
原理:通过复制一份列表项,当第一份滚动完时,第二份刚好衔接,形成无缝循环。
横向循环滚动
将上述方法的translateY改为translateX,即可实现横向滚动:
1 2 3 4 5 6 7 8 9 10 11 12 13
| .scroll-container { height: 60px; white-space: nowrap; } .scroll-list li { display: inline-block; margin-right: 20px; } @keyframes scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-50%); } }
|
方法2:JavaScript实现
通过JS动态修改列表的位置,支持暂停、速度调整等功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <style> .scroll-container { width: 300px; height: 200px; overflow: hidden; border: 1px solid #ccc; position: relative; } .scroll-list { list-style: none; margin: 0; padding: 0; position: absolute; top: 0; left: 0; width: 100%; } .scroll-list li { padding: 10px; background: #f5f5f5; margin-bottom: 5px; } </style> </head> <body> <div class="scroll-container" id="container"> <ul class="scroll-list" id="list"> <li>列表项 1</li> <li>列表项 2</li> <li>列表项 3</li> <li>列表项 4</li> <li>列表项 5</li> </ul> </div>
<script> const container = document.getElementById('container'); const list = document.getElementById('list'); let speed = 2; let timer = null; let position = 0;
const cloneList = list.innerHTML; list.innerHTML += cloneList;
function scroll() { position += speed; if (position >= list.offsetHeight / 2) { position = 0; } list.style.transform = `translateY(-${position}px)`; timer = requestAnimationFrame(scroll); }
scroll();
container.addEventListener('mouseenter', () => { cancelAnimationFrame(timer); });
container.addEventListener('mouseleave', () => { scroll(); }); </script> </body> </html>
|
优势:可以通过修改speed变量调整滚动速度,且支持更复杂的交互逻辑。
关键注意事项
- 无缝循环的核心是列表项重复(复制一份原列表),确保滚动衔接时无断层。
- 滚动速度需根据列表长度调整,避免过快或过慢。
- 鼠标悬停暂停是友好的交互体验,建议添加。
根据需求选择合适的方法:纯CSS适合简单场景,JS适合需要动态控制的场景。