本文介绍如何使用原生 JavaScript 实现图片无缝滚动效果。核心功能包括鼠标移入停止、移出继续滚动,以及通过链接控制左右滚动方向。代码通过复制列表项实现视觉无限循环,利用 offsetLeft 判断重置位置,并结合 setInterval 控制滚动速度与 clearInterval 处理交互事件。
无缝滚动效果与功能概述
实现效果为:当鼠标移入图片区域时,滚动停止;鼠标移出后,图片自动继续滚动。
支持调整滚动的方向,可设置为向左或向右滚动。
HTML 与 CSS 布局实现
具体实现代码如下:
<style type="text/css">
* {
margin: 0;
padding: 0;
}
#div1 {
overflow: hidden;
width: 712px;
height: 108px;
margin: 100px auto;
position: relative;
background: red;
}
#div1 ul {
position: absolute;
left: 0;
top: 0;
}
#div1 ul li {
float: left;
width: 178px;
height: 108px;
list-style: none;
}
</style>
HTML 结构代码如下:
<body>
<a href="javascript:;">向左走</a>
<a href="javascript:;">向右走</a>
<div id="div1">
<ul>
<li>
<img src="img/无缝滚动/1.jpg" />
</li>
<li>
<img src="img/无缝滚动/2.jpg" />
</li>
<li>
<img src="img/无缝滚动/3.jpg" />
</li>
<li>
<img src="img/无缝滚动/4.jpg" />
</li>
</ul>
</div>
</body>
上述代码构建了一个简单的布局,接下来是核心的 JavaScript 逻辑代码。
JavaScript 核心逻辑与代码
JavaScript 代码如下:
<script type="text/javascript">
window.onload = function() {
var oDiv = document.getElementById("div1");
var oUl = oDiv.getElementsByTagName('ul')[0];
var aLi = oUl.getElementsByTagName('li');
var speed = 2;
oUl.innerHTML += oUl.innerHTML;
oUl.style.width = aLi[0].offsetWidth * aLi.length + 'px';
function move() {
if (oUl.offsetLeft < -oUl.offsetWidth / 2) {
oUl.style.left = '0';
}
if (oUl.offsetLeft > 0) {
oUl.style.left = -oUl.offsetWidth / 2 + 'px';
}
oUl.style.left = oUl.offsetLeft + speed + 'px';
}
var timer = setInterval(move, 30);
oDiv.onmouseover = function() {
clearInterval(timer);
};
oDiv.onmouseout = function() {
timer = setInterval(move, 30);
};
document.getElementsByTagName('a')[0].onclick = function() {
speed = -2;
};
document.getElementsByTagName('a')[1].onclick = function() {
speed = 2;
};
}
</script>
实现原理与细节解析
简要说明实现思路:
首先,通过 oUl.innerHTML += oUl.innerHTML; 将列表内容复制一份,使图片总数变为原来的两倍(例如原4张变为8张)。
在 计算ul的宽度为 li的实际宽度*8
利用 CSS 的 overflow: hidden 隐藏超出容器的多余内容。
注意:oUl.offsetLeft 的值始终为负数。
因此,在判断条件时不能遗漏负号。
关键判断代码如下:
if (oUl.offsetLeft < -oUl.offsetWidth / 2) {
oUl.style.left = '0';
}
这段逻辑表示:当图片滚动到中间位置(即一半距离)时,迅速将 ul 的 left 值重置为 0。由于程序执行速度极快,用户几乎察觉不到这一瞬间的跳转,从而实现了视觉上的无缝滚动效果。
最后,通过变量 speed 控制滚动的方向。speed 为正数时向右滚动,为负数时向左滚动。
以上代码仅实现了基本功能,开发者可在此基础上进行扩展和完善。