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 相关文章推荐
js中格式化日期时间型数据函数代码
Nov 08 Javascript
一个JQuery写的点击上下滚动的小例子
Aug 27 Javascript
单击和双击事件的冲突处理示例代码
Apr 03 Javascript
JS制作简单的三级联动
Mar 18 Javascript
基于jQuery实现的美观星级评论打分组件代码
Oct 30 Javascript
jquery实现百叶窗效果
Jan 12 Javascript
Bootstrap学习笔记之进度条、媒体对象实例详解
Mar 09 Javascript
使用jquery datatable和bootsrap创建表格实例代码
Mar 17 Javascript
vue项目实现github在线预览功能
Jun 20 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
Jul 25 Javascript
node.js使用免费的阿里云ip查询获取ip所在地【推荐】
Sep 03 Javascript
js 动态校验开始结束时间的实现代码
May 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小型企业库存管理系统的设计与实现代码
2011/05/16 PHP
超棒的javascript页面顶部卷动广告效果
2007/12/01 Javascript
js修改input的type属性及浏览器兼容问题探讨与解决
2013/01/23 Javascript
js将long日期格式转换为标准日期格式实现思路
2013/04/07 Javascript
jQuery中removeProp()方法用法实例
2015/01/05 Javascript
JS实现获取图片大小和预览的方法完整实例【兼容IE和其它浏览器】
2017/04/24 Javascript
详解微信小程序调起键盘性能优化
2018/07/24 Javascript
详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
2018/11/12 Javascript
vue中获取滚动table的可视页面宽度调整表头与列对齐(每列宽度不都相同)
2019/08/17 Javascript
Angular利用HTTP POST下载流文件的步骤记录
2020/07/26 Javascript
Vue中添加滚动事件设置的方法详解
2020/09/14 Javascript
Python深入学习之内存管理
2014/08/31 Python
Django框架中方法的访问和查找
2015/07/15 Python
Python中is与==判断的区别
2017/03/28 Python
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
2017/07/24 Python
Python 内置函数memoryview(obj)的具体用法
2017/11/23 Python
Python的条件表达式和lambda表达式实例
2019/01/31 Python
python自动化unittest yaml使用过程解析
2020/02/03 Python
Python爬虫防封ip的一些技巧
2020/08/06 Python
浅谈对python中if、elif、else的误解
2020/08/20 Python
亚洲颇具影响力的男性在线购物零售商:His
2019/11/24 全球购物
俄罗斯天然和有机产品、健康生活网上商店:Fitomarket.ru
2020/10/09 全球购物
璀璨的珍珠、密钉和个性化珠宝:Lily & Roo
2021/01/21 全球购物
翻译专业应届生求职信
2013/11/23 职场文书
大学生表扬信范文
2014/01/09 职场文书
《分一分》教学反思
2014/04/13 职场文书
十八大宣传标语
2014/10/09 职场文书
2015年六一儿童节活动方案
2015/05/05 职场文书
文明礼貌主题班会
2015/08/14 职场文书
2016形势与政策学习心得体会
2016/01/12 职场文书
范文之农村基层党建工作报告
2019/10/24 职场文书
Golang 正则匹配效率详解
2021/04/25 Golang
解决MySQL存储时间出现不一致的问题
2021/04/28 MySQL
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫
Python实战实现爬取天气数据并完成可视化分析详解
2022/06/16 Python
windows11选中自动复制怎么开启? Win11自动复制所选内容的方法
2022/07/23 数码科技