css animation返回第一帧会有明显的移动,如何解决?
同一个滚动效果,用js的requestAnimationFrame控制返回初始态非常自然,没有痕迹,但是用css animation控制,则回到第一帧,会有明显的下移动作,这个问题能否解决?
在线demo
关键代码如下:
css animation版本:
.m-tb-scroll tbody{display:block}.m-tb-scroll tbody.scroll{height:850px;overflow:hidden;overflow-y:scroll}
.m-tb-scroll thead,.m-tb-scroll tbody tr{display:table;width:100%;table-layout:fixed}
.m-tb-scroll tbody.ani{
animation:scroll var(--scrollDuration) linear both infinite;
animation-play-state:var(--scrollPause)
}
@keyframes scroll{
0%{transform:translateY(var(--scrollTopDebounce))}
100%{transform:translateY(var(--scrollY))}
}
if(scroll > 10){ scroll += this.bottomDebounce;
target.classList.remove('scroll');
target.classList.add('ani');
console.log('scroll: ', scroll);
let scrollDuration = scroll/60;
document.body.style.setProperty('--scrollDuration', `${scrollDuration}s`);
document.body.style.setProperty('--scrollY', `-${scroll}px`);
document.body.style.setProperty('--scrollTopDebounce', `${this.topDebounce}px`);
this.setAnimationPause();
}
else{
target.classList.remove('ani');
}
js版本
if (scroll > 10) { target.classList.remove('scroll');
requestAnimationFrame(animate);
let step = 0;
function animate() {
if (self.stop) return;
console.log('puase: ', self.pause);
if(!self.pause){
if (step >= scroll) {
step = 0;
}
else {
step += 1;
}
target.style.transform = `translateY(-${step}px)`
}
requestAnimationFrame(animate);
}
} else {
self.stop = true;
target.style.transform = `translateY(0)`
}
回答:
https://codepen.io/lie5860/pe...
观察后得到 并不是一个明显的下移动作,而是两个方法的位移不相同 且js的距离刚好是一行的距离。
我这边先是把scroll固定为一行的距离(仅测试用)。这样刚好第二行的文字在跳回去的时候会刚好覆盖第一行的字 这样会显得丝滑。
然后移除了scroll += this.bottomDebounce; 不太懂为啥要修改滚动距离。如果距离不同的话那效果肯定也是不同的。
以上是 css animation返回第一帧会有明显的移动,如何解决? 的全部内容, 来源链接: utcz.com/p/936575.html