WordPress 關鍵 CSS 產生與內聯設定教學

打開 Google PageSpeed Insights 跑一次自己的 WordPress 網站,十之八九會看到那行紅字「排除阻擋轉譯的資源」(Eliminate render-blocking resources)。點開來,Google 多半指向你的 CSS 檔。問題的核心是:瀏覽器必須先下載並解析完整份樣式表,才肯把畫面畫出來,於是訪客盯著一片空白等待,首屏遲遲不出現。

WordPress critical css(關鍵 CSS)就是針對這個痛點的解法。它的概念很單純,把「首屏可見範圍真正用到的那一小段樣式」抽出來,直接內聯(inline)寫進 HTML 的 <head>,剩下的樣式表延後非同步載入。這樣瀏覽器拿到 HTML 的同時就拿到了首屏樣式,不必等外部檔案就能先把上半部畫好。

這篇會把整套流程講清楚:關鍵 CSS 到底是什麼、為什麼能改善 LCP 與 FCP、手動抽取與外掛自動產生兩條路怎麼選、內聯之後怎麼驗證有沒有生效,以及最容易踩的破版(FOUC)與「該多久重產一次」的維護問題。對象設定在自己管 WordPress、看得懂後台但不一定會寫程式的站長。

關鍵 CSS(Critical CSS)到底是什麼

關鍵 CSS 指的是「渲染首屏可見內容所需的最小一組樣式」。首屏(above-the-fold)是訪客打開頁面、還沒捲動前螢幕上看得到的那塊範圍,這個詞源自報紙對折線以上的版面。瀏覽器要把這塊畫對,需要哪些 CSS 規則,那些規則就是這個頁面的關鍵 CSS。

把這段樣式內聯進 <head>,等於告訴瀏覽器:先用這段把看得到的部分畫出來,整份大樣式表慢慢來。預設情況下 WordPress 不會幫你做這件事,主題的 style.css 加上每個外掛各自掛的 CSS,全都以外部檔案的形式塞在 <head> 裡,逐一阻擋渲染。

這裡有個常被搞混的觀念要先釐清。CSS 寫進頁面有三種方式,名字很像但不是同一回事:

  • 外部 CSS:樣式放在獨立的 .css 檔,用 <link rel="stylesheet"> 連進來。維護方便,是 WordPress 的預設做法,但瀏覽器得先連線下載這個檔才能渲染。
  • 內部 CSS(Internal CSS):樣式直接寫在 <head><style> 標籤裡,跟著 HTML 一起送達,不需要額外請求。關鍵 CSS 實際上用的就是這種。
  • 行內 CSS(Inline CSS / Inline Style):樣式寫在個別 HTML 標籤的 style 屬性上,只對那一個標籤生效。

很多教學與快取外掛把「內聯關鍵 CSS」說成 inline CSS,但技術上它是把樣式放進 <head><style> 區塊,屬於內部 CSS。理解這個差異有助於你看懂外掛設定與工具文件在講什麼。

為什麼內聯關鍵 CSS 能讓首屏更快出現

直接給結論:關鍵 CSS 不會減少網頁實際的總載入時間,但會大幅改善「感知速度」與兩個 Core Web Vitals 指標,FCP(First Contentful Paint,首次內容繪製)與 LCP(Largest Contentful Paint,最大內容繪製)。

原理出在瀏覽器的渲染流程。CSS 跟 JavaScript 一樣,預設被視為阻擋渲染的資源,瀏覽器必須先下載、解析、建立 CSSOM,才能開始把任何依賴這些樣式的內容畫到螢幕上。WordPress 預設會並行載入多支 CSS 檔,瀏覽器得等這些檔案全部到齊並解析完,首屏才出得來。檔案越大、支數越多,這段空白等待就越長。

內聯關鍵 CSS 改變了這個順序。首屏要用的樣式跟著 HTML 一起抵達,瀏覽器不必為了首屏去等任何外部請求,可以立刻畫出上半部;非關鍵的那份大樣式表則改成非同步載入,等首屏顯示後才在背景補上。對訪客來說,頁面「感覺」快了很多,FCP 與 LCP 的數字也跟著往下掉。

