有时候在页面的某个模块中,需要无限循环的滚动一些消息。那么如果我们用js实现无缝衔接滚动的思路是什么呢(比如我们这个模块是向上滚动的)?

  1. 克隆A一份完全一样的数据B放在原数据A的后面;

  2. 使用setInterval向上滚动A的父级容器;

  3. 当向上滚动的距离L正好的A的高度时(L==A.height()),L=0,重新开始滚动,无限循环。

克隆一份数据放在后面,是为了当A向上移动时,后面有数据能填补漏出来的空白。当B移动到可视区域的顶部时,此时A刚好移出可视区域,那么此时将容器重新归0,用户是没有感知的,以为还是B中的第一条数据。然后继续向上滚动。

1. 使用CSS3来实现

若要用CSS3的属性实现的话,非animation莫属,因为transition是需要手动的触发,而且不能无限次执行下去,而animation恰好能解决这个问题。

假如数据是在写死的情况下时,我们完全可以手动复制一份数据放在后面,然后把原数据的高度写到css中,实现的思路与上面的一样:

css样式:

@keyframes rowup {0% {-webkit-transform: translate3d(0, 0, 0);transform: translate3d(0, 0, 0);}100% {-webkit-transform: translate3d(0, -240px, 0);transform: translate3d(0, -240px, 0);}
}
.list{width: 300px;border: 1px solid #999;margin: 20px auto;position: relative;height: 200px;overflow: hidden;font-size: 15px;font-family: 'Microsoft Yahei';
}.list .rowup{-webkit-animation: 10s rowup linear infinite normal;animation: 10s rowup linear infinite normal;position: relative;
}

html格式:

<div class="list"><div class="cc rowup"><div class="s"><div class="item">1- 121233fffffr国家认可更健康进口价格困扰</div><div class="item">2- 3123233</div><div class="item">3- 个人口结构俄跨入国际科技馆客人感觉</div><div class="item">4- ggrgerg</div><div class="item">5- fvdgdv</div><div class="item">6- 德国南部巴士与卡车相撞起火 31人受伤11人死亡朴槿惠庭审时突然昏迷 支持者:她死了法官要负责!</div><div class="item">7- 外交部再次回应印军越界:要求立即将越界部队撤回</div><div class="item">8- 德国网红致信默克尔</div><div class="item">9- 国资委原</div></div><div class="s"><div class="item">1- 121233fffffr国家认可更健康进口价格困扰</div><div class="item">2- 3123233</div><div class="item">3- 个人口结构俄跨入国际科技馆客人感觉</div><div class="item">4- ggrgerg</div><div class="item">5- fvdgdv</div><div class="item">6- 德国南部巴士与卡车相撞起火 31人受伤11人死亡朴槿惠庭审时突然昏迷 支持者:她死了法官要负责!</div><div class="item">7- 外交部再次回应印军越界:要求立即将越界部队撤回</div><div class="item">8- 德国网红致信默克尔</div><div class="item">9- 国资委原</div></div></div>
</div>

2. 数据不确定时

在上面的小节中,数据是死的,高度也是写死到了CSS3中。可是如果从接口获取到的数据个数不定呢,每条数据的长度也不确定,怎么办呢?

这里就需要根据数据来重新计算高度,并写到CSS里,可是keyframes修改起来还比较麻烦,那么我们就用覆盖的方式来重新keyframes中的数据:

// 设置keyframes属性
function addKeyFrames(y){var style = document.createElement('style');style.type = 'text/css';var keyFrames = '\@-webkit-keyframes rowup {\0% {\-webkit-transform: translate3d(0, 0, 0);\transform: translate3d(0, 0, 0);\}\100% {\-webkit-transform: translate3d(0, A_DYNAMIC_VALUE, 0);\transform: translate3d(0, A_DYNAMIC_VALUE, 0);\}\}\@keyframes rowup {\0% {\-webkit-transform: translate3d(0, 0, 0);\transform: translate3d(0, 0, 0);\}\100% {\-webkit-transform: translate3d(0, A_DYNAMIC_VALUE, 0);\transform: translate3d(0, A_DYNAMIC_VALUE, 0);\}\}';style.innerHTML = keyFrames.replace(/A_DYNAMIC_VALUE/g, y);document.getElementsByTagName('head')[0].appendChild(style);
}

计算出原始数据A的高度后,执行 addKeyFrames 方法,往head中添加css属性,那么这里的rowup就会覆盖掉之前设置的,每次滚动的距离就是数据A的高度:

function init(){var data = '塞下秋来风景异,衡阳雁去无留意。四面边声连角起,千嶂里,长烟落日孤城闭。浊酒一杯家万里,燕然未勒归无计。羌管悠悠霜满地,人不寐,将军白发征夫泪。', //样例数据data_len = data.length,len = parseInt(Math.random()*6)+6, // 数据的长度html = '<div class="ss">';for(var i=0; i<len; i++){var start = parseInt( Math.random()*(data_len-20) ),s = parseInt( Math.random()*data_len );html += '<div class="item"v>'+i+'- '+data.substr(start, s)+'</div>';}html += '</div>';document.querySelector('.list .cc').innerHTML = html+html; // 复制一份数据var height = document.querySelector('.list .ss').offsetHeight; // 一份数据的高度addKeyFrames( '-'+height+'px' ); // 设置keyframesdocument.querySelector('.list .cc').className += ' rowup'; // 添加 rowup
}
init(); 

