JavaScript 焦点轮播实现:无缝滚动与图片滑动切换技巧
作者:木棉时间:2026-10-21 23:21:02浏览:321
本文详解基于JavaScript的焦点轮播图实现方案,重点解决从最后一张图回到第一张时的视觉跳跃问题。通过添加辅助图片构建无限循环逻辑,并结合函数递归实现平滑的滑动切换效果,提升用户体验。
焦点轮播无缝滚动原理
在前一篇关于JavaScript焦点轮播效果的文章基础上,本文进一步介绍如何利用函数递归实现图片的平滑滑动切换,并采用添加辅助图片的技巧来实现图片的无限滚动。
如果不进行特殊处理,图片序列通常表示为[1,2,3,4,5]。当用户浏览到第5张图片并点击“下一张”时,程序需要跳转回第1张图片。此时,若直接执行动画,会看到中间所有图片快速闪过,视觉效果不佳。
为了解决上述视觉跳跃问题,需要在第5张图片之后额外添加一张第1张图片的副本,使序列变为[1,2,3,4,5,1]。当处于第5张图片并点击“下一张”时,动画路径变为:从第5张滚动至新增的第1张副本,随后立即跳转至原始的第1张图片。
由于新增的第1张副本与原始第1张图片在视觉内容上完全一致,用户无法察觉这一瞬间的跳转,从而实现了无缝滚动的视觉效果。
具体效果如下图所示:

代码实现细节
相关实现代码如下:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style type="text/css">
*{
margin: 0;
padding: 0;
list-style: none;
text-decoration: none;
}
.wrap{
width: 490px;
height: 170px;
margin: 100px auto;
border: 1px solid #000000;
position: relative;
overflow: hidden;
}
#pic{
width: 3430px;
position: absolute;
}
#pic li{
float: left;
height: 170px;
}
#list{
position: absolute;
bottom: 10px;
left:150px ;
}
#list li{
float: left;
width: 15px;
height: 15px;
background: #fff;
margin: 0 10px;
border-radius: 50%;
cursor: pointer;
}
#list .on{
background: #e27a00;
}
.Prev{
top: 30px;
left: 0;
}
.Next{
top: 30px;
right: 0;
}
.Prev,.Next{
position: absolute;
font-size: 80px;
font-weight: bold;
color:#fff ;
-webkit-transition: all 0.35s ease-in-out
}
.Next:hover,
.Prev:hover{
background: #ccc;
background: rgba(204, 204, 204, 0.4);
}
</style>
<script type="text/javascript">
window.onload=function(){
var wrap=document.getElementById('wrap');
var pic=document.getElementById('pic');
var Li=document.getElementById('list').getElementsByTagName('li');
var prev=document.getElementById('Prev');
var next=document.getElementById('Next');
var animated=false;
var index=0;
var timer=null;
next.onclick=function(){
if(animated){//如果图片正在滚动时要返回,否则index会变化
return;
}
else{
index++;
if(index>=Li.length){
index=0;
}
}
showlist();
if(animated == false){//if(!animated)
animate(-490);
}
}
prev.onclick=function(){
if(animated){
return;
}
else{
index--;
if(index<=0){
index=Li.length-1;
}
}
showlist();
if(!animated){//判断其是否滚动完
animate(490);
}
}
for(var i=0;i<Li.length;i++){
Li[i].num=i;
Li[i].onclick=function(){
if(this.className=="on"){
return;
}
var offset = -490*(this.num-index);
if(!animated){
animate(offset);
}
index=this.num;
showlist();
}
}
//图片变换
function animate(offset){
animated=true;
var newLeft=parseInt(pic.style.left) + offset;
var time=300//位移总时间
var interval=10;//位移间隔时间
var speed=offset/(time/interval);//每次位移量
function go(){
if((speed < 0 && parseInt(pic.style.left) > newLeft )|| (speed > 0 && parseInt(pic.style.left) < newLeft)){
pic.style.left = parseInt(pic.style.left) + speed + 'px';
setTimeout(go,interval);
}else{
animated=false;
pic.style.left= newLeft + 'px';
if(newLeft > -490){
pic.style.left = -2450 + 'px';
}
if(newLeft < -2450){
pic.style.left = -490 + 'px';
}
}
}
go();
}
//圆点变换
function showlist(){
for(var i=0;i<Li.length;i++){
Li[i].className="";
}
Li[index].className="on";
}
//自动播放
function play(){
timer=setInterval(function(){
next.onclick();
},2000);
}
function stop(){
clearInterval(timer);
}
wrap.onmouseover=stop;
wrap.onmouseout=play;
play();
}
</script>
</head>
<body>
<div class="wrap" id="wrap">
<ul id="pic" style="left: -490px;">
<li><a href="#"><img src="/54111d7d00018ba604900170.jpg" alt="5"/></a></li>
<li><a href="#"><img src="/54111cd9000174cd04900170.jpg" alt="1"/></a></li>
<li><a href="#"><img src="/54111dac000118af04900170.jpg" alt="2"/></a></li>
<li><a href="#"><img src="/54111d9c0001998204900170.jpg" alt="3"/></a></li>
<li><a href="#"><img src="/54111d8a0001f41704900170.jpg" alt="4"/></a></li>
<li><a href="#"><img src="/54111d7d00018ba604900170.jpg" alt="5"/></a></li>
<li><a href="#"><img src="/54111cd9000174cd04900170.jpg" alt="1"/></a></li>
</ul>
<ul id="list">
<li class="on"></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<a href="javascript:;" class="Prev" id="Prev"><</a>
<a href="javascript:;" class="Next" id="Next">></a>
</div>
</body>
</html>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
作者最新文章
JS合并多个数组的三种方法:concat、spread与flat
2026-11-05 17:39:45
JavaScript怎么准确判断数据类型:typeof、instanceof与Object.prototype.toString
2026-11-05 17:09:21
JS中将数组和对象混合组装为JSON字符串
2026-11-05 16:41:42
JS运算符优先级与结合性的区别是什么?
2026-11-05 13:22:02
JS Map怎么只遍历Key或Value
2026-11-05 13:00:36