這對 SEO 有實質意義。Core Web Vitals 是 Google 排名訊號的一環,LCP 反映載入體驗、CLS 反映視覺穩定度、INP(Interaction to Next Paint,已取代過去的 FID)反映互動延遲。其中 LCP 與首屏渲染直接相關,而關鍵 CSS 正是壓低 LCP 的常見手段之一。順帶一提,PageSpeed Insights 報告裡如果同時看到「縮減未使用的 CSS」這條建議,那是另一個但相關的問題,後面會說明它跟關鍵 CSS 的差別。

阻擋渲染的 CSS 怎麼檢測出來

在動手產生關鍵 CSS 之前,先確認自己的網站到底需不需要。最快的方法是把網址貼進 Google PageSpeed Insights 跑一次,重點看三個地方。

第一、看頂部的 Core Web Vitals 評估,特別是 FCP。手機版 FCP 建議壓在 1.8 秒以內,如果明顯超過,加上畫面長時間空白,很可能就是 CSS 在擋。

第二、捲到「最佳化建議」(Opportunities)區塊,找有沒有「排除阻擋轉譯的資源」這條。點開後 Google 會列出是哪些 CSS(或 JS)檔造成阻擋。CSS 部分就是關鍵 CSS 能處理的範圍;如果列出來的是 JavaScript,那要走延後載入 JS 的另一套做法。

第三、用 Chrome 開發者工具的 Coverage 分頁做更精細的判讀,這一步多數教學講得太簡略,這裡寫清楚操作路徑。在要檢查的頁面上按右鍵選「檢查」(Inspect)打開開發者工具,按一下 Esc 叫出底部的抽屜面板,點左上角三個點的選單,勾選「Coverage」開啟這個分頁。按下重新整理按鈕,幾秒後會列出每支 CSS 與 JS 的使用率。把游標移到某支 CSS 上,右側的使用率視覺化長條裡,綠色代表這個頁面實際用到的規則、紅色代表沒用到的。綠色那段大致就對應這支檔案裡的關鍵規則,紅色比例偏高則代表這支樣式表載了一堆當前頁面根本用不到的東西。

判讀重點:如果首屏載入時未使用的 CSS 位元組比例很高,表示瀏覽器花了時間下載一堆無關樣式才畫出畫面,這正是內聯關鍵 CSS 加上延後其餘樣式能改善的場景。

手動抽取關鍵 CSS 的完整步驟

如果你的站很小、頁面版型單純,手動產生關鍵 CSS 是可行的,也最能掌控細節。流程分四步。

第 1 步、先備份整站。 手動法會動到主題檔或內聯一段樣式,萬一畫面跑掉要能立刻還原。用你慣用的備份外掛或主機商的備份功能各做一份,確認可一鍵復原再往下。

第 2 步、產生關鍵 CSS。 與其逐條從 Coverage 報告手抄(量大又容易漏 media query),實務上多半借助線上產生器。把頁面網址貼進去,工具會用無頭瀏覽器渲染該頁、算出首屏用到的規則,回吐一段已壓縮(minify)的關鍵 CSS,複製下來即可。市面上有純產生 CSS 的免費工具,也有付費服務(例如以月費計價的 criticalcss.com)連產生帶上稿一條龍包辦。要注意免費產生器通常只「給你 CSS」,內聯到網站這步仍得自己做。

第 3 步、內聯到 <head> 把複製來的關鍵 CSS 用 <style> 標籤包起來,放進 HTML 的 <head> 區塊。直接改主題的話,FTP 進到 wp-content、themes、目前啟用的主題資料夾,打開 header.php,在 <title> 標籤下方貼上:

<style id="critical-css">
  /* 這裡貼上產生器給你的關鍵 CSS */
</style>

不想動主題檔的人,可以用外掛代勞。Autoptimize 在「CSS Options」裡有個「Inline and Defer CSS」選項,勾選後會出現一個文字框,把關鍵 CSS 貼進去,外掛就會自動把它內聯到 <head>、同時延後其餘樣式。

第 4 步、延後其餘樣式表非同步載入。 內聯只完成一半,剩下的大樣式表如果還是阻擋渲染就白做了。要讓它非同步載入,常見手法是把 <link> 改寫成 rel="preload" 搭配 onload 切換回 stylesheet,或交給外掛的延後載入功能處理。內聯關鍵 CSS 加上延後其餘 CSS,兩件事一起做,才是完整的最佳化策略。