3. 横向滚动

上面讲解的都是向上滚动,那么向左,向右,向下也比较容易理解了,把transform中的值更改为对应的数值即可。

4. 总结

使用CSS来进行动画的展示,会让页面显得更加流畅。如果能用CSS实现,可以尝试尽量用CSS实现下。

原文链接 用CSS3实现无限循环的无缝滚动 - SegmentFault 思否

用CSS3实现无限循环的无缝滚动相关推荐

  1. html图片墙 无限滚动,尝试用CSS3实现无限循环的无缝滚动

    有时候在页面的某个模块中,需要无限循环的滚动一些消息.那么如果我们用js实现无缝衔接滚动的思路是什么呢(比如我们这个模块是向上滚动的)?克隆A一份完全一样的数据B放在原数据A的后面: 使用setInt ...

  2. CSS3实现无限循环的无缝滚动

    有时候在页面的某个模块中,需要无限循环的滚动一些消息.那么如果我们用js实现无缝衔接滚动的思路是什么呢(比如我们这个模块是向上滚动的)? 克隆A一份完全一样的数据B放在原数据A的后面: 使用setIn ...

  3. CSS3中的animation属性实现无限循环的无缝滚动

    在页面中循环展示信息的功能之前一般是用js来实现的,那么用CSS3该如何实现实现呢 有时候在页面的某个模块中,需要无限循环的滚动一些消息.那么如果我们用js实现无缝衔接滚动的思路是什么呢(比如我们这个 ...

  4. CSS3--用CSS3实现无限循环的无缝滚动

    用CSS3实现无限循环的无缝滚动 致敬原文:https://www.xiabingbao.com/css3/2017/07/03/css3-infinite-scroll.html 原文作者是前端大佬 ...

  5. css动画无限循环转圈,css3 – 具有无限循环的链CSS动画

    简而言之,没有(一些可以解决的问题) 你的行动画计数:infinte当前正在做的是元素:动画:ani1 3s 0s无限,ani2 3s 9s无限;因此,由于声明的第一个动画的迭代次数为无限,因此永远不 ...

  6. Css3 实现无限循环

    @-webkit-keyframes gogogo {0%{-webkit-transform: rotate(0deg);}50%{-webkit-transform: rotate(180deg) ...

  7. php循环读取mysql_PHP无限循环获取MySQL数据

    本篇文章主要介绍PHP无限循环获取MySQL数据的方法,感兴趣的朋友参考下,希望对大家有所帮助. 具体如下: public function get_data($limit){ $sql=" ...

  8. react无缝滚动_react 实现一个无限循环的轮播器 附github地址

    一个简单的轮播 为了更具有通用和参考性,轮播组件中,轮播只使用了react,没有添加其他的状态管理,或者参数类型限制的库. 所以这个轮播的方法,同样可以用于vue 等其他框架 github地址 最终效 ...

  9. CSS3 用动画实现无缝滚动图效果

    如何用CSS实现一串图片在一个固定的盒子里无缝连接的滚动效果: 如上图(想象它是一个无缝连接的滚动图), 那么怎么才能这个无缝滚动的效果呢? 1.首先准备一组长宽一样图片, 六七个就差不多了, 然后创 ...

最新文章

  1. 使用Axure制作无限循环展示图片效果
  2. angular select设置默认选中_技术分享 | Charset 和 Collat??ion 设置对 MySQL 性能的影响...
  3. Application.DoEvents()的使用
  4. 基于LZ77算法的文件压缩
  5. 机器学习的最佳学习路线原来只有四步
  6. jQuery选择器案例之——index.js
  7. jq上传file到php,jQuery文件上传
  8. 诗与远方:无题(五十七)
  9. java持久层用文件_Java持久层框架MyBatis简单实例
  10. 使用Python合成gif动图
  11. 数据结构上机实践第10周项目1 - 二叉树算法验证
  12. java io 字符流操作工具类
  13. python label字体_Matplotlib xlabel,Arial格式,带一个斜体字
  14. TIPTOP实施基础资料收集计划表
  15. MATLAB加入螺旋相位板调制,螺旋相位板原理及使用手册
  16. 鸿蒙之始有几个老婆,先天五太
  17. 什么是路由守卫?vue-router有哪几种路由守卫?
  18. 2020 博客之星评选【票数排行榜】每日更新
  19. unity 查找游戏中隐藏的物体
  20. 手机修改设备信息之安装xposed框架

热门文章

  1. ImageJ自动批量多通道图片无损分离为单色荧光图
  2. 基于CT107D开发板的控制ne555方波发生器输出200Hz-20kHz频率
  3. java集合之HashMap相关原理 方法
  4. 【事件图谱】事件抽取与事件关系抽取
  5. 关闭/开启“此电脑”左边的导航栏win10
  6. 挪威是这样养三文鱼的--转帖
  7. 不允许指针指向不完整的类类型
  8. 【微信公众号】7、SpringBoot整合WxJava新增临时、永久素材
  9. mvcnn代码详解_使用colab运行tensorflow版本的faster-rcnn
  10. 用Java编写程序实现从键盘读入学生成绩,找出最高分,并输出学生成绩和学生的等级。