Ngăn việc dịch bố cục và nhấp nháy văn bản không hiển thị (FOIT) bằng cách tải trước phông chữ không bắt buộc

Kể từ Chrome 83, bạn có thể kết hợp link rel="preload" và font-display: optional để loại bỏ hoàn toàn hiện tượng giật bố cục

Bằng cách tối ưu hoá chu kỳ kết xuất, Chrome 83 loại bỏ việc thay đổi bố cục khi tải trước phông chữ không bắt buộc. Việc kết hợp <link rel="preload"> với font-display: optional là cách hiệu quả nhất để đảm bảo không có hiện tượng giật bố cục khi kết xuất phông chữ tuỳ chỉnh.

Khả năng tương thích với trình duyệt

Hãy xem dữ liệu của MDN để biết thông tin hỗ trợ mới nhất trên nhiều trình duyệt:

Kết xuất phông chữ

Việc thay đổi bố cục hoặc bố cục lại xảy ra khi một tài nguyên trên trang web thay đổi một cách linh động, dẫn đến việc "thay đổi" nội dung. Việc tìm nạp và hiển thị phông chữ web có thể trực tiếp gây ra sự thay đổi bố cục theo một trong hai cách sau:

  • Phông chữ dự phòng được hoán đổi với phông chữ mới ("nhấp nháy văn bản không có kiểu")
  • Văn bản "vô hình" sẽ hiển thị cho đến khi phông chữ mới được kết xuất vào trang ("nhấp nháy văn bản vô hình")

Thuộc tính font-display của CSS cung cấp một cách để sửa đổi hành vi kết xuất phông chữ tuỳ chỉnh thông qua một loạt các giá trị được hỗ trợ khác nhau (auto, block, swap, fallbackoptional). Việc chọn giá trị nào để sử dụng phụ thuộc vào hành vi ưu tiên cho phông chữ được tải không đồng bộ. Tuy nhiên, cho đến nay, mọi giá trị được hỗ trợ này đều có thể kích hoạt việc bố cục lại theo một trong hai cách nêu trên!

Phông chữ không bắt buộc

Thuộc tính font-display sử dụng tiến trình gồm 3 giai đoạn để xử lý các phông chữ cần tải xuống trước khi có thể hiển thị:

  • Chặn: Hiển thị văn bản "vô hình", nhưng chuyển sang phông chữ web ngay khi tải xong.
  • Hoán đổi: Kết xuất văn bản bằng phông chữ hệ thống dự phòng, nhưng chuyển sang phông chữ web ngay khi tải xong.
  • Không đạt: Hiển thị văn bản bằng phông chữ hệ thống dự phòng.

Trước đây, các phông chữ được chỉ định bằng font-display: optional có khoảng thời gian chặn là 100 mili giây và không có khoảng thời gian hoán đổi. Điều này có nghĩa là văn bản "vô hình" sẽ hiển thị rất ngắn trước khi chuyển sang phông chữ dự phòng. Nếu phông chữ không được tải xuống trong vòng 100 mili giây, thì phông chữ dự phòng sẽ được sử dụng và không có hoạt động hoán đổi nào xảy ra.

Sơ đồ cho thấy hành vi phông chữ tuỳ chọn trước đó khi phông chữ không tải được
Hành vi font-display: optional trước đây trong Chrome khi phông chữ được tải xuống sau khoảng thời gian chặn 100 mili giây

Tuy nhiên, trong trường hợp phông chữ được tải xuống trước khi khoảng thời gian chặn 100 mili giây kết thúc, phông chữ tuỳ chỉnh sẽ được kết xuất và sử dụng trên trang.

Sơ đồ cho thấy hành vi tuỳ chọn trước đó của phông chữ khi phông chữ tải kịp thời
Hành vi font-display: optional trước đây trong Chrome khi phông chữ được tải xuống trước khoảng thời gian chặn 100 mili giây

Chrome kết xuất lại trang hai lần trong cả hai trường hợp, bất kể có sử dụng phông chữ dự phòng hay không hoặc phông chữ tuỳ chỉnh có tải xong kịp thời hay không. Điều này khiến văn bản ẩn nhấp nháy nhẹ và trong trường hợp phông chữ mới được kết xuất, bố cục bị giật sẽ di chuyển một số nội dung của trang. Điều này xảy ra ngay cả khi phông chữ được lưu trữ trong bộ nhớ đệm ổ đĩa của trình duyệt và có thể tải tốt trước khi khoảng thời gian chặn hoàn tất.

Các biện pháp tối ưu hoá đã ra mắt trong Chrome 83 để xoá hoàn toàn chu kỳ kết xuất đầu tiên cho phông chữ không bắt buộc được tải trước bằng <link rel="preload'>. Thay vào đó, quá trình kết xuất sẽ bị chặn cho đến khi phông chữ tuỳ chỉnh tải xong hoặc một khoảng thời gian nhất định đã trôi qua. Thời gian chờ này hiện được đặt ở mức 100 mili giây, nhưng có thể thay đổi trong tương lai gần để tối ưu hoá hiệu suất.

Sơ đồ cho thấy hành vi phông chữ không bắt buộc được tải trước mới khi phông chữ không tải được
Hành vi font-display: optional mới trong Chrome khi phông chữ được tải trước và phông chữ được tải xuống sau khoảng thời gian chặn 100 mili giây (không có văn bản ẩn xuất hiện)
Sơ đồ cho thấy hành vi phông chữ tuỳ chọn được tải trước mới khi phông chữ tải kịp thời
Hành vi font-display: optional mới trong Chrome khi phông chữ được tải trước và phông chữ được tải xuống trước khoảng thời gian chặn 100 mili giây (không có văn bản ẩn xuất hiện)

Việc tải trước phông chữ không bắt buộc trong Chrome sẽ loại bỏ khả năng bố cục bị giật và văn bản không được định kiểu sẽ nhấp nháy. Điều này phù hợp với hành vi bắt buộc như đã chỉ định trong Mô-đun phông chữ CSS cấp độ 4, trong đó phông chữ không bắt buộc không bao giờ được gây ra việc bố cục lại và các tác nhân người dùng có thể trì hoãn việc kết xuất trong một khoảng thời gian thích hợp.

Mặc dù không cần tải trước phông chữ không bắt buộc, nhưng việc này sẽ cải thiện đáng kể khả năng phông chữ tải trước chu kỳ kết xuất đầu tiên, đặc biệt là nếu phông chữ chưa được lưu trữ trong bộ nhớ đệm của trình duyệt.

Kết luận

Nhóm Chrome rất muốn biết trải nghiệm của bạn khi tải trước phông chữ không bắt buộc bằng các tính năng tối ưu hoá mới này! Gửi vấn đề nếu bạn gặp phải bất kỳ vấn đề nào hoặc muốn gửi đề xuất về tính năng.