JS实现单张或多张图片持续无缝滚动的示例代码


Posted in Javascript onMay 10, 2020

背景:

想要实现图片持续滚动,既然使用js,就千万不要加css动画、过渡等相关样式,如果想要滚动的平滑一下,可以一像素一像素的感动,则很平滑,如果加了过渡动画,当图片重置为0时,会有往回倒的动画效果,跟预期不符。

原理:

图片滚动原理同图片轮播原理,同样也适用于文字滚动等一系列滚动,通过复制最后一张图片或最后一堆文字插入第一行,或复制第一张图片或一堆文字插入在结尾,来实现无缝拼接,前提:1、必须是没有设置过渡动画的,2、重置为0的时候与当前已经滚动到的高度对于图片的位置而言肉眼看上去没变化。

实现:

html主要包含三块:

1、最外层盒子,用来展示滚动图的区域,overflow:hidden;

2、滚动的盒子,主要改变该盒子的定位值,来实现滚动,里面包含所有要滚动的图片或文字

3、包含图片或文字的盒子。

代码:

class Roll {
  constructor(opts) {
    this.elem = opts.elem; // 图片包含滚动长度的元素的
    this.elemBox = opts.elemBox; //图片展示区域元素,为了获取展示区域的高度
    this.direction = opts.direction;
    this.time = opts.time;
    this.init();
    this.roll = this.roll.bind(this)
    this.startRoll = this.startRoll.bind(this)
    this.stopRoll = this.stopRoll.bind(this)
  }
  init(){
    this.elemHeight = this.elem.offsetHeight;
    this.elemHtml = this.elem.innerHTML;
    this.elem.innerHTML = this.elem.innerHTML + this.elemHtml+ this.elemHtml;
    this.speed;
    // 如果向上滚或者向左滚动每次减1,向下滚或者向右滚动每次加1
    if(this.direction === 'top' || this.direction === 'left'){
      this.speed = -1;
    }else{
      this.speed = 1;
    }
  }
  roll(){
    switch (this.direction) {
      case "top":
        // 如果滚动的盒子的top值超出元素的高度,则置为0
        if(Math.abs(this.elemBox.offsetTop) >= this.elemHeight){
          this.elemBox.style.top = 0;
        }else{
          this.elemBox.style.top = this.elemBox.offsetTop + this.speed + 'px';
        }
        break;
      case "bottom":
        // 如果滚动的盒子的bottom值超出元素的高度,则置为0
        if(Math.abs(this.elemBox.offsetBottom) >= this.elemHeight){
          this.elemBox.style.bottom = 0;
        }else{
          this.elemBox.style.bottom = this.elemBox.offsetBottom + this.speed + 'px';
        }
        break;
      case "left":
        // 如果滚动的盒子的left超出元素的高度,则置为0
        if(Math.abs(this.elemBox.offsetLeft) >= this.elemHeight){
          this.elemBox.style.left = 0;
        }else{
          this.elemBox.style.left = this.elemBox.offsetLeft + this.speed + 'px';
        }
        break;
      case "right":
        // 如果滚动的盒子的right超出元素的高度,则置为0
        if(Math.abs(this.elemBox.offsetRight) >= this.elemHeight){
          this.elemBox.style.right = 0;
        }else{
          this.elemBox.style.right = this.elemBox.offsetRight + this.speed + 'px';
        }
        break;
      default:
        // 默认向上滚动,如果滚动的盒子的top超出元素的高度,则置为0
        if(Math.abs(this.elemBox.offsetTop) >= this.elemHeight){
          this.elemBox.style.top = 0;
        }else{
          this.elemBox.style.top = this.elemBox.offsetTop + speed + 'px';
        }
    }
  }
  stopRoll(){
    clearInterval(this.scrollTimer)
  }
  startRoll(){
    this.scrollTimer = setInterval(this.roll,this.time)
  }
}

参考链接:

https://www.teakki.com/p/590beb7be8136dfc5f21770d

