JavaScript实现无缝轮播图原理与代码详解

作者:半夏

时间:2026-10-21

浏览:413

本文详细解析基于JavaScript实现无缝轮播图的核心原理。通过克隆首张图片实现视觉闭环,利用CSS控制布局与溢出隐藏,并封装animate函数处理匀速动画。结合定时器实现自动轮播,通过鼠标事件控制播放暂停与恢复,同时动态生成指示器以匹配图片数量,提供完整的HTML、CSS及JS实现方案。

文章目录

无缝滚动原理概述

网上有许多关于该功能的示例,本文所实现的无缝滚动效果,核心机制是通过动态修改元素的left属性值,使图片产生左右连续滚动的视觉效果。

HTML与CSS结构搭建

首先,我们需要构建基础的HTML结构与CSS样式,确立轮播图的基本框架。

无缝滚动原理概述

相关的HTML与CSS代码结构如下所示。


<!DOCTYPE html>
<html>
 <head>
 <meta charset="UTF-8">
 <title></title>
 <style type="text/css">
 *{
 margin: 0;
 padding: 0;
 }
 ul,ol{
 list-style: none;
 }
 /*消除图片底部3像素距离*/
 img{
 vertical-align: top;
 }
 .scroll{
 width: 500px;
 height: 200px;
 margin: 100px auto;
 border: 1px solid #ccc;
 padding: 7px;
 overflow: hidden;
 position: relative;
 }
 .box{
 width: 500px;
 height: 200px;
 overflow: hidden;
 position: relative;
 }
 .box ul{
 width: 600%;
 position: absolute;
 left: 0;
 top: 0;
 }
 .box ul li{
 float: left;
 }
 .scroll ol{
 position: absolute;
 right: 10px;
 bottom: 10px;

 }
 .scroll ol li{
 float: left;
 width: 20px;
 height: 20px;
 background: pink;
 text-align: center;
 line-height: 20px;
 border-radius: 50%;
 background-color: pink; 
 margin-left:10px ;
 cursor: pointer;
 }
 .scroll ol li.current{
 background-color: purple;
 }
 </style>
 </head>
 <body>
 <div id="scroll" class="scroll">
 <div id="box" class="box">
 <ul id="ul">
 <li><img src="images/1.jpg" width="500" height="200"></li>
 <li><img src="images/2.jpg" width="500" height="200"></li>
 <li><img src="images/3.jpg" width="500" height="200"></li>
 <li><img src="images/4.jpg" width="500" height="200"></li>
 <li><img src="images/5.jpg" width="500" height="200"></li>
 </ul>
 <ol id="ol">
 <li class="current">1</li>
 <li>2</li>
 <li>3</li>
 <li>4</li>
 <li>5</li>
 </ol>
 </div>
 </div>
 </body>
</html>

应用上述样式后的页面展示效果如图所示。

无缝滚动原理概述

JavaScript动态逻辑实现

接下来js代码,在此之前我们要明确,小圆点 1 2 3 并非固定写死,而是依据ul li中图片的数量动态生成,因此需先移除div中ol li的原有代码。

为了实现无缝滚动的视觉效果,必须额外添加一张图片。具体做法是将第一张图片克隆一份,并追加到列表末尾。此时保持CSS布局不变,HTML结构中仅保留必要的容器与图片列表。


<body>
 <div id="scroll" class="scroll">
 <div id="box" class="box">
 <ul id="ul">
 <li><img src="images/1.jpg" width="500" height="200"></li>
 <li><img src="images/2.jpg" width="500" height="200"></li>
 <li><img src="images/3.jpg" width="500" height="200"></li>
 <li><img src="images/4.jpg" width="500" height="200"></li>
 <li><img src="images/5.jpg" width="500" height="200"></li>
 </ul> 
 </div>
 </div>
 </body>

随后,使用JavaScript代码动态生成对应数量的小圆点指示器。


