前言
今天偷個懶,不長篇大論,分享幾個你可能不知道的 CSS 小知識。
樣式的順序
CSS 程式碼:
.red {
color: red;
}
.blue {
color: blue;
}
複製程式碼
HTML 程式碼:
<div class="red blue">這是什麼顏色</div>
<div class="blue red">這是什麼顏色</div>
複製程式碼
記得之前這是一道比較火的 CSS 考題,當時好像是有不少的人答錯(30% 以上)
答案你們應該是知道的。
可以這樣提升 CSS 效能
後代選擇器
樣式選擇器中間的空格是什麼?它的名字是 —— 後代選擇器。
div p {
color: #3388ff;
font-size: 14px;
}
複製程式碼
後代選擇器或許會很耗效能
耗能與否取決於專案的體積,但不建議使用沒有意義的後代選擇器。例如:
.div p {
// ...
}
複製程式碼
為什麼會更消耗效能呢?
因為瀏覽器首先會找到所有 p
標籤,然後再向上查詢包含 class
為 div
標籤。這樣一來如果程式碼中有很多 p
標籤,無疑是會做很多重複工作的。
所以可以減少使用 HTML 標籤來定義 CSS 的方式,換成使用具體的 class
。
瀏覽器會從右到左解析 CSS 選擇器
.content_box div p a {
// ...
}
複製程式碼
瀏覽器會對上面的例子做如下的步驟處理:
- 首先找到頁面所有的
<a>
元素 - 然後向上找到被
<p>
元素包裹的<a>
元素 - 再向上查詢到一直到
.content_box
的元素
從上面的步驟我們可以看出,越靠右的選擇器越具有唯一性,瀏覽器解析 CSS 屬性的效率就越高。
所以一定換成使用具體的 class
編寫 CSS 程式碼。
避免 reflow 風險
我們知道修改某些 CSS 屬性會導致整個頁面佈局的重繪( repaint )/重排( reflow )。
repaint 的速度遠快於 reflow,所以避免 reflow 更重要
導致 repaint 和 reflow 的原因
- DOM 元素的新增、修改、刪除(repaint、reflow)
- 僅僅修改 DOM 元素的字型顏色(repaint,不需要調整佈局)
- 應用新的樣式或者修改任何影響元素外觀的屬性(repaint、reflow)
- resize,頁面滾動(repaint、reflow)
- 讀取元素的某些屬性(offsetTop/Left/Width/Height、getComputedStyle、scrollTop/Left/Width/Height、clientTop/Left/Width/Height等)(repaint、reflow)
如果在大量的元素上更改這些屬性,那麼計算和更新他們的位置/大小需要花費很長的時間。
更加消耗效能的 CSS 屬性
有一些 CSS 屬性會比其他屬性消耗能多的效能,即瀏覽器解析這些屬性需要花費更多的時間。
如:border-radius
、box-shadow
、filter
、:nth-child
等
當然這些屬性我們經常使用,有些無法避免。要做出適當的取捨。
希望這幾個 CSS 小知識可以對你有所幫助,然後點個贊在走唄。
最後
如果你想進【大前端交流群】,關注公眾號點選“交流加群”新增機器人自動拉你入群。關注我第一時間接收最新干貨。