一些 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-shadow
和filter
: 這些屬性通常需要大量的計算,尤其是在使用模糊或複雜效果時。 -
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 屬性比較昂貴,並採取相應的最佳化措施,可以顯著提高網頁的效能。 透過仔細的規劃和測試,您可以建立高效能的網頁,即使在複雜的佈局和動畫中也能保持流暢的使用者體驗。