手動法的硬傷在於維護。每種內容類型(首頁、文章、頁面、商品頁、彙整頁)的首屏樣式都不一樣,理論上每一種版型都得各做一份關鍵 CSS 並條件式載入;手機與桌機的 media query 也可能要分開處理。更麻煩的是,只要換主題、更新會動到版面的外掛、或改了首屏設計,舊的關鍵 CSS 就可能對不上新版面而破版。對持續更新、版型多的站,這幾乎是不可能長期人工維護的工作。

用外掛自動產生關鍵 CSS 怎麼做

對多數 WordPress 站長來說,外掛自動產生是更務實的選擇,省去抄樣式與手動維護的負擔,還能依內容類型自動算出對應的關鍵 CSS。下面整理幾個主流外掛的設定路徑與定位差異。

WP Rocket(付費) 是綜合型快取外掛,關鍵 CSS 只是它的功能之一。進「設定」、WP Rocket、「File Optimization」分頁,捲到 CSS 區塊勾選「Optimize CSS delivery」,它會自動為每種內容類型產生關鍵 CSS 並把其餘樣式非同步載入。WP Rocket 另外提供「Remove Unused CSS」選項,定位與關鍵 CSS 不同(差別下一段細講),官方建議優先使用。換主題或更新後,從頂部工具列的 WP Rocket 選單點「Regenerate Critical CSS」重新產生即可;針對用頁面建構器做的特殊頁,也能在文章編輯側欄的 WP Rocket 面板針對單頁產生專屬關鍵 CSS。

Jetpack Boost(免費+付費) 走輕量路線。安裝啟用後會給一個效能分數,免費版就有「Optimize CSS loading」開關,打開即會辨識出最重要的 CSS 規則內聯、其餘延後。免費版的限制是每次改動版面都得手動重新產生,付費版才會自動重新產生,這是它升級方案最實際的價值。

LiteSpeed Cache(免費) 適合用 LiteSpeed 主機的站。它在「Load CSS Asynchronously」設定下會自動產生關鍵 CSS 來避免破版,另外還有一個 UCSS(Unique CSS)功能,做的是另一件事,後面比較段會說明。

Autoptimize(免費) 偏手動,前一段已提過,適合搭配你自己產生的關鍵 CSS 內聯使用。

選擇邏輯給個方向:想一個外掛全包又願意付費,WP Rocket 最省心;預算有限、站不大,先用 Jetpack Boost 免費版或 LiteSpeed Cache(如果主機支援);只想內聯自己手抄的關鍵 CSS,Autoptimize 就夠。

關鍵 CSS 跟「移除未使用 CSS」不是同一件事

這兩個概念在 PageSpeed 報告與外掛設定裡常被混為一談,但解決的是不同問題,分清楚才不會設定錯。

關鍵 CSS(Critical CSS)處理的是「順序」問題:把首屏要用的那一小段樣式優先內聯,讓畫面早點出現,對應 PageSpeed 的「排除阻擋轉譯的資源」。它不會把你的樣式表變小,只是改變載入時機。

移除未使用 CSS(Remove Unused CSS / 在 LiteSpeed 裡叫 UCSS)處理的是「體積」問題:分析每個頁面實際用到哪些規則,把那一頁根本沒用到的樣式整批拿掉,產出一份精簡過、只含該頁所需規則的樣式表,對應 PageSpeed 的「縮減未使用的 CSS」這條建議。它直接縮小檔案大小。

兩者可以、也常常一起用,但要注意搭配關係。如果你採用非同步載入樣式,務必同時保留關鍵 CSS,否則首屏會在精簡樣式表載入前出現一瞬間沒套樣式的畫面(也就是下一段要講的 FOUC)。簡單說,UCSS 負責瘦身、關鍵 CSS 負責讓首屏不破版,兩者是互補而非取代。

另外還有一個相關但獨立的概念,延後的 CSS(deferred CSS)。它指的是內聯關鍵 CSS 之後,被丟到背景非同步載入的那整份其餘樣式。關鍵 CSS 與延後 CSS 是同一套最佳化的一體兩面:前者決定先畫什麼,後者決定其餘的什麼時候補上。

破版(FOUC)與其他常見問題怎麼處理

