Javascript 我应该使用requestAnimationFrame淡入几个元素吗?要实现60帧动画?
试图保持60 fps的动画。目前,我得到了很多以每秒30帧的速度出现的慢帧峰值,我的眼睛可以注意到这种起伏 重要编辑:扔掉旧的过时代码,添加新代码并进行解释Javascript 我应该使用requestAnimationFrame淡入几个元素吗?要实现60帧动画?,javascript,css,animation,Javascript,Css,Animation,试图保持60 fps的动画。目前,我得到了很多以每秒30帧的速度出现的慢帧峰值,我的眼睛可以注意到这种起伏 重要编辑:扔掉旧的过时代码,添加新代码并进行解释 fadeIn: function(ele){ raf = window.requestAnimationFrame(function() { console.log(ele); var opacity = 0; function increase
fadeIn: function(ele){
raf = window.requestAnimationFrame(function() {
console.log(ele);
var opacity = 0;
function increase () {
opacity += 0.05;
if (opacity >= 1){
// complete
ele.style.opacity = 1;
return true;
}
ele.style.opacity = opacity;
requestAnimationFrame(increase);
}
increase();
});
},
fadeInElements: function(elements, properties, speed, delay){
var raf;
var ele;
for (i = 0; i < properties.length; i++){
ele = elements[properties[i]];
console.log('outside loop ' + ele);
instance.fadeIn(ele);
}
},
fadeIn:功能(ele){
raf=window.requestAnimationFrame(函数(){
控制台日志(ele);
var不透明度=0;
功能增加(){
不透明度+=0.05;
如果(不透明度>=1){
//完整的
ele.style.opacity=1;
返回true;
}
ele.style.opacity=不透明度;
请求动画帧(增加);
}
增加();
});
},
时尚元素:功能(元素、属性、速度、延迟){
var-raf;
var-ele;
对于(i=0;i
我的新代码在上面。这是成功的:
- 迭代几个元素(每个元素都是
),然后调用ele
fadeIn(ele)
- 所以,所有的元素都会消失
- 但是,我希望在新元素上每次“淡入”(每次触发
)之间有fadeIn()
延迟50ms
window.requestAnimationFrame(eachFrame); //start the animation
这将在下一帧时间(例如每秒60次的下一个倍数)调用名为eachFrame()
的函数。不过,它只会执行一次eachFrame()
来跟踪我们在动画中的位置
var startTime = -1.0; // -1 = a flag for the first frame.
function eachFrame()
{
// Render this frame ------------------------
if(startTime<0) {
// very first frame (because of the -1.0): save the start time.
startTime = (new Date()).getTime();
render(0.0);
// the parameter to render() is the time within the
// animation.
} else {
// every frame after the first: subtract the saved startTime
// to determine the current time.
render( (new Date()).getTime() - startTime );
}
// Now we're done rendering one frame. ------
//Start the timer to call this function again
//when it's time for the next frame.
window.requestAnimationFrame(eachFrame);
}; //eachFrame
在render()中
,您可以根据当前时间计算不透明度。您不必担心帧间延迟,因为requestAnimationFrame
为我们处理这一问题。您可以通过偏移时间来错开过渡。在本例中,opacity1
取决于currTime
而opacity2
取决于currTime
减去一个常数FADE\u间距
,因此元素2的不透明度更改将比元素1的不透明度更改延迟FADE\u间距
ms已经填充了所有的细节。它为两个
元素的不透明度设置动画,每个元素的动画开始之间有一个间隔。我希望这会有帮助!为什么你对此持怀疑态度?rAF
是解决此类问题的方法,你应该从一开始就这样做。我不知道是什么原因事实上,你想通过这个动画来实现,所以我无法真正帮助你编写代码,但你肯定需要一种不同的方法。如果你更清楚一点,也许……这里有一个简单的动画,它使用requestAnimationFrame
——并且也播放音频!:)这里还有一个。(不是我说的——我觉得这是一个很好的例子,所以我只是简单介绍一下。)你能创建一个stacksnippets来演示一下吗?@MaxArt好吧,我相信你肯定是对的,我只是在学习如何做rAF时非常笨拙,如果说得通的话,“延迟一下”。为了尽可能简化我的目标,我想要一个传递HTML元素数组的函数。然后,通过将每个元素的不透明度设置为1,然后等待一些delay
ms,然后将下一个元素的不透明度设置为1,该函数在每个元素中一个接一个地淡出。动画自动发生,因为元素已设置了过渡:.33s不透明度减缓
。这更清楚了吗?在GameDev.SE上也可能对您有所帮助。我无法告诉您我有多感激您如此详尽的回答,非常感谢。我希望所有的教程(或代码)都写得像这样清晰!我想在我对你的代码进行了适当的修改之后,我最终会理解如何自己编写RAF函数(只是看了一下,但当然我必须重新编写才能正确地学习!)再次感谢你,否则我很可能无法自己解决这个问题。很高兴能够提供帮助!:)我将在我的博客上放一个扩展版,欢迎在这里或那里进一步提问:)。链接在我的个人资料。无论如何,这是一个非常有用的答案。当你的博客帖子打开时,请在你的答案中自由链接。据我所知,自我推销是可以的,只要它被明确地认定为是这样的,并且与一个高价值的答案相联系,这就是。
function render(currTime)
{ // *** Put your rendering code here ***
// How opaque should head1 be? Its fade started at currTime=0.
var opacity1 = clamp(currTime/FADE_DURATION);
// over FADE_DURATION ms, opacity goes from 0 to 1
// How opaque should head2 be?
var opacity2 = clamp( (currTime-FADE_SPACING)/FADE_DURATION );
// fades in, but doesn't start doing it until
// FADE_SPACING ms have passed.
// Apply the changes
head1.style.opacity = opacity1;
head2.style.opacity = opacity2;
} //render