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 清除输入框中的数据
Apr 13 Javascript
jQuery阻止冒泡和HTML默认操作
Nov 17 Javascript
JS按字节截取字符长度实例
Nov 20 Javascript
使用原生js写的一个简单slider
Apr 29 Javascript
JavaScript中的console.time()函数详细介绍
Dec 29 Javascript
jquery实现简单的轮换出现效果实例
Jul 23 Javascript
jQuery获取父元素及父节点的方法小结
Apr 14 Javascript
jQuery tip提示插件(实例分享)
Apr 28 jQuery
用js将long型数据转换成date型或datetime型的实例
Jul 03 Javascript
微信小程序实现人脸识别登陆的示例代码
Apr 02 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
May 30 Javascript
webgl实现物体描边效果的方法介绍
Nov 27 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
改进的IP计数器
2006/10/09 PHP
上传多个文件的PHP脚本
2006/11/26 PHP
PHP连接SQLServer2005方法及代码
2013/12/26 PHP
php操作(删除,提取,增加)zip文件方法详解
2015/03/12 PHP
Ext JS 4官方文档之三 -- 类体系概述与实践
2012/12/16 Javascript
基于jQuery实现下拉收缩(展开与折叠)特效
2012/12/25 Javascript
js多级树形弹出一个小窗口层(非常好用)实例代码
2013/03/19 Javascript
js抽奖实现随机抽奖代码效果
2013/12/02 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
2014/04/03 Javascript
学习JavaScript设计模式之迭代器模式
2016/01/19 Javascript
Three.js学习之文字形状及自定义形状
2016/08/01 Javascript
详解Node.js项目APM监控之New Relic
2017/05/12 Javascript
Three.js利用dat.GUI如何简化试验流程详解
2017/09/26 Javascript
Thinkjs3新手入门之如何使用静态资源目录
2017/12/06 Javascript
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
vue.js使用v-model实现父子组件间的双向通信示例
2020/02/05 Javascript
Python设计模式之代理模式实例
2014/04/26 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
多版本Python共存的配置方法
2017/05/22 Python
python字典快速保存于读取的方法
2018/03/23 Python
int在python中的含义以及用法
2019/06/27 Python
python3 下载网络图片代码实例
2019/08/27 Python
pytorch 多分类问题,计算百分比操作
2020/07/09 Python
CSS3制作气泡对话框的实例教程
2016/05/10 HTML / CSS
英国著名的茶叶品牌:Whittard of Chelsea
2016/09/22 全球购物
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
小蚁科技官方商店:YI Technology
2019/08/23 全球购物
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
雪山饭庄的创业计划书范文
2014/01/18 职场文书
创业者是否需要商业计划书?
2014/02/07 职场文书
《逃家小兔》教学反思
2014/02/23 职场文书
鸟的天堂导游词
2015/01/31 职场文书
2015年银行个人工作总结
2015/05/14 职场文书
教师学习十八届五中全会精神心得体会
2016/01/05 职场文书
mysql如何能有效防止删库跑路
2021/10/05 MySQL
Centos7 Shell编程之正则表达式、文本处理工具详解
2022/08/05 Servers