本文介绍一种原生JS实现的无缝滚动轮播图优化方案。通过为列表添加父级容器并动态复制图片结构,实现任意数量图片的无缝接入。核心改进在于利用JavaScript自动计算折返点,降低代码耦合度,使轮播图更易于维护和扩展。
轮播图优化背景与目标
传统的简单无缝滚动轮播图存在诸多局限,特别是在后期需要增加图片时,往往需要进行大量修改,导致代码耦合度过高,仅适用于特定场景。为了提升代码的灵活性和可维护性,我们可以通过调整图片结构并引入自动计算折算点的方式,对原有代码进行升级。
以下是原始简单滚动轮播图的代码实现。
原始代码结构分析
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
.scroll{
position: relative;
width: 830px;/*展示宽度 展示4个图+3个边框=830*/
height: 130px;
border: 10px solid rgb(15, 15, 15);
margin: 100px auto;
overflow: hidden;
}
.scroll ul{
position: absolute;
width: 5000px;/*ul能存下所有li的宽*/
height: 130px;
top: 0;
left: 0;
}
.scroll ul li{
float: left;
width: 200px;
height: 130px;
margin-right: 10px;
overflow: hidden;
}
</style>
</head>
<body>
<div id="scroll" class="scroll">
<ul id="munit">
<li><img src="../BOM/shuzi/3.png" alt=""></li>
<li><img src="../BOM/shuzi/4.png" alt=""></li>
<li><img src="../BOM/shuzi/5.png" alt=""></li>
<li><img src="../BOM/shuzi/6.png" alt=""></li>
<li><img src="../BOM/shuzi/7.png" alt=""></li>
<li><img src="../BOM/shuzi/8.png" alt=""></li>
<li><img src="../BOM/shuzi/9.png" alt=""></li>
<li><img src="../BOM/shuzi/3.png" alt=""></li>
<li><img src="../BOM/shuzi/4.png" alt=""></li>
<li><img src="../BOM/shuzi/5.png" alt=""></li>
<li><img src="../BOM/shuzi/6.png" alt=""></li>
<li><img src="../BOM/shuzi/7.png" alt=""></li>
<li><img src="../BOM/shuzi/8.png" alt=""></li>
<li><img src="../BOM/shuzi/9.png" alt=""></li>
</ul>
</div>
<script>
//获取元素
var scroll = document.getElementById("scroll");
var munit = document.getElementById("munit");
var li = munit.children;
// 进行滚动
var nowLeft = 0;
//要找到ul元素运动的折返点
var back = -1470;//图和边框是li的宽度,展示的有4张图,所以折返点就是1260
//定时器
var timer = setInterval(run,20);
// 鼠标移上scroll停止
scroll.onmouseover = function(){
clearInterval(timer);
}
// 移开轮播
scroll.onmouseout = function(){
timer = setInterval(run,20);
}
//运动函数
function run(){
nowLeft -= 2;
//判断是否走到了折返点,走到了,则瞬间切换到0位置
if(nowLeft <= back){
nowLeft = 0;
}
munit.style.left = nowLeft + "px";
}
</script>
</body>
</html>
动态结构与自动计算实现
在<div id="scroll">结构中,为ul元素新增一个父级div容器。这样做的目的是在后期添加图片时,可以直接通过获取ul的宽度来计算折算点。具体修改包括:第一,折返点的计算需由JavaScript自动完成,例如通过var back = -munit.offsetWidth;获取元素左移的负数值;第二,自动生成另一组对应的图片结构li,利用munit.innerHTML = munit.innerHTML + munit.innerHTML;实现li标签的自动复制,确保后期增加图片时结构同步扩展。
优化后的代码细节
css改写部分:
/*给ul新增的一个父级div,这样添加图片后期获取ul宽度 就可以了 */
.scroll .inner{
position: relative;
width: 5000px;
}
.scroll ul{
position: absolute;
height: 130px;
top: 0;
left: 0;
list-style: none;
body改写部分:
<body>
<div id="scroll" class="scroll">
<div class="inner">
<ul id="munit">
<li><img src="../BOM/shuzi/3.png" alt=""></li>
<li><img src="../BOM/shuzi/4.png" alt=""></li>
<li><img src="../BOM/shuzi/5.png" alt=""></li>
<li><img src="../BOM/shuzi/6.png" alt=""></li>
<li><img src="../BOM/shuzi/7.png" alt=""></li>
<li><img src="../BOM/shuzi/8.png" alt=""></li>
<li><img src="../BOM/shuzi/9.png" alt=""></li>
<li><img src="../BOM/shuzi/10.png" alt=""></li>
</ul>
</div>
</div>
JS改写部分:
<script>
//获取元素
var scroll = document.getElementById("scroll");
var munit = document.getElementById("munit");
//改写部分
//1 折返点计算需要通过Js自动计算
var back = -munit.offsetWidth;//元素左移,值为负数
//2 自动生成另一组对应的图片结构 li
munit.innerHTML = munit.innerHTML + munit.innerHTML;
// 进行滚动
var nowLeft = 0;
//定时器
var timer = setInterval(run,20);
// 鼠标移上scroll停止
scroll.onmouseover = function(){
clearInterval(timer);
}
// 移开轮播
scroll.onmouseout = function(){
timer = setInterval(run,20);
}
//运动函数
function run(){
nowLeft -= 1;
//判断是否走到了折返点,走到了,则瞬间切换到0位置
if(nowLeft <= back){
nowLeft = 0;
}
munit.style.left = nowLeft + "px";
}
</script>
</body>
</html>
优化效果总结
经过上述修改,代码的耦合度显著降低,能够支持任意数量的li元素和任意大小的图片加入,提升了通用性。
以上即为原生JS实现的简单无缝滚动轮播图的详细优化方案,更多关于JavaScript实现轮播图的资料,请参阅本站其他相关文章。