JavaScript学习笔记之基于定时器实现图片无缝滚动功能详解


Posted in Javascript onJanuary 09, 2019

本文实例讲述了JavaScript学习笔记之基于定时器实现图片无缝滚动功能。分享给大家供大家参考,具体如下:

一、无缝滚动理论基础

基础知识

1.setInterval(function,time)、clearInterval(timer)

setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。
setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。

clearInterval() 方法可取消由 setInterval() 设置的 timeout。
clearInterval() 方法的参数必须是由 setInterval() 返回的 ID 值。

2.offsetLeft与style.left的区别

offsetLeft 获取的是相对于父对象的左边距

left 获取或设置相对于 具有定位属性(position定义为relative)的父对象 的左边距

如果父div的position定义为relative,子div的position定义为absolute,那么子div的style.left的值是相对于父div的值,

这同offsetLeft是相同的,区别在于:

1. style.left 返回的是字符串,如28px,offsetLeft返回的是数值28,如果需要对取得的值进行计算,还用offsetLeft比较方便。
2. style.left是读写的,offsetLeft是只读的,所以要改变div的位置,只能修改style.left
3. style.left的值需要事先定义,否则取到的值为空。而且必须要定义在html里,我做过试验,如果定义在css里,style.left的值仍然 为空,这就是我刚开始碰到的问题,总是取不到style.left的值。

offsetLeft则仍然能够取到,无需事先定义div的位置。

二、代码片段

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>无缝滚动</title>
  <style>
    *{
      margin: 0;
      padding: 0;
    }
    #div2{
      width: 400px;
      margin: 100px auto;
    }
    input{
      margin:0 auto;
      text-align: center;
      margin-left: 80px;
      font-size: 40px;
    }
    #div1{
      width: 712px;
      height: 108px;
      margin: 100px auto;
      position: relative;
      background-color: red;
      overflow: hidden;
    }
    #div1 ul{
      position: absolute;
      left: 0;
      top: 0;
    }
    #div1 ul li{
      float: left;
      width: 178px;
      height: 108px;
      list-style:none;
    }
  </style>
  <script>
    window.onload=function(){
      var oDiv=document.getElementById('div1');
      var oUl=document.getElementsByTagName('ul')[0];
      var aLi=oUl.getElementsByTagName('li');
      var lBtn=document.getElementById('lbtn');
      var rBtn=document.getElementById('rbtn');
      //将ul复制一份相加复制给ul(这样ul相当于有8张图片)
      oUl.innerHTML=oUl.innerHTML+oUl.innerHTML;
      oUl.style.width=aLi[0].offsetWidth*aLi.length+'px';
      //speed控制图片移动方向和速度
      var speed=2;
      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);
      // 鼠标移进时,图片停止运动
      oDiv.onmouseover=function(){
        clearInterval(timer);
      };
      //鼠标移出时,图片继续移动
      oDiv.onmouseout=function(){
      timer=setInterval(move,30);
      }
      //按钮控制移动方向
      lBtn.onclick= function () {
        speed=-2;
      }
      rBtn.onclick=function(){
        speed=2;
      }
    };
  </script>
</head>
<body>
<div id="div2" >
  <input type="button" value="向左" id="lbtn"/>
  <input type="button" value="向右" id="rbtn"/>
</div>
  <div id="div1">
    <ul>
      <li><img src="images/1.jpg" alt=""/></li>
      <li><img src="images/2.jpg" alt=""/></li>
      <li><img src="images/3.jpg" alt=""/></li>
      <li><img src="images/4.jpg" alt=""/></li>
    </ul>
  </div>
</body>
</html>

三、效果图

 JavaScript学习笔记之基于定时器实现图片无缝滚动功能详解

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
Js切换功能的简单方法
Nov 23 Javascript
JS实现随机数生成算法示例代码
Aug 08 Javascript
JS实现根据出生年月计算年龄
Jan 10 Javascript
JavaScript字符串删除重复字符的方法
Dec 25 Javascript
jquery动态添加文本并获取值的方法
Oct 12 Javascript
JavaScript之Vue.js【入门基础】
Dec 06 Javascript
JavaScript中的call和apply的用途以及区别
Jan 11 Javascript
浅谈angular2路由预加载策略
Oct 04 Javascript
vue单个组件实现无限层级多选菜单功能
Apr 10 Javascript
解析vue data不可以使用箭头函数问题
Jul 03 Javascript
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
Feb 24 Javascript
Vue深入理解插槽slot的使用
Aug 05 Vue.js
element-ui 时间选择器限制范围的实现(随动)
Jan 09 #Javascript
JavaScript学习笔记之DOM基础操作实例小结
Jan 09 #Javascript
如何解决webpack-dev-server代理常切换问题
Jan 09 #Javascript
JavaScript学习笔记之数组基本操作示例
Jan 09 #Javascript
浅谈webpack性能榨汁机(打包速度优化)
Jan 09 #Javascript
Node.js的进程管理的深入理解
Jan 09 #Javascript
从vue源码看props的用法
Jan 09 #Javascript
You might like
php横向重复区域显示二法
2008/09/25 PHP
php获得用户ip地址的比较不错的方法
2014/02/08 PHP
使用PHP生成二维码的两种方法(带logo图像)
2014/03/14 PHP
PHP基于yii框架实现生成ICO图标
2015/11/13 PHP
PHP dirname简单使用代码实例
2020/11/13 PHP
js计算页面刷新的次数
2009/07/20 Javascript
突发奇想的一个jquery插件
2010/11/19 Javascript
js获得地址栏?问号后参数的方法
2013/08/08 Javascript
javascript常用的正则表达式实例
2014/05/15 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
2014/09/03 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
2016/03/08 Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
2016/05/10 Javascript
Javascript 引擎工作机制详解
2016/11/30 Javascript
js模态对话框使用方法详解
2017/02/16 Javascript
JS获得一个对象的所有属性和方法实例
2017/02/21 Javascript
JS实现简易刻度时钟示例代码
2017/03/11 Javascript
浅谈Koa服务限流方法实践
2017/10/23 Javascript
angularjs实现柱状图动态加载的示例
2017/12/11 Javascript
Python求解平方根的方法
2015/03/11 Python
Python中常见的数据类型小结
2015/08/29 Python
python判断字符串编码的简单实现方法(使用chardet)
2016/07/01 Python
对TensorFlow中的variables_to_restore函数详解
2018/07/30 Python
python logging.basicConfig不生效的原因及解决
2020/02/20 Python
在python3中实现查找数组中最接近与某值的元素操作
2020/02/29 Python
python的列表List求均值和中位数实例
2020/03/03 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
2020/06/08 Python
HTML5 播放 RTSP 视频的实例代码
2019/07/29 HTML / CSS
One.com挪威:北欧成长最快的网络托管公司
2016/11/19 全球购物
什么是serialVersionUID
2016/03/04 面试题
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
校园新闻广播稿
2014/01/10 职场文书
公司会计岗位职责
2014/02/13 职场文书
党委工作总结2015
2015/04/27 职场文书
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL
mysql如何能有效防止删库跑路
2021/10/05 MySQL
SQL Server使用PIVOT与unPIVOT实现行列转换
2022/05/25 SQL Server