原生javascript实现无缝滚动

本文介绍如何使用JavaScript实现图片的无缝滚动效果。通过定时器控制图片移动,利用克隆内容确保滚动循环进行。文章提供了完整的HTML、CSS及JavaScript代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现javascript的无缝滚动需要掌握基本的定位和运动知识
逐步分析图片的无缝滚动是怎么实现的
HTML的基本结构如下

<div id='moving'>
  <ul>
    <li><img src='1.jpg' /></li>
    <li><img src='2.jpg' /></li>
    <li><img src='3.jpg' /></li>
    <li><img src='4.jpg' /></li>
  </ul>
</div>
<div id='control'>
  <input id='left' type="button" value="Left" />
  <input type="button" id="stop" value="Stop" />
  <input id='right' type="button" value="Right" />
</div>

CSS样式:

#moving {
  width: 600px;
  height: 370px;
  background-color: #ccc;
  position: relative;
  margin: 30px auto 0;
  overflow: hidden;
}
#moving ul {
  position: absolute;
  left: 0;
  top: 0;
}
#moving ul li {
  list-style: none;
  float: left;
}
#control {
  width:300px;
  margin: 20px auto;
}
#control input {
  margin-left: 30px;
  width: 50px;
}

要实现图片窗口整体的无缝滚动(我们需要通过定时器定时改变<ul>的位置,于是我们有下面的片段来实现:

oUl.style.left = oUl.offsetLeft + speed + 'px';

speed对应定时器时间段内移动的距离,oUl指ul
    开始这样做能实现基本的运动,但是图片总是数量有限的,当最后一张图片滚动展示完毕后,后面就没有了内容。那么我们如何克服这个困难,让滚动一直持续循环下去呢?
    为了达到这种效果,我们可以克隆同样的ul结构,并且拼接在一起,比如:

oUl.innerHTML += oUl.innerHTML;

注意不要漏了在ul加入overflow:hidden,否则可能会两栏显示
但是这样做还是不够的,图片总会播放完,但是我们不可能复制成千上万分一样的ul结构
这时候需要一点小技巧
当左段ul(为了阐述方便,分为两段,左段为原始,右段为复制的那份)滚动完成,右段的开头即将离开图片窗口的时候,将整个ul拉回到原始位置。如果是向右运动,那么当左端的开头第一张图片到左边尽头时,整个ul拉回到起始位置

function move(){
            if(oUl.offsetLeft < -oUl.offsetWidth/2){  //向左滚动时滚动完左段后马上将它拉回来
                oUl.style.left = '0';
            }
            if(oUl.offsetLeft > 0){
                oUl.style.left = -oUl.offsetWidth/2 + 'px';  //向右滚动时最后一段已经到尽头
            }
            oUl.style.left = oUl.offsetLeft + speed + 'px';
        }

以下是javascript部分

    window.onload = function(){
        var oMove = document.getElementById('moving');
        var oUl = oMove.getElementsByTagName('ul')[0];
        var aLi = oUl.getElementsByTagName('li');
        var oCtr = document.getElementById('control');
        var oLeft = document.getElementById('left');
        var oRight = document.getElementById('right');
        var speed = null;

        oUl.innerHTML += oUl.innerHTML;  //两段一样的内容
        oUl.style.width = aLi[0].offsetWidth*aLi.length + "px";  //两段ul宽度不够,第二段会掉下去

        oLeft.onclick = function(){
            return speed = -3;
        }
        oRight.onclick = function(){
            return speed = 3;
        }

        function move(){
            if(oUl.offsetLeft < -oUl.offsetWidth/2){  //向左滚动时滚动完第一段后马上将它拉回来
                oUl.style.left = '0';
            }
            if(oUl.offsetLeft > 0){
                oUl.style.left = -oUl.offsetWidth/2 + 'px';  //向右滚动时最后一段已经到尽头
            }
            oUl.style.left = oUl.offsetLeft + speed + 'px';
        }
        var timer = setInterval(move,30);
        oMove.onmouseover = function(){
            clearInterval(timer);
        };
        oMove.onmouseout = function(){
            timer = setInterval(move,30);
        };

        var btn = document.getElementById("stop");
        btn.onclick = function(){
            clearInterval(timer);   //stop按键停止运动,如果在点击后将鼠标先移入图片再移出会重新开启
        }
    }

以上是智能社课程学习内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值