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 相关文章推荐
In Javascript Class, how to call the prototype method.(three method)
Jan 09 Javascript
JavaScript更改class和id的方法
Oct 10 Javascript
javascript arguments 传递给函数的隐含参数
Aug 21 Javascript
jQuery 数据缓存data(name, value)详解及实现
Jan 04 Javascript
jquery实现固定顶部导航效果(仿蘑菇街)
Mar 21 Javascript
javascript获得网页窗口实际大小的示例代码
Sep 21 Javascript
document.getElementBy("id")与$("#id")有什么区别
Sep 22 Javascript
Node.js文件操作详解
Aug 16 Javascript
JavaScript实现自动对页面上敏感词进行屏蔽的方法
Jul 27 Javascript
使用jQuery制作遮罩层弹出效果的极简实例分享
May 12 Javascript
js+canvas实现动态吃豆人效果
Mar 22 Javascript
利用Blob进行文件上传的完整步骤
Aug 02 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 JSON格式数据交互实例代码详解
2011/01/13 PHP
php另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
PHP采集静态页面并把页面css,img,js保存的方法
2014/12/23 PHP
php三元运算符知识汇总
2015/07/02 PHP
php实现遍历多维数组的方法
2015/11/25 PHP
PHP 裁剪图片
2021/03/09 PHP
javascript应用:Iframe自适应其加载的内容高度
2007/04/10 Javascript
JavaScript 中的replace方法说明
2007/04/13 Javascript
非常漂亮的JS代码经典广告
2007/10/21 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
使用apply方法实现javascript中的对象继承
2013/12/16 Javascript
javascript结合fileReader 实现上传图片
2015/01/30 Javascript
纯Javascript实现ping功能的方法
2015/03/20 Javascript
JavaScript将当前时间转换成UTC标准时间的方法
2015/04/06 Javascript
jQuery控制Div拖拽效果完整实例分析
2015/04/15 Javascript
vue.js实现表格合并示例代码
2016/11/30 Javascript
js模糊查询实例分享
2016/12/26 Javascript
Vue数据驱动模拟实现3
2017/01/11 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
[26:40]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第一局
2016/02/25 DOTA
[01:33:14]LGD vs VP Supermajor 败者组决赛 BO3 第二场 6.10
2018/07/04 DOTA
python判断一个数是否能被另一个整数整除的实例
2018/12/12 Python
Django Sitemap 站点地图的实现方法
2019/04/29 Python
python openpyxl使用方法详解
2019/07/18 Python
Django框架反向解析操作详解
2019/11/28 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
2020/04/24 Python
移动端适配 使px自动转换rem
2019/08/26 HTML / CSS
HTML5中新标签和常用标签详解
2014/03/07 HTML / CSS
Pop In A Box英国:Funko POP搪胶公仔
2019/05/27 全球购物
Groupon法国官方网站:特卖和网上购物高达-70%
2019/09/02 全球购物
database面试题
2013/03/28 面试题
教学实习自我评价
2014/01/28 职场文书
合伙经营协议书范本
2014/09/13 职场文书
离职告别感言
2015/08/04 职场文书
十大最强水系宝可梦,最美宝可梦排第三,榜首大家最熟悉
2022/03/18 日漫
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle