KIếN THứC WEBSITE › PERFORMANCE

font-display swap — 5 giá trị và recommendation cho WordPress

font-display swap — 5 giá trị và recommendation cho WordPress 2026

font-display là CSS descriptor điều khiển hành vi trình duyệt khi font đang tải — hiển thị fallback ngay hay ẩn chữ trong thời gian chờ. Bài giải thích 5 giá trị (auto, block, swap, fallback, optional), đánh đổi FOIT/FOUT và cách chọn đúng cho shop WordPress 2026.

font-display là gì và tại sao quan trọng

font-display swap — font-display là gì và tại sao quan trọng
font-display là gì và tại sao quan trọng

font-display là CSS descriptor nằm trong khai báo @font-face, cho phép kiểm soát hành vi tải font. Trước năm 2016, trình duyệt mặc định “block 3 giây” — chữ biến mất 3 giây nếu font chậm.

Đặt font-display đúng là cách đơn giản nhất để tránh trải nghiệm chờ chữ xuất hiện trên site.

4 giai đoạn tải font

  • Giai đoạn block: trình duyệt render chữ vô hình, đợi font custom tải xong. Mặc định 3 giây.
  • Giai đoạn swap: trình duyệt render chữ bằng font fallback (sans-serif, serif), đổi khi font custom sẵn sàng.
  • Giai đoạn failure: font không tải được trong thời gian giới hạn, trình duyệt dùng fallback vĩnh viễn.
  • Loaded: font sẵn sàng — trình duyệt đổi từ fallback sang font custom nếu còn trong swap period.

Ảnh hưởng đến Core Web Vitals

font-display tác động đến FCP (block period ẩn chữ trì hoãn FCP) và CLS (swap muộn gây dịch chuyển bố cục). Xem thêm tại bài fix CLSbài so sánh FCP và LCP.

Kết hợp font-display đúng với tự host font là cách tối ưu font hiệu quả nhất.

5 giá trị font-display

5 giá trị font-display
5 giá trị font-display

CSS spec định nghĩa 5 giá trị. Mỗi giá trị cấu hình 4 giai đoạn khác nhau, mang lại đánh đổi khác nhau giữa FOIT và FOUT.

auto — để trình duyệt tự quyết

Trình duyệt tự chọn hành vi — thường giống “block” với block period 3 giây. Không khuyến nghị dùng auto vì không nhất quán giữa các trình duyệt.

Luôn đặt giá trị rõ ràng thay vì để mặc định auto.

block — ẩn chữ tối đa 3 giây

Block period 3 giây + swap period vô hạn. Chữ ẩn 3 giây, hiển thị fallback nếu font chưa tải, đổi sang font custom khi sẵn sàng.

Use case: logo có brand identity quan trọng, không chấp nhận render sai font. Đổi lại: người dùng thấy khoảng trắng 3 giây — tệ cho trải nghiệm trên mạng chậm.

swap — khuyến nghị cho hầu hết trường hợp

Block period 0ms + swap period vô hạn. Render fallback ngay lập tức, đổi khi font custom tải xong.

Use case: body text, tiêu đề chính — người dùng cần đọc ngay, FOUT tốt hơn FOIT.

Đổi lại: FOUT (chữ fallback rồi đổi font) có thể gây CLS nếu fallback khác metric font custom nhiều.

fallback — cân bằng

Block period 100ms + swap period 3 giây + sau đó dùng fallback vĩnh viễn. Block rất ngắn, swap nhanh nếu font tải trong 3 giây, font tải muộn hơn không được swap.

Use case: tiêu đề bổ trợ không quan trọng. Tránh swap muộn gây CLS bất ngờ sau khi người dùng đã đọc.

optional — ưu tiên tốc độ

Block period 100ms + không swap. Nếu font không có trong cache và tải lâu hơn 100ms, trình duyệt dùng fallback luôn.

Font custom tiếp tục tải nền cho lần truy cập sau — lần thứ hai người dùng thấy font custom.

Use case: font trang trí không thiết yếu. Đổi lại: người dùng lần đầu không thấy font custom.

Bảng so sánh 5 giá trị

Chọn đúng giá trị tuỳ vào tầm quan trọng của font với trải nghiệm người dùng.

Giá trị Block period Swap period Tác động UX Khuyến nghị
auto 3s (trình duyệt quyết) Vô hạn Không nhất quán Tránh dùng
block 3s Vô hạn FOIT 3 giây Logo brand critical
swap 0ms Vô hạn FOUT + swap muộn có thể gây CLS Body text, H1/H2
fallback 100ms 3s FOIT ngắn + swap nhanh Tiêu đề bổ trợ
optional 100ms 0ms Fallback vĩnh viễn lần đầu Font trang trí

Hỗ trợ trình duyệt

font-display hỗ trợ ~96% toàn cầu năm 2026: Chrome 60+, Firefox 58+, Safari 11.1+, Edge 79+. Trình duyệt cũ bỏ qua property và dùng hành vi mặc định — không có rủi ro làm vỡ layout.

FOIT vs FOUT — chọn vấn đề ít tệ hơn

FOIT vs FOUT — chọn vấn đề ít tệ hơn
FOIT vs FOUT — chọn vấn đề ít tệ hơn

FOIT (chữ ẩn) và FOUT (fallback hiển thị rồi đổi) là 2 đánh đổi chính khi tải font. Không có lựa chọn hoàn hảo cho mọi tình huống.

Khi nào FOIT tệ hơn FOUT

FOIT tệ hơn FOUT trong phần lớn trường hợp. Người dùng thấy khoảng trắng 3 giây không đọc được — cảm giác site bị lỗi.

Trên mạng 3G hoặc di động yếu, 3 giây là rất lâu.

FOUT tạo trải nghiệm tốt hơn: người dùng đọc được ngay bằng fallback, chấp nhận chuyển font nhẹ sau đó. Tốt hơn FOIT cho ~90% trường hợp thực tế.

Khi FOUT gây vấn đề

FOUT nghiêm trọng nhất khi metric fallback khác nhiều so với font custom — gây dịch chuyển bố cục (CLS) lớn khi swap. Người dùng đang đọc bỗng thấy text nhảy vị trí.

Dùng font-display: fallback để giới hạn swap period 3 giây — font tải muộn hơn sẽ không được swap, tránh CLS bất ngờ.

Giảm tác động FOUT qua size-adjust

CSS descriptor size-adjust, ascent-override, descent-override trong @font-face fallback điều chỉnh metric fallback match gần với font custom. Swap xảy ra nhưng không làm bố cục dịch chuyển.

Công cụ kiểm tra và tính toán giá trị: tools.pixelambacht.nl/fontmetrics. Xem chi tiết CLS tại bài fix CLS — layout shift.

Hướng dẫn chọn giá trị cho shop WordPress VN

Bảng dưới áp dụng được cho phần lớn shop thương mại điện tử tại VN năm 2026.

Vị trí font font-display Lý do
Body text (đoạn văn) swap Người dùng cần đọc ngay, FOUT tốt hơn FOIT
Tiêu đề H1/H2 swap Quan trọng về hiển thị, không nên block
Logo SVG font block Brand critical, chấp nhận FOIT ngắn
Tiêu đề H3+ bổ trợ fallback Không quan trọng, tránh swap muộn gây CLS
Font trang trí (quote, badge) optional Bỏ qua nếu chậm, không ảnh hưởng trải nghiệm
Icon font (FontAwesome) block Render fallback ký tự ngẫu nhiên — tệ hơn ẩn

Đặt font-display trong @font-face

@font-face {
  font-family: 'Inter';
  font-weight: 400;
  font-display: swap;   /* body text */
  src: url('/fonts/inter-400.woff2') format('woff2');
}

@font-face {
  font-family: 'InterDecor';
  font-weight: 400;
  font-display: optional;   /* font trang trí */
  src: url('/fonts/inter-decor.woff2') format('woff2');
}

Khi dùng plugin OMGF

Plugin OMGF tự động thêm font-display: swap cho toàn bộ font khi self-host. Nếu cần giá trị khác (fallback, optional) cho font cụ thể, override thủ công trong CSS của theme sau khi plugin tạo @font-face.

Checklist áp dụng cho shop

Danh sách kiểm tra trước khi bàn giao site cho khách hàng.

Kiểm tra font-display

  1. Mọi @font-face đều có khai báo font-display rõ ràng, không để auto.
  2. Font body text và H1/H2 dùng font-display: swap.
  3. Icon font (FontAwesome, Material Icons) dùng font-display: block.
  4. Font trang trí không thiết yếu dùng font-display: optional.
  5. Kiểm tra CLS sau khi swap bằng DevTools tab Performance.
  6. Nếu CLS cao khi swap: thêm size-adjust vào fallback font.

Xác nhận qua DevTools Performance

Mở DevTools → tab Performance → record tải trang. Tìm event “Layout Shift” trong timeline để xem nguyên nhân.

Nếu nguyên nhân là font swap, đây là vấn đề CLS cần xử lý bằng size-adjust.

Xem thêm cách đo và fix CLS tại bài fix CLS.

Bài liên quan

font-display là một phần trong bộ tối ưu font toàn diện. Đọc thêm các bài liên quan.

Câu hỏi thường gặp

Tại sao swap gây CLS?

Khi swap từ fallback sang font custom, nếu 2 font có metric khác nhau (chiều cao chữ, khoảng cách dòng), trình duyệt reflow bố cục. Các element phía dưới dịch chuyển → CLS tăng.

Sửa bằng CSS descriptor size-adjust + ascent-override trong @font-face fallback để metric khớp font custom. Công cụ kiểm tra: tools.pixelambacht.nl/fontmetrics.

Trình duyệt hỗ trợ font-display thế nào?

Hỗ trợ phổ biến ~96% toàn cầu năm 2026: Chrome 60+, Firefox 58+, Safari 11.1+, Edge 79+.

Trình duyệt cũ bỏ qua property và dùng hành vi mặc định (thường là block 3 giây). Không có rủi ro làm vỡ layout.

Plugin WordPress có tự động đặt font-display không?

Plugin OMGF (Optimize My Google Fonts) tự động thêm font-display: swap khi self-host font. Plugin “Async Google Fonts” cũng có tính năng này.

WordPress core không tự đặt — phải khai báo trong @font-face thủ công hoặc qua plugin.

Variable font có dùng font-display được không?

Được, hoạt động y hệt font tĩnh. Variable font 1 file nhiều weight — font-display áp dụng chung cho toàn bộ các weight.

Khai báo @font-face với format "woff2-variations" và range font-weight: 100 900 cho variable font.

Nên dùng swap hay fallback cho tiêu đề H2?

swap — vì H2 là nội dung quan trọng người dùng cần đọc ngay. FOUT ít tệ hơn FOIT đối với nội dung chính.

Dùng fallback khi H2 chỉ là trang trí (heading nhỏ sidebar, widget) và không ảnh hưởng nhiều nếu hiển thị fallback lâu hơn 3 giây.

Cần tối ưu font và cải thiện CLS cho site WordPress? Web22 cung cấp dịch vụ tối ưu Core Web Vitals — bao gồm audit font, font-display và sửa CLS.