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 相关文章推荐
jquery动态分页效果堪比时光网
Sep 25 Javascript
jQuery实现contains方法不区分大小写的方法
Feb 13 Javascript
javascript实现简单查找与替换的方法
Jul 22 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
Aug 15 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
Sep 14 Javascript
基于RequireJS和JQuery的模块化编程日常问题解析
Apr 14 Javascript
Extjs 点击复选框在表格中增加相关信息行
Jul 12 Javascript
javascript将中国数字格式转换成欧式数字格式的简单实例
Aug 02 Javascript
Bootstrap3下拉菜单的实现
Feb 22 Javascript
关于Angularjs中跨域设置白名单问题
Apr 17 Javascript
解决LayUI表单获取不到data的问题
Aug 20 Javascript
mpvue 单文件页面配置详解
Dec 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
4月1日重磅发布!《星际争霸II》6.0.0版本更新
2020/04/09 星际争霸
php常用Output和ptions/Info函数集介绍
2013/06/19 PHP
PHP答题类应用接口实例
2015/02/09 PHP
IE bug table元素的innerHTML
2010/01/11 Javascript
jQuery控制图片的hover效果(smartRollover.js)
2012/03/18 Javascript
js 使用form表单select类实现级联菜单效果
2012/12/19 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
2013/08/15 Javascript
JS将制定内容复制到剪切板示例代码
2014/02/11 Javascript
javascript实现textarea中tab键的缩排处理方法
2015/06/26 Javascript
javaScript中的原型解析【推荐】
2016/05/05 Javascript
Vue.js 60分钟快速入门教程
2017/03/28 Javascript
详解vue中router-link标签所必备了解的属性
2019/04/15 Javascript
微信小程序wepy框架学习和使用心得详解
2019/05/24 Javascript
js实现带搜索功能的下拉框
2020/01/11 Javascript
Vue如何实现验证码输入交互
2020/12/07 Vue.js
python 输出一个两行字符的变量
2009/02/05 Python
写了个监控nginx进程的Python脚本
2012/05/10 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
python绘制直线的方法
2018/06/30 Python
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
python pygame实现五子棋小游戏
2020/10/26 Python
详解Python 中sys.stdin.readline()的用法
2019/09/12 Python
使用Python进行防病毒免杀解析
2019/12/13 Python
python 如何停止一个死循环的线程
2020/11/24 Python
详解css3 mask遮罩实现一些特效
2018/10/24 HTML / CSS
佛罗里达州印第安河新鲜水果:Hale Groves
2017/02/20 全球购物
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
Currentbody西班牙:美容仪专家
2019/09/28 全球购物
Orlebar Brown官网:设计师泳裤和泳装
2020/12/08 全球购物
幼儿园教育教学反思
2014/01/31 职场文书
软件毕业生个人鉴定
2014/03/03 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书
CSS3实现三角形不断放大效果
2021/04/13 HTML / CSS
python必学知识之文件操作(建议收藏)
2021/05/30 Python
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript
Python使用华为API为图像设置多个锚点标签
2022/04/12 Python