总结

到此这篇关于JS实现单张或多张图片持续无缝滚动的文章就介绍到这了,更多相关js 图片 无缝滚动内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
Javascript 面试题随笔
Mar 31 Javascript
JS TextArea字符串长度限制代码集合
Oct 31 Javascript
JS生成某个范围的随机数【四种情况详解】
Apr 20 Javascript
JS中使用apply、bind实现为函数或者类传入动态个数的参数
Apr 26 Javascript
快速掌握jQuery插件开发
Jan 19 Javascript
JavaScript实现类似淘宝的购物车效果
Mar 16 Javascript
解决angularjs前后端分离调用接口传递中文时中文乱码的问题
Aug 13 Javascript
详解JavaScript中的坐标和距离
May 27 Javascript
使用JQuery自动完成插件Auto Complete详解
Jun 18 jQuery
vue项目中微信登录的实现操作
Sep 08 Javascript
Vue和React有哪些区别
Sep 12 Javascript
使用这 6个Vue加载动画库来减少我们网站的跳出率
May 18 Vue.js
Layer UI表格列日期格式化及取消自动填充日期的实现方法
May 10 #Javascript
angula中使用iframe点击后不执行变更检测的问题
May 10 #Javascript
JavaScript 装逼指南(js另类写法)
May 10 #Javascript
js中!和!!的区别与用法
May 09 #Javascript
JS端基于download.js实现图片、视频时直接下载而不是打开预览
May 09 #Javascript
JS 获取文件后缀,判断文件类型(比如是否为图片格式)
May 09 #Javascript
js根据后缀判断文件文件类型的代码
May 09 #Javascript
You might like
用PHP将数据导入到Foxmail
2006/10/09 PHP
php Smarty date_format [格式化时间日期]
2010/03/15 PHP
在laravel框架中使用model层的方法
2019/10/08 PHP
JavaScript arguments 多参传值函数
2010/10/24 Javascript
jQuery中live方法的重复绑定说明
2011/10/21 Javascript
Javascript合并表格中具有相同内容单元格示例
2013/08/11 Javascript
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
jQuery Form 页面表单提交的小例子
2013/11/15 Javascript
JS 实现列表与多选框选择附预览动画
2014/10/29 Javascript
javascript获取网页各种高宽及位置的方法总结
2016/07/27 Javascript
详解Nodejs基于mongoose模块的增删改查的操作
2016/12/21 NodeJs
javascript实现页面滚屏效果
2017/01/17 Javascript
Bootstrap里的文件分别代表什么意思及其引用方法
2017/05/01 Javascript
JS给按钮添加跳转功能类似a标签
2017/05/30 Javascript
vuejs父子组件之间数据交互详解
2017/08/09 Javascript
VSCode配置react开发环境的步骤
2017/12/27 Javascript
分享ES6的7个实用技巧
2018/01/18 Javascript
JavaScript设计模式之装饰者模式实例详解
2019/01/17 Javascript
vue实现百度下拉列表交互操作示例
2019/03/12 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
2019/12/10 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
让你Python到很爽的加速递归函数的装饰器
2019/05/26 Python
Django模板语言 Tags使用详解
2019/09/09 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
Python实现读取并写入Excel文件过程解析
2020/05/27 Python
pycharm永久激活超详细教程
2020/10/29 Python
Python+unittest+requests+excel实现接口自动化测试框架
2020/12/23 Python
HTML5对比HTML4的主要改变和改进总结
2016/05/27 HTML / CSS
社区消防工作实施方案
2014/03/21 职场文书
优秀员工评优方案
2014/06/13 职场文书
2015年学校办公室主任工作总结
2015/07/20 职场文书
话题作文之成长
2019/12/09 职场文书
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
2021/06/07 Python
html实现弹窗的实例
2021/06/09 HTML / CSS
MySQL中datetime时间字段的四舍五入操作
2021/10/05 MySQL