原生JavaScript实现无缝轮播图完整教程

作者:闭包旅人

时间:2026-10-23

浏览:106

本文详细解析了使用原生JavaScript实现无缝轮播图的核心原理与完整代码。通过复制首尾图片构建无限循环视觉,结合定时器控制位移与索引同步,实现平滑过渡效果。包含HTML结构、CSS样式及JS逻辑的完整示例,适合前端初学者学习DOM操作与动画实现。

文章目录

原生JS无缝轮播图实现教程

本文分享了一个使用JavaScript实现无缝轮播图的具体代码示例,供读者参考学习。

首先展示最终的运行效果。

原生JS无缝轮播图实现教程

轮播原理与结构分析

接着展示实现该效果的核心原理图。

原生JS无缝轮播图实现教程

从原理图可以看出,页面按顺序依次显示5张图片。包裹这五张图片的外层容器称为ul,通过控制ul向左或向右移动不同的距离,实现在视图中显示不同图片的轮播效果。同时,下方的分页指示点(小圆球)需要根据当前显示的图片内容进行相应的点亮状态切换。

为了实现无缝轮播,需要在第五张图片之后追加复制第一张图片。当用户点击右侧箭头向右切换,且页面切换到第六张(即复制的第一张图片)时,程序需要将ul的位置瞬间重置到第一张原始图片的位置,随后再从第一张图片平滑滑动到第二张,从而形成视觉上的无缝过渡效果。

同理,当点击左侧箭头向左切换,且当前已显示第一张原始图片时,若继续向左切换,ul的位置会被瞬间设置为第五张图片的位置,随后从第五张平滑滑动到第四张,以此形成左侧方向的无缝过渡。

HTML结构与JS代码实现

以下是实现该轮播图所需的HTML结构代码。


<div class="wrapper">
 <div class="inner">
  <ul>
   <li>页面1</li>
   <li>页面2</li>
   <li>页面3</li>
   <li>页面4</li>
   <li>页面5</li>
   <li>页面1</li>
  </ul>
  <div class="circle">
   <span class="current">1</span>
   <span>2</span>
   <span>3</span>
   <span>4</span>
   <span>5</span>
  </div>
  <div class="direction">
   <span class="left"><</span>
   <span class="right">></span>
  </div>
 </div>
</div>

接下来是核心的JavaScript实现代码。


//获取页面元素
 var ul = document.getElementsByTagName("ul")[0];
 var inner = document.getElementsByClassName("inner")[0];
 var circle = document.getElementsByClassName("circle")[0];
 var spanArr = circle.children;
 var direction =document.getElementsByClassName("direction")[0];
 var dirChid=direction.children;
 var innerWidth = inner.offsetWidth;
 //两个定时器(一个记录图片,一个记录小圆球)
 var dindex = 0;
 var span = 0;
 //var ulNewLi = ul.children[0].cloneNode(true);
 // ul.appendChild(ulNewLi);
 for(var i = 0;i<spanArr.length;i++){
  //给每个span绑定index,为了和ul中的页面联动
  spanArr[i].index = i;
  spanArr[i].onmouseover = function () {
   //点击分页小球,添加current类,current类定义了小球的背景颜色
   for (var j = 0; j<spanArr.length ;j++) {
    spanArr[j].className = "";
   }
   this.className = "current";
   dindex = span = this.index;
   //调用缓动函数,传入参数:移动元素,目标距离
   animation(ul,-this.index*innerWidth);
  }
 }
 //为左箭头绑定事件
 //dindex 记录图片的索引,span记录小球的索引,图片个数为6,小球的个数为5
 dirChid[0].οnclick=function (event) {
  //每次点击左切换,图片的索引减一,小球的索引减一
  dindex--;
  //图片的索引<0时,设置ul的位置为第五个图片的位置
  if(dindex<0){
   ul.style.left= -innerWidth*spanArr.length+"px";
   dindex= spanArr.length-1;
  }
  animation(ul,-dindex*innerWidth);
  //小球的索引减一
  span--;
  //当小球索引小于0时,设置它的索引为4
  if(span<0){
   span= spanArr.length-1;
  }
  //点亮小球
  for(var i= 0 ; i<spanArr.length;i++){
   spanArr[i].className = "";
  }
  spanArr[span].className = "current";
 
 }
 //为右箭头绑定事件,
 dirChid[1].οnclick=function () {
  dindex++;
  //图片的索引大于小球长度个数时,设置ul的位置为第1张图片的位置
  if(dindex>spanArr.length){
   ul.style.left=0;
   dindex=1;
  }
  animation(ul,-dindex*innerWidth);
  span++;
  if(span>spanArr.length-1){
   span= 0;
  }
  for(var k= 0 ; k<spanArr.length;k++){
   spanArr[k].className = "";
  }
  spanArr[span].className = "current";
 
 }
 
 //封装缓动动画函数
 function animation(ele,target) {
  clearInterval(ele.timer);
  ele.timer=setInterval(function () {
   //获取起使位置
   leader= ele.offsetLeft;
   //获取缓动动画步长
   var step = (target-leader)/10;
   //支持不同方向的移动,所以步长有正有负
   step = step >0? Math.ceil(step):Math.floor(step);
   //当前位置= 盒子的位置+步长
   leader = leader +step;
   ele.style.left = leader+"px";
   if(ele.offsetLeft === target) {
    clearInterval(ele.timer);
   }
  },30)
 
}

此外,本站还提供其他精彩专题分享,包括jQuery图片轮播、JavaScript图片轮播以及Bootstrap图片轮播等相关内容。

以上就是本文的全部内容,希望上述代码和解析能对读者的学习有所帮助。欢迎大家继续支持本站,获取更多技术资源。

实用工具推荐

电子包浆

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

使用 ›
图片压缩

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

使用 ›
相关文章