因為當頁面失去焦點時,瀏覽器不會再渲染頁面,但是settimeout/setinterval的請求不會停止,隊列會壹直堆動畫。當頁面再次獲得焦點時,動畫隊列已經堆了很多命令,會導致動畫混亂。
壹般來說,目前的做法是使用requestanimationframe函數,類似於settimeout/setinterval,只是requestanimationframe不接受時間參數,函數的執行頻率由瀏覽器的渲染幀數決定,從而實現動畫隊列由瀏覽器決定,避免動畫混淆。當然也可以用壹些現成的輪播插件,主體可以擁有百度。這裏通過對比例子說明settimeout和requestanimationframe的用法。
//使用setTimeout在控制臺循環輸出hello?世界
功能?fun(){
console.log('妳好?世界’);
setTimeout(function(){
fun();
},3000);
}
fun();//執行fun函數,每隔3000毫秒可以遞歸輸出hello。世界
//使用reqestanimationframe在控制臺循環輸出hello?世界
功能?fun(){
console.log('妳好?世界’);
requestAnimationFrame(function(){
fun();
})
}
Fun()//執行Fun函數,每隔3000毫秒可以遞歸輸出hello。世界
//requestAnimationFrame沒有時間參數,所以不能直接控制間隔。
//但是我們可以通過以下方法人為限制執行間隔。
功能?樂趣(最後壹次){
如果(新?日期()。getTime()?-?最後壹次?& gt?3000){
console.log('妳好?世界’);
requestAnimationFrame(function(){
好玩(新?日期()。getTime());
})
}否則{
requestAnimationFrame(function(){
樂趣(最後壹次)
});
}
}
好玩(新?日期()。getTime())
//這樣就可以為requestAnimationFrame設置間隔,每3000毫秒輸出壹次hello。世界
//很抱歉我偶爾用C和javaweb寫python,分號有點亂。