Critical CSS Inlining
Đưa CSS cần thiết để hiển thị phần trên cùng (above-the-fold) vào thẻ <style> trong <head> nhằm cải thiện LCP.
Critical CSS Inlining là gì?
Critical CSS Inlining là kỹ thuật đưa những đoạn mã CSS cần thiết để hiển thị phần nội dung đầu tiên của trang (gọi là above-the-fold) trực tiếp vào thẻ <style> bên trong phần <head> — thay vì để chúng ở file CSS ngoài hoặc tải sau. Mục tiêu chính là giúp trình duyệt hiển thị nhanh phần trên cùng mà không phải chờ tải và xử lý toàn bộ file CSS.
Tại sao quan trọng trong SEO?
Google dùng chỉ số Largest Contentful Paint (LCP) như một yếu tố xếp hạng chính trong Core Web Vitals. LCP đo thời gian để phần tử lớn nhất trong vùng nhìn thấy (viewport) được hiển thị đầy đủ. Nếu CSS chặn kết xuất (render-blocking CSS) chưa tải xong, trình duyệt sẽ hoãn hiển thị — làm chậm LCP. Critical CSS Inlining loại bỏ trở ngại này, giúp LCP cải thiện rõ rệt: thường giảm từ 0,3–1,2 giây tùy cấu trúc trang và mạng người dùng.
Không phải yếu tố xếp hạng trực tiếp, nhưng việc cải thiện LCP qua Critical CSS Inlining góp phần nâng cao trải nghiệm người dùng — yếu tố gián tiếp ảnh hưởng mạnh đến tỷ lệ thoát, thời gian ở lại và thứ hạng tổng thể.
Cách hoạt động
Khi trình duyệt tải trang, nó đọc HTML từ trên xuống. Nếu gặp thẻ <link rel="stylesheet">, trình duyệt phải dừng kết xuất (render), tải file CSS, phân tích rồi mới tiếp tục. Critical CSS Inlining tránh điều này bằng cách:
- Xác định tất cả CSS quy tắc áp dụng cho phần trên cùng (viewport đầu tiên khi load)
- Trích xuất và tối ưu các quy tắc đó (loại bỏ comment, khoảng trắng thừa, không nén)
- Đưa chúng vào thẻ
<style></style>trong<head> - Giữ lại phần còn lại của CSS để tải không chặn (non-blocking), ví dụ qua
rel="preload"hoặcmedia="print"+ đổi lại sau
Quá trình này không thay đổi cách trang hiển thị — chỉ thay đổi thứ tự và cách tải CSS để tăng tốc độ kết xuất ban đầu.
Hướng dẫn thực hiện
Dưới đây là các bước triển khai chuẩn, phù hợp với đa số website tĩnh và động:
- Xác định vùng above-the-fold: Dùng công cụ như Chrome DevTools > Rendering > “Emulate CSS media” hoặc chụp màn hình viewport 1280×720 (desktop) và 360×640 (mobile). Ghi lại các thành phần nằm hoàn toàn trong khung này.
- Trích xuất Critical CSS: Dùng công cụ đáng tin cậy như:
- Sitelocity Critical Path CSS Generator (miễn phí, giới hạn file)
- critical (npm package) — hỗ trợ tích hợp CI/CD
- Plugin WordPress như Autoptimize hoặc WP Rocket (có tùy chọn bật Critical CSS)
- Chèn vào <head>: Dán đoạn CSS đã trích xuất vào thẻ
<style>ngay sau<title>. Đảm bảo không có thẻ<script>nào trước đó gây delay. - Tối ưu phần còn lại: Đặt file CSS gốc vào cuối
<body>, hoặc dùng<link rel="preload" as="style" onload="this.onload=null;this.rel='stylesheet'" href="...">để tải không chặn. - Thử nghiệm và kiểm tra: Dùng PageSpeed Insights, WebPageTest hoặc Lighthouse để so sánh LCP trước/sau. Kiểm tra cả trên mobile và desktop.
Lỗi thường gặp
- Chèn quá nhiều CSS vào <head>: Nếu critical CSS vượt 14 KB (giới hạn đề xuất của Google), nó có thể làm chậm tải HTML. → Khắc phục: Giới hạn chỉ những quy tắc thực sự cần thiết cho vùng đầu tiên; loại bỏ @font-face, animation, hover, hay media query không áp dụng ở viewport mặc định.
- Bỏ sót CSS cho trạng thái tương tác: Một số trang có menu burger, modal hoặc tab chỉ hiện khi click — nếu CSS cho các trạng thái này bị đưa vào critical, sẽ lãng phí. → Khắc phục: Chỉ bao gồm CSS cho trạng thái ban đầu (default state), không bao gồm :hover, :focus, .is-open… trừ khi chúng hiển thị ngay lúc load.
- Không cập nhật khi giao diện thay đổi: Nếu thiết kế trang thay đổi (ví dụ thêm banner, đổi font tiêu đề), critical CSS cũ sẽ lỗi hiển thị. → Khắc phục: Tự động hóa quy trình (dùng critical + Gulp/Webpack) hoặc thiết lập cảnh báo khi file CSS gốc thay đổi.
- Áp dụng sai cho trang động: Với trang có nội dung khác nhau theo người dùng (ví dụ dashboard cá nhân), một critical CSS chung có thể không hiệu quả. → Khắc phục: Sinh critical CSS riêng theo template hoặc dùng giải pháp server-side rendering (SSR) có hỗ trợ dynamic critical CSS — tùy trường hợp.
Ví dụ thực tế
Một trang tin tức có header, tiêu đề bài viết, ảnh đại diện và đoạn mở đầu nằm trong vùng above-the-fold. File CSS gốc dài 120 KB, chứa quy tắc cho toàn bộ site (menu dropdown, form bình luận, footer…).
Sau khi trích xuất critical CSS:
| Thông số | Trước khi inlining | Sau khi inlining |
|---|---|---|
| Kích thước CSS trong <head> | 0 KB (toàn bộ CSS ngoài) | ~8,2 KB |
| Thời gian LCP (mobile, 3G) | 3,8 s | 2,1 s |
| Điểm Lighthouse (Performance) | 52 | 86 |
| Render-blocking tài nguyên | 2 file CSS | 0 (CSS trong <head> không chặn render) |
Lưu ý: Kết quả cụ thể có thể thay đổi tùy cấu hình máy chủ, CDN, và mức độ tối ưu khác (JS, hình ảnh…).
Câu hỏi thường gặp
Critical CSS Inlining có cần thiết với mọi trang web?
Không bắt buộc, nhưng rất nên với trang đích (landing page), blog, cửa hàng online và trang có LCP trên 2,5 giây. Với trang nội bộ ít người truy cập hoặc nội dung tĩnh đơn giản (ví dụ trang 404), lợi ích thường không đáng kể.
Có thể kết hợp Critical CSS Inlining với defer JavaScript không?
Có thể và nên kết hợp. Critical CSS giải quyết vấn đề CSS chặn kết xuất, còn defer hoặc async giải quyết JS chặn phân tích (parsing). Hai kỹ thuật bổ trợ lẫn nhau để đạt LCP tốt hơn — nhưng cần kiểm tra thứ tự thực thi để tránh lỗi hiển thị (ví dụ JS chạy trước khi DOM sẵn sàng).
Critical CSS có ảnh hưởng đến SEO hình ảnh hoặc nội dung ẩn?
Không. Critical CSS chỉ ảnh hưởng đến tốc độ hiển thị phần đầu trang. Nội dung ẩn (scroll xuống mới thấy), ảnh lazy-load hoặc phần được tải động qua AJAX không phụ thuộc vào critical CSS. Chúng chịu ảnh hưởng bởi các yếu tố khác như kích thước tệp, alt text, và chiến lược tải.