js实现图片无缝滚动特效


Posted in Javascript onMarch 19, 2020

首先,无缝滚动的第一个重点就是——动。关于怎么让页面的元素节点动起来,这就得学明白关于JavaScript中定时器的相关知识。

JS中的创建定时器的方法包括两种:setTimeout和setInterval。首先它们接收的参数相同:第一个参数是一个函数,用于定时器执行,第二个参数是一个数字,代表过多少毫秒之后定时器执行函数。它们的不同在于:setTimeout 是在经过指定的时间之后,只执行一次函数,而setInterval,则是每间隔指定时间,就执行函数一次,说简单点的话,就是setInterval是setTimeout的循环版。

关于定时器还有一个用法:消除定时器,方法同样有两种:clearTimeout 和 clearInterval,它们分别对应不同类型的定时器。另外,它们都只接收一个参数,这个参数是定时器返回的一个值(我在chrome中调试发现这个返回值都是数字),用于指定消除那个定时器。

定时器的知识掌握之后,就开始分析怎样使用定时器让元素动起来。其实这个很简单,就是类似电影的原理一样,让元素在很短的时间内发生连续的位移,我们看起来的话这个元素就想是在不停地运动啦。关于怎么让元素产生位移,通过JS修改元素的样式就可以实现,例如

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

上面的代码中speed就是每次产生的位移。关于speed使用还挺有意思的:我们可以修改speed的正负值来修改滚动的方向。

另外,关于元素的属性 offsetLeft 我个人认为需要注意两点:offsetLeft的值由它自己通过定位的left和自己设定的margin的和、offsetLeft它是相对于它的包含层的距离(offsetTop类似)。当然这都是我自己的理解,肯定不是很准确,这个坑记着,下次专门解决它。

让元素动起来的原理基本就是这样,下面开始分析这个无缝滚动展示图片的实现方法,我举得例子都是向左滚动的,向右的原理一样,代码中有提到:

首先假设需要循环滚动的图片只有4张,为了满足图片滚动起来有循环的要求,就需要把图片如图(1)这样做:

js实现图片无缝滚动特效

这样当第一张图片1滚动出边框时,后面的图片1则出现在图片4的后面,这样效果看起来就和循环一样~

当图片滚动到下面的这种情况时:

js实现图片无缝滚动特效

继续滚动就会导致图片后面出现空白,就不是循环滚动的效果了,其实这点也是程序的关键所在,每当图片滚动到图(2)这种情况时,就应该让图片重新回到图(1)那种状态再继续滚动,这样的话就形成了无缝循环滚动的效果。

另外拓展一下程序写了鼠标移入图片停止滚动,移出继续滚动的效果,就是利用消除定时器的方法实现的,代码很简单就不介绍了。还有我为了样式好看一点,把图片都设置为160*120的尺寸使用的,大家运行代码是需要自己准备图片。

代码如下:

