IE下CSS3動畫抖動

問題記錄:IE11中執(zhí)行淡入動畫時出現(xiàn)抖動效果,效果如下:

抖動.gif

解決此問題需理解一些概念:


  1. 重排:重新生成布局
  2. 重繪:重新繪制
    注意:重排必定導(dǎo)致重繪,重繪不一定需要重排;比如改變背景色,就只會觸發(fā)重繪

原始代碼:


// >>>>> js部分 <<<<<
listEl.show();
timer = requestAnimationFrame(function () {
  listEl.removeClass('out').addClass('in');
})

// >>>>> css部分 <<<<<
.dropDown_list.in {
   animation-name: in;
   animation-duration: 2s;
   animation-fill-mode: both;
 }
@keyframes in {
  0% {
    opacity: 0;
    filter:alpha(opacity=0);
    transform-origin: 0% 0%;
    transform: scaleY(0.8);
  }
  100% {
    opacity: 1;
    filter:alpha(opacity=100);
    transform-origin: 0% 0%;
    transform: scaleY(1);
  }
}

執(zhí)行步驟:

  1. 點(diǎn)擊按鈕,控制 ul 標(biāo)簽 display 屬性讓其顯示
  2. 給ul標(biāo)簽追加 in 類名,讓其 opacity 從0到1,實現(xiàn)淡入

動畫抖動剖析:

  1. 執(zhí)行 display: block 時會單獨(dú)觸發(fā)重排
  2. 執(zhí)行動畫 opacity 時也會單獨(dú)觸發(fā)重排
    也就是 ul 標(biāo)簽剛顯示出來,又重新應(yīng)用上了 opacity: 0 和 transform: scaleY(.8),導(dǎo)致抖動的發(fā)生

解決方案:


既然是因為兩次重排導(dǎo)致動畫抖動,那合并起來觸發(fā)一次重排就可以了,優(yōu)化后的代碼如下:

// >>>>> js部分 <<<<<
timer = requestAnimationFrame(function () {
  listEl.show();
  listEl.removeClass('out').addClass('in');
})

使用 requestAnimationFrame 的原因在于瀏覽器可以優(yōu)化并行的動畫動作,更合理的重新排列動作序列,并把能夠合并的動作放在一個渲染周期內(nèi)完成,從而呈現(xiàn)出更流暢的動畫效果

優(yōu)化后的效果:

正常動畫.gif

點(diǎn)擊查看優(yōu)化后的代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容