原生JavaScript实现无缝自动轮播图

作者:函数茶馆时间:2026-10-22 18:00:04浏览:515

本文介绍如何使用原生JavaScript实现一个简单的无缝自动轮播效果。通过复制图片列表实现视觉上的无限循环,利用定时器控制位移,并在关键帧重置位置以达成无缝衔接。

近期持续强化JavaScript基础。在接触jQuery和Vue等框架后,意识到若缺乏对底层原理的理解,往往只能机械地调用API,长期依赖现成库对个人技术成长助益有限。

基础扎实是快速掌握新技术的前提。尝试用原生代码实现功能能带来显著的成就感,此处记录今日复习的原生JS无缝轮播实现过程。

先展示一张配图作为开场。

HTML结构与CSS样式

首先阐述实现思路:将多张图片置于ul元素中进行展示,具体代码实现如下。


<div id="wrap">
  <ul id="ul">
    <li>
      <img src="http://img3.imgtn.bdimg.com/it/u=1135520735,2369294998&fm=200&gp=0.jpg">
    </li>
    <li>
      <img src="http://img2.imgtn.bdimg.com/it/u=695607252,2370769232&fm=200&gp=0.jpg">
    </li>
    <li>
      <img src="http://img4.imgtn.bdimg.com/it/u=4133407901,1533904167&fm=200&gp=0.jpg">
    </li>
    <li>
      <img src="http://img5.imgtn.bdimg.com/it/u=4083237979,1376579798&fm=26&gp=0.jpg">
    </li>
    <li>
      <img src="http://img2.imgtn.bdimg.com/it/u=1640379911,3259036309&fm=26&gp=0.jpg">
    </li>
  </ul>
</div> 

轮播机制采用移动整个ul元素而非调整li的margin。CSS样式设定单张图片宽度为80px,因此容器总宽度设为400px。


 #wrap{
        width: 400px;
        height: 80px;
        overflow: hidden;
        margin-left: 500px;
        margin-top: 300px;
        position: relative;
      }
      #ul{
        position: absolute;
        left: 0;
        top: 0;
        width: 400px;
        font-size: 0;
        margin: 0;
        padding: 0;
      }

基础JavaScript逻辑

JavaScript逻辑相对简单,主要依靠定时器控制ul元素向左或向右缓慢移动。此处暂不讨论后续问题,先提供基础代码。


window.onload = function(){
  var odiv = document.getElementById('wrap');
  var oul = document.getElementById('ul');
  setInterval(function(){
    oul.style.left = oul.offsetLeft + 5 +'px';
  },30)

上述代码仅实现单向移动,图片向左移出后无法复位。需解决当最后一张图片到达左边缘时,如何重新显示第一张图片的问题。

无缝循环实现原理

解决方法是复制一份图片序列,例如原序列为1、2、3、4,扩展为1、2、3、4、1、2、3、4。当显示到第二组的第4张时,将ul位置重置,从而实现视觉上的无缝循环。

基于上述逻辑,具体代码实现如下。


var odiv = document.getElementById('wrap');
      var oul = document.getElementById('ul');
      var oli = oul.getElementsByTagName('li');
      oul.innerHTML = oul.innerHTML + oul.innerHTML;//拼接li,因为图片可能是任意张
      oul.style.width = oli[1].offsetWidth * oli.length + 'px';//ul的宽度等于所有图片宽度的总和
    setInterval(function(){
      if (oul.offsetLeft < -oul.offsetWidth/2) {
        oul.style.left = 0;//如果ul已经显示完了一组,也就是宽度的一半,那么就把他拉回来重新轮播
      }else{
        oul.style.left = oul.offsetLeft - 2 +'px';
      }
    },30);

完整代码与测试

至此功能完成,可将代码复制到浏览器中测试效果。

总结

以上为原生JS实现简单无缝自动轮播效果的完整介绍,希望有所帮助。如有疑问欢迎留言,小编将及时回复。感谢支持。

作者最新文章