CSS阻塞指的是瀏覽器在渲染頁面時,為了避免出現內容閃現(Flash of Unstyled Content,簡稱FOUC),會等待CSS檔案下載和解析完成後,才會渲染頁面內容。這會導致頁面在CSS載入完成之前呈現空白或無樣式狀態。
出現CSS阻塞主要有以下幾種情況:
-
外部樣式表: 當使用
<link>
標籤引入外部CSS檔案時,瀏覽器會先下載並解析CSS檔案,然後再渲染頁面。如果CSS檔案較大或網路較慢,就會導致明顯的阻塞。尤其當CSS檔案放在<head>
標籤中,阻塞會更加明顯,因為瀏覽器需要先解析完CSS才能渲染頁面後續內容。 -
內聯樣式:
<style>
標籤內的CSS樣式也會阻塞渲染。雖然內聯樣式比外部樣式表載入更快,但如果樣式表過大或過於複雜,仍然會造成阻塞。 -
@import規則: 使用
@import
規則匯入CSS檔案也會阻塞渲染。@import
規則會先下載並解析當前的CSS檔案,然後再下載並解析@import
匯入的CSS檔案,這會導致更長的阻塞時間,因此不推薦使用@import
。
總而言之,任何需要下載和解析的CSS都會阻塞渲染。為了減少CSS阻塞對頁面載入速度的影響,可以採取以下最佳化策略:
-
CSS最佳化: 壓縮CSS檔案大小,減少不必要的樣式規則,合併多個CSS檔案。
-
關鍵CSS: 將首屏渲染所需的CSS內聯到
<head>
標籤中的<style>
標籤內,從而優先渲染首屏內容,避免使用者長時間看到空白頁面。其餘的CSS可以使用非同步載入的方式載入。 -
非同步載入CSS: 使用JavaScript非同步載入CSS檔案,例如:
const link = document.createElement('link'); link.href = 'style.css'; link.rel = 'stylesheet'; document.head.appendChild(link);
或者使用
media
屬性:<link rel="stylesheet" href="print.css" media="print"> <link rel="stylesheet" href="style.css" media="all">
瀏覽器只會下載
media
屬性匹配當前媒體型別的CSS檔案。例如,print.css
只會在列印頁面時下載。初始載入時,media="all"
的樣式表會阻塞渲染,而其他媒體型別的樣式表將非同步載入。 利用media
屬性,可以先載入關鍵CSS,再非同步載入其他CSS。例如,先用media="screen"
載入首屏樣式,然後用media="all"
載入完整樣式。 -
使用CSS預載入: 使用
<link rel="preload" href="style.css" as="style">
告訴瀏覽器儘早載入CSS檔案,但不會阻塞渲染。
透過以上最佳化策略,可以最大程度地減少CSS阻塞,提高頁面載入速度,提升使用者體驗。