项目要求兼容4K,市面上插件对高分辨率屏兼容性不是很好,故手动实现此插件
1、实现无缝功能
如图,将外部传入的slot展示两份,页面滚动到底部不会出现空白
2、实现滚动(由于功能简单,出于性能考虑,最终选择的css animation方式)
a.keyframes:由于css的局限性,必须配合样式表实现,因此采用在head的style标签对中动态插入@keyframes的方式写入动画
b.滚动原理:计算出动画时长(下图this.seconds),设置动画位置从translateY(0)的到translateY(domHeight),设置translate属性为infinite,即可循环滚动
3、兼容1080和4K分辨率(主要解决滚动速率不一致的问题,下图是得到真实domheight,转换成vh单位,以此计算出上图中seconds的真实滚动时间)
4、性能优化(为何不使用js动画)
a.大屏项目动画效果多,CPU消耗大,常用的定时器动画(setInterval)延迟较高,卡顿、掉帧现象明显(若有js操作行为,动画直接卡停n秒)
b.使用浏览器动画API:requestAnimationFrame优化动画,CPU使用量大,卡顿、掉帧现象减少许多(但若有js操作行为,动画直接卡停n秒)
c,使用css动画,CPU使用量大,但动画流畅不掉帧(若有js操作行为,动画依旧流畅运行)
css动画流畅运行原因:JS动画主线程要一直参与计算,增加了不必要消耗,而css动画在定义了keyframe后,使用will-change:transform;等属性,直接交给GPU管理,CPU不参与运算,侧面降低CPU的开销(约2%左右),同时js的同步操作不会阻塞动画的执行。
5、组件的复用性考虑(组件封装,提升组件的可维护性)
为了在其他项目中复用,有浏览器对css3兼容性比较差,只能牺牲性能,让项目能看,因此也没有放弃js动画,并对此做了兼容,开发时候可以手动选择动画运行方式(如下图所示,此时的动画运行原理也稍有区别,见下图)。