表列舉一些你認為最“昂貴”的css屬性並解釋為什麼

王铁柱6發表於2024-12-06

一些 CSS 屬性比其他屬性的計算成本更高,因此使用時需要更加小心。這些“昂貴”的屬性通常涉及到佈局的重新計算或渲染的更改,這會影響瀏覽器效能,尤其是在複雜的頁面或低端裝置上。以下是一些我認為最昂貴的 CSS 屬性以及它們昂貴的原因:

佈局 (Layout): 這些屬性會觸釋出局的重新計算,這意味著瀏覽器需要重新計算元素的位置和大小。這是最昂貴的操作之一,因為它會影響所有後代元素以及潛在的祖先元素。

  • width, height, margin, padding, border, top, left, bottom, right, float, clear, display, position (尤其是 absolute, relative, fixed), flexbox 屬性 (例如 flex-direction, justify-content, align-items), grid 屬性 (例如 grid-template-columns, grid-template-rows): 改變這些屬性會直接影響元素的尺寸和位置,從而觸發重新佈局。

繪製 (Paint): 這些屬性會觸發繪製操作,瀏覽器需要重新繪製螢幕上的畫素。雖然不如佈局重新計算那麼昂貴,但仍然會影響效能,尤其是在需要繪製大量元素或複雜圖形時。

  • background, color, box-shadow, border-radius, outline, transform (涉及到繪製的變換,例如 translate, rotate, scale), opacity, filter: 這些屬性會改變元素的外觀,需要瀏覽器重新繪製。

合成 (Composite): 合成是將不同的層組合在一起形成最終影像的過程。一些 CSS 屬性會觸發合成層的建立,這可以提高效能,但也可能會增加記憶體使用量。過度使用會導致效能問題。

  • transform: translate3d(), transform: translateZ(), will-change, opacity (非 1 的值), filter, backface-visibility: hidden, position: fixed: 這些屬性通常會建立新的合成層,允許瀏覽器在 GPU 上進行渲染,從而提高效能。但是,建立過多的合成層也會導致效能下降。

一些需要特別注意的屬性:

  • box-shadowfilter: 這些屬性通常需要大量的計算,尤其是在使用模糊或複雜效果時。

  • position: fixed: 雖然 fixed 定位可以提高滾動效能,但它也會建立新的 stacking context 和合成層,因此需要謹慎使用。

如何減少昂貴屬性的影響:

  • 儘量減少使用昂貴的屬性: 如果可以,使用更簡單的屬性或技術來實現相同的效果。
  • 使用 transform 代替 top/left: 對於動畫和過渡,transform 通常比 top/left 更高效,因為它可以在 GPU 上進行渲染。
  • 避免頻繁更改佈局: 批次更新樣式更改,例如使用 requestAnimationFrame 或 CSS Transitions/Animations。
  • 使用硬體加速: 利用 transform: translate3d(0, 0, 0)will-change 來強制硬體加速,但要謹慎使用,避免建立過多的合成層。
  • 最佳化繪製: 減少需要繪製的區域,例如使用 contain 屬性。

總而言之,瞭解哪些 CSS 屬性比較昂貴,並採取相應的最佳化措施,可以顯著提高網頁的效能。 透過仔細的規劃和測試,您可以建立高效能的網頁,即使在複雜的佈局和動畫中也能保持流暢的使用者體驗。

相關文章