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 相关文章推荐
Array.prototype.slice 使用扩展
Jun 09 Javascript
Dreamweaver jQuery智能提示插件,支持版本提示,支持1.6api
Jul 31 Javascript
JS this作用域以及GET传输值过长的问题解决方法
Aug 06 Javascript
jquery和css3实现的炫酷时尚的菜单导航
Sep 01 Javascript
使用js dom和jquery分别实现简单增删改
Sep 11 Javascript
JavaScript实现网页截图功能
Oct 16 Javascript
Node.js静态文件服务器改进版
Jan 10 Javascript
React中的refs的使用教程
Feb 13 Javascript
浅谈Fetch 数据交互方式
Dec 20 Javascript
vue增加强缓存和版本号的实现方法
May 01 Javascript
微信小程序基于movable-view实现滑动删除效果
Jan 08 Javascript
手把手带你入门微信小程序新框架Kbone的使用
Feb 25 Javascript
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 pack与unpack 摸板字符字符含义
2009/10/29 PHP
php中将html中的br换行符转换为文本输入中的换行符
2013/03/26 PHP
PHP禁止个别IP访问网站
2013/10/30 PHP
PHP中file_exists函数不支持中文名的解决方法
2014/07/26 PHP
php最简单的删除目录与文件实现方法
2014/11/28 PHP
JS查看对象功能代码
2008/04/25 Javascript
javascript代码编写需要注意的7个小细节小结
2011/09/21 Javascript
使用UglifyJS合并/压缩JavaScript的方法
2012/03/07 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
利用函数的惰性载入提高javascript代码执行效率
2014/05/05 Javascript
js实现导航栏中英文切换效果
2017/01/16 Javascript
jQuery中hover方法搭配css的hover选择器,实现选中元素突出显示方法
2017/05/08 jQuery
Angularjs的启动过程分析
2017/07/18 Javascript
web前端开发中常见的多列布局解决方案整理(一定要看)
2017/10/15 Javascript
实例详解vue中的$root和$parent
2019/04/29 Javascript
layer.alert自定义关闭回调事件的方法
2019/09/27 Javascript
[43:26]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第二场 11.20
2020/11/23 DOTA
Python的numpy库中将矩阵转换为列表等函数的方法
2018/04/04 Python
在PyCharm下使用 ipython 交互式编程的方法
2019/01/17 Python
对python 多线程中的守护线程与join的用法详解
2019/02/18 Python
Django异步任务之Celery的基本使用
2019/03/23 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
python之pexpect实现自动交互的例子
2019/07/25 Python
电子邮箱格式怎么写
2014/01/12 职场文书
好矿嫂事迹材料
2014/01/21 职场文书
打造高效课堂实施方案
2014/03/22 职场文书
小学班干部竞选演讲稿
2014/04/24 职场文书
本科毕业生应聘求职信
2014/07/06 职场文书
普通党员个人整改措施
2014/10/27 职场文书
工作汇报开头与结尾怎么写
2014/11/08 职场文书
员工离职感谢信
2015/01/22 职场文书
西岭雪山导游词
2015/02/06 职场文书
2019最新劳动仲裁申请书!
2019/07/08 职场文书
你需要掌握的20个Python常用技巧
2022/02/28 Python
Tomcat项目启动失败的原因和解决办法
2022/04/20 Servers
ubuntu端向日葵键盘输入卡顿问题及解决
2022/12/24 Servers