啟用關鍵 CSS 最常見的副作用是 FOUC(Flash of Unstyled Content,未套樣式內容閃現),頁面會先閃一下沒套好樣式的素顏狀態,等完整 CSS 載入才跳成正常版型。這多半是關鍵 CSS 抽取不完整造成的,瀏覽器拿到的內聯樣式不足以畫對首屏。

處理方向有幾個。先確認外掛的關鍵 CSS 是否確實產生成功(有些外掛產生失敗會靜默退回阻擋載入);若是手動法,回頭用 Coverage 分頁檢查首屏綠色規則有沒有漏抓,尤其是 media query 與字型相關樣式。多數成熟外掛也允許你手動補上它漏掉的規則,把破版的那幾條樣式加進關鍵 CSS 即可。一個務實的習慣是在測試環境先啟用、確認首屏正常再上線,別直接在正式站開關。

頁面建構器是另一個高風險區。Elementor、Divi 這類工具產生的 CSS 比手刻主題複雜得多,對載入順序也有自己的假設,關鍵 CSS 的自動抽取容易不完整,而且針對某個版型算出來的關鍵 CSS 套到另一個結構不同的版型上就會破。WP Rocket、Jetpack Boost 這類外掛對主流建構器有相容處理,相對安全;走手動法的話,首頁、文章、商品頁、彙整頁這些不同版型要各自產生一份,因為它們的首屏 CSS 並不相同。

關於「該多久重新產生一次」,原則是:每當你換主題、更新會影響版面的外掛、或對首屏設計做了明顯改動,就要重新產生關鍵 CSS,否則外掛會繼續沿用對不上新版面的舊樣式而破版。手動法得自己記得做這件事,這也是它最容易出包的地方;WP Rocket 提供一鍵重產,Jetpack Boost 付費版會自動處理,這是自動化相對人工最實際的優勢。

內聯之後怎麼確認真的有生效

設定完別急著收工,關鍵 CSS 有沒有正確上去要驗證過才算數,這裡給三個互補的檢查法。

第一、檢視網頁原始碼。先登出後台或在外掛裡開啟「對登入使用者也套用快取」,否則你看到的可能是未最佳化的版本。在前台頁面按右鍵選「檢視網頁原始碼」,在 <head> 裡找有沒有一段內聯的 <style> 區塊,有就代表關鍵 CSS 已內聯上去;同時確認原本的樣式表 <link> 是否變成延後或非同步載入的形式。

第二、回到 PageSpeed Insights 重跑一次同一個網址。重點看「排除阻擋轉譯的資源」這條有沒有從「最佳化建議」移到「已通過的稽核」區塊,FCP 與 LCP 的數字有沒有往下走。手機版 FCP 目標壓在 2 秒內。

第三、再用一次 Coverage 分頁。重新整理頁面後看首屏載入時的未使用 CSS 比例有沒有下降。如果比例仍然很高,代表關鍵 CSS 抽取不夠完整,或非關鍵樣式沒被成功延後,需要回頭調整。

三個方法分別驗的是「有沒有內聯上去」「Google 認不認帳」「實際載入有沒有變精簡」,建議都跑一遍再判定設定成功。

從檢測到驗證,這套流程該怎麼跑下來

關鍵 CSS 的價值不在縮短總載入秒數,而在讓首屏提早出現、把 LCP 與 FCP 壓下來,連帶改善訪客的感知速度與 Core Web Vitals 評分。整套邏輯是一條清楚的鏈:用 PageSpeed Insights 與 Coverage 分頁確認自己真的有阻擋渲染的 CSS,再決定走手動抽取還是外掛自動產生,把首屏樣式內聯進 <head> 並讓其餘樣式延後載入,最後用原始碼、PageSpeed 重測與 Coverage 三方驗證有沒有生效,並留意破版與重產時機。

下一步很單純。先把自己最重要的那個頁面(通常是首頁或主力到達頁)丟進 PageSpeed Insights 跑一次,看看有沒有那條紅字。小站、單純版型可以試手動法練手感;持續更新、版型多或用了頁面建構器的站,直接交給 WP Rocket、Jetpack Boost 或 LiteSpeed Cache 自動產生並排好重產節奏,會省下大量維護心力。每次動到主題、版面外掛或首屏設計,記得回來重新產生一次,關鍵 CSS 才會一直跟得上你的網站。

相關文章
標籤: WP Rocket, Core Web Vitals, PageSpeed Insights, 關鍵 CSS, render-blocking