视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
实例讲解CSS3实现无限循环的无缝滚动
2020-11-27 18:49:32 责编:小OO
文档

有时候在页面的某个模块中,需要无限循环的滚动一些消息。那么如果我们用js实现无缝衔接滚动的思路是什么呢(比如我们这个模块是向上滚动的)?本文主要介绍了用CSS3实现无限循环的无缝滚动的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。

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, -307px, 0);
 transform: translate3d(0, -307px, 0);
 display: none;
 }
}
.list{
 width: 300px;
 border: 1px solid #999;
 margin: 20px auto;
 position: relative;
 height: 200px;
 overflow: hidden;
}

.list .rowup{
 -webkit-animation: 10s rowup linear infinite normal;
 animation: 10s rowup linear infinite normal;
 position: relative;
}

html格式:

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

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 = '<p class="ss">';
 
 for(var i=0; i<len; i++){
 var start = parseInt( Math.random()*(data_len-20) ),
 s = parseInt( Math.random()*data_len );
 html += '<p class="item"v>'+i+'- '+data.substr(start, s)+'</p>';
 }
 html += '</p>';
 document.querySelector('.list .cc').innerHTML = html+html; // 复制一份数据
 var height = document.querySelector('.list .ss').offsetHeight; // 一份数据的高度
 addKeyFrames( '-'+height+'px' ); // 设置keyframes
 document.querySelector('.list .cc').className += ' rowup'; // 添加 rowup
}
init();

3. 横向滚动

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

4. 总结

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

下载本文
显示全文
专题