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 编程引入命名空间的方法与代码
Aug 13 Javascript
js 程序执行与顺序实现详解
May 13 Javascript
JavaScript检测弹出窗口是否已经关闭的方法
Mar 24 Javascript
js兼容火狐获取图片宽和高的方法
May 21 Javascript
jQuery mobile转换url地址及获取url中目录部分的方法
Dec 04 Javascript
JS判断数组那点事
Oct 10 Javascript
详解解决Vue相同路由参数不同不会刷新的问题
Oct 12 Javascript
vue 项目地址去掉 #的方法
Oct 20 Javascript
ES6 Set结构的应用实例分析
Jun 26 Javascript
解决Element中el-date-picker组件不回填的情况
Nov 07 Javascript
微信小程序 接入腾讯地图的两种写法
Jan 12 Javascript
Vue2.x-使用防抖以及节流的示例
Mar 02 Vue.js
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_encode中文编码问题分析
2011/09/13 PHP
一致性哈希算法以及其PHP实现详细解析
2013/08/24 PHP
PHP处理Oracle的CLOB实例
2014/11/03 PHP
配置php.ini实现PHP文件上传功能
2014/11/27 PHP
CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录
2015/03/25 PHP
PHP时间处理类操作示例
2018/09/05 PHP
js下写一个事件队列操作函数
2010/07/19 Javascript
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
使用POST方式弹出窗口的两种方法示例介绍
2014/01/29 Javascript
深入理解requestAnimationFrame的动画循环
2016/09/20 Javascript
解决Angular.Js与Django标签冲突的方案
2016/12/20 Javascript
详解在vue-cli项目中安装node-sass
2017/06/21 Javascript
浅谈angularJS的$watch失效问题的解决方案
2017/08/11 Javascript
使用python装饰器验证配置文件示例
2014/02/24 Python
Python实现的飞速中文网小说下载脚本
2015/04/23 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
Python3实现的简单工资管理系统示例
2019/03/12 Python
python的移位操作实现详解
2019/08/21 Python
Ubuntu权限不足无法创建文件夹解决方案
2020/11/14 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
2020/12/08 Python
详解canvas多边形(蜘蛛图)的画法示例
2018/01/29 HTML / CSS
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
学术会议欢迎词
2014/01/09 职场文书
迟到检讨书大全
2014/01/25 职场文书
大学学习个人的自我评价
2014/02/18 职场文书
2014元旦晚会策划方案
2014/02/19 职场文书
商业企业管理专业求职信
2014/07/10 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
技术股东合作协议书
2014/12/02 职场文书
学生个人评语大全
2015/01/04 职场文书
2015年党风廉政建设工作总结
2015/04/09 职场文书
人事任命通知书
2015/04/21 职场文书
有关三国演义的读书笔记
2015/06/25 职场文书
详解Mysql 函数调用优化
2021/04/07 MySQL
vue如何在data中引入图片的正确路径
2022/06/05 Vue.js