JavaScript 实现图片无缝滚动:鼠标悬停暂停与方向控制

作者:小圆点时间:2026-10-28 18:02:42浏览:491

本文介绍如何使用原生 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 为正数时向右滚动,为负数时向左滚动。

以上代码仅实现了基本功能,开发者可在此基础上进行扩展和完善。

作者最新文章