css動畫是否會被js阻塞
- css的動畫部分是會被js阻塞的,不過transform的動畫則不會受影響。
下面舉一個margin-left移動的動畫下,啟動js阻塞動畫的效能圖表
<style>
.walkabout-old-school {
animation: 3s slide-margin linear infinite;
}
@keyframes slide-margin {
from {margin-left: 0;}
50% {margin-left: 100%;}
to {margin-left: 0;}
}
</style>
<script>
function kill() {
var start = +new Date;
while (+new Date - start < 2000){}
}
</script>
上圖在執行kill方法之後明顯可以看到動畫停滯了2s後才繼續。
- 由上圖可以看到啟用js的2s內,渲染程式會等到kill函式執行完成後才執行,再看下面這張圖,可以看出margin的變化會導致dom重新佈局,而佈局會等kill函式執行完成後才開始。就會導致
然後再看看使用了transform作為動畫的元素
.walkabout-new-school {
animation: 3s slide-transform linear infinite;
}
@keyframes slide-transform {
from {transform: translatex(0);}
50% {transform: translatex(300px);}
to {transform: translatex(0);}
}
下圖是執行對比圖(藍色為margin,綠色為transform)
從上圖看出使用了transform的完全不受kill方法的影響,再來看下除錯的圖表
這裡可以看出margin會頻繁觸發頁面的重排,而transform是不會的,而js阻塞了頁面重排。所以margin的動畫會卡住。
- 所以在平時使用動畫時,多用transform可以讓頁面效能和效果達到最佳。