<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <style>
  *{
   margin: 0;
   padding: 0;
  }
  #div1{
   width: 640px;
   height: 120px;
   margin: 100px auto;
   background-color: #646464;
   position: relative;
   overflow: hidden;
  }
  #div1 ul{
   position:absolute;
   left:0;
   top:0;
   overflow: hidden;
   background-color: #3b7796;
  }

  #div1 ul li{
   float: left;
   width: 160px;
   height: 120px;
   list-style: none;
  }
 </style>

 <script>
  window.onload = function(){
   var oDiv = document.getElementById('div1');
   var oUl = document.getElementById('ul1');
   var speed = 2;//初始化速度

   oUl.innerHTML += oUl.innerHTML;//图片内容*2-----参考图(2)
   var oLi= document.getElementsByTagName('li');
   oUl.style.width = oLi.length*160+'px';//设置ul的宽度使图片可以放下

   var oBtn1 = document.getElementById('btn1');
   var oBtn2 = document.getElementById('btn2');


   function move(){
    if(oUl.offsetLeft<-(oUl.offsetWidth/2)){//向左滚动,当靠左的图4移出边框时
     oUl.style.left = 0;
    }

    if(oUl.offsetLeft > 0){//向右滚动,当靠右的图1移出边框时
     oUl.style.left = -(oUl.offsetWidth/2)+'px';
    }

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

   oBtn1.addEventListener('click',function(){
    speed = -2;
   },false);
   oBtn2.addEventListener('click',function(){
    speed = 2;
   },false);

   var timer = setInterval(move,30);//全局变量 ,保存返回的定时器

   oDiv.addEventListener('mouseout', function () {
    timer = setInterval(move,30);
   },false);
   oDiv.addEventListener('mousemove', function () {
    clearInterval(timer);//鼠标移入清除定时器
   },false);
  }
 </script>
</head>
<body>
 <input id="btn1" type="button" value="向左">
 <input id="btn2" type="button" value="向右">
 <div id="div1">

  <ul id="ul1">
   <li><img src="img/img_1.jpg"></li>
   <li><img src="img/img_2.jpg"></li>
   <li><img src="img/img_3.jpg"></li>
   <li><img src="img/img_4.jpg"></li>
  </ul>
 </div>
</body>
</html>

以上就是js实现无缝滚动特效的详细代码,希望对大家的学习有所帮助。

Javascript 相关文章推荐
无阻塞加载脚本分析[全]
Jan 20 Javascript
jquery解决图片路径不存在执行替换路径
Feb 06 Javascript
select多选 multiple的使用示例
Jun 16 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
Oct 31 Javascript
jQuery中height()方法用法实例
Dec 24 Javascript
js实现同一页面多个不同运动效果的方法
Apr 10 Javascript
vue.js框架实现表单排序和分页效果
Aug 09 Javascript
Vue2.0用 watch 观察 prop 变化(不触发)
Sep 08 Javascript
vue仿淘宝订单状态的tab切换效果
Jun 23 Javascript
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
Dec 23 Javascript
如何解决webpack-dev-server代理常切换问题
Jan 09 Javascript
vue组件中节流函数的失效的原因和解决方法
Dec 02 Vue.js
学习JavaScript设计模式之迭代器模式
Jan 19 #Javascript
学习JavaScript设计模式之观察者模式
Apr 22 #Javascript
JS获取CSS样式(style/getComputedStyle/currentStyle)
Jan 19 #Javascript
详解javascript实现自定义事件
Jan 19 #Javascript
JS拖拽组件学习使用
Jan 19 #Javascript
理解JS绑定事件
Jan 19 #Javascript
AngularJS模块学习之Anchor Scroll
Jan 19 #Javascript
You might like
天使彦史上最神还原,性别曝光的那一刻,百万网友恋爱了
2020/03/02 国漫
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
php对文件夹进行相关操作(遍历、计算大小)
2015/11/04 PHP
JQuery toggle使用分析
2009/11/16 Javascript
js 编程笔记 无名函数
2011/06/28 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
2013/01/09 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
js检测网络是否具体连接功能的代码
2014/05/23 Javascript
使用jQuery的attr方法来修改onclick值
2014/07/07 Javascript
JQuery select(下拉框)操作方法汇总
2015/04/15 Javascript
js动态生成Html元素实现Post操作(createElement)
2015/09/14 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
2017/01/13 Javascript
详解webpack 配合babel 将es6转成es5 超简单实例
2017/05/02 Javascript
validationEngine 表单验证插件使用实例代码
2017/06/15 Javascript
vue.js评论发布信息可插入QQ表情功能
2017/08/08 Javascript
JS实现前端缓存的方法
2017/09/21 Javascript
Vue实战之vue登录验证的实现代码
2017/10/31 Javascript
mpvue小程序循环动画开启暂停的实现方法
2019/05/15 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
2019/09/25 Javascript
在react中使用vue的状态管理的方法示例
2020/05/02 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
python笔记(1) 关于我们应不应该继续学习python
2012/10/24 Python
VSCode下配置python调试运行环境的方法
2018/04/06 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
2018/04/20 Python
python多进程实现文件下载传输功能
2018/07/28 Python
python实现BP神经网络回归预测模型
2019/08/09 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
2019/11/07 Python
Python文件操作模拟用户登陆代码实例
2020/06/09 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
2020/09/29 Python
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
英语辞职信怎么写
2015/02/28 职场文书
实习生辞职信范文
2015/03/02 职场文书
会计做账心得体会
2016/01/22 职场文书
只需要100行Python代码就可以实现的贪吃蛇小游戏
2021/05/27 Python
CSS 左边固定宽右边自适应的6种方法
2022/05/15 HTML / CSS