var scroll = document.getElementById("scroll"); // 获得大盒子
var ul = document.getElementById("ul"); // 获得ul
var ulLis = ul.children;// 获得ul的盒子 以此来生成ol中li的个数
var liWidth = ul.children[0].offsetWidth;// 获得每个li的宽度
 // 操作元素
 // 因为要做无缝滚动,所以要克隆第一张,放到最后一张后面
 // 1. 克隆元素
 ul.appendChild(ul.children[0].cloneNode(true));

 // 2.创建ol 和li
 vaar ol = document.createElement("ol");//创建ol元素
 scroll.appendChild(ol);// 把ol放到scroll盒子里面去
 for (var i=0;i<ulLis.length-1;i++) {
 var li = document.createElement("li");// 创建li元素
 li.innerHTML = i + 1;// 给li里面添加文字 1 2 3 4 5
 ol.appendChild(li);// 将li元素添加到ol里面
 }
ol.children[0].className = "current";// ol中的第一个li背景色为purple

当ol中的li元素(即小圆点)创建完成后,我们继续编写JavaScript动画逻辑。

动画交互与定时器控制

动画交互部分主要包含以下四个功能点:

1. 鼠标悬停在某一个小圆点上时,图片应切换至对应的索引位置,同时当前小圆点的样式(如颜色)需发生高亮变化。 2. 图片需具备自动轮播功能,这依赖于JavaScript定时器的支持。 3. 当鼠标移入图片区域时,自动轮播应暂停,即清除当前的定时器。 4. 当鼠标移出图片区域时,自动轮播应继续执行,即重新启动定时器。 为此,我们封装了一个通用的animate()动画函数以处理运动逻辑。


// 动画函数 第一个参数,代表谁动 第二个参数 动多少
// 让图片做匀速运动,匀速动画的原理是 当前的位置 + 速度 即 offsetLeft + speed

 function animate(obj,target){
 // 首先清除掉定时器
 clearInterval(obj.timer);
 // 用来判断 是+ 还是 - 即说明向左走还是向右走
 var speed = obj.offsetLeft < target ? 15 : -15;
 obj.timer = setInterval(function(){
 var result = target - obj.offsetLeft;//它们的差值不会超过speed
 obj.style.left = obj.offsetLeft + speed + "px";
 // 有可能有小数的存在,所以在这里要做个判断 
 if (Math.abs(result) <= Math.abs(speed)) {
 clearInterval(obj.timer);
 obj.style.left = target + "px";
 }
 },10);
 }

关于定时器的封装与控制函数。


var timer = null; // 轮播图的定时器
 var key = 0;// 控制播放的张数
 var circle = 0;// 控制小圆点

 timer = setInterval(autoplay,1000);// 自动轮播
 function autoplay(){
 /*自动轮播时,要对播放的张数key进行一个判断,如果播放的张数超过ulLis.length-1,
 就要重头开始播放. 因为我们克隆了第一张并将其放在最后面,所以我们要从第二张图片开始播放*/
 key++; // 先++
 if(key > ulLis.length-1){// 后判断

 ul.style.left = 0; // 迅速调回
 key = 1; // 因为第6张是第一张,所以播放的时候是从第2张开始播放
 }
 // 动画部分
 animate(ul,-key*liWidth);
 // 小圆点circle 当显示第几张图片是,对应的小圆点的颜色也发生变化

 /*同理,对小圆点也要有一个判断*/
 circle++;
 if (circle > olLis.length-1) {
 circle = 0;
 }
 // 小圆点颜色发生变化
 for (var i = 0 ; i < olLis.length;i++) {
 // 先清除掉所用的小圆点类名
 olLis[i].className = ""; 
 }
 // 给当前的小圆点 添加一个类名
 olLis[circle].className = "current";

 }

以上展示了实现轮播效果的核心代码片段,完整的可运行代码可通过相关资源下载获取。

本文介绍了JavaScript实现轮播图的主要原理与代码实现,希望对读者的学习有所帮助,欢迎继续支持本站内容。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章