Giới thiệu về phông chữ có thể thay đổi trên web

Thông số kỹ thuật phông chữ mới có thể giảm đáng kể kích thước tệp phông chữ

Trong bài viết này, chúng ta sẽ tìm hiểu phông chữ biến là gì, lợi ích của phông chữ biến và cách sử dụng phông chữ biến trong công việc. Trước tiên, hãy xem lại cách kiểu chữ hoạt động trên web và những điểm cải tiến mà phông chữ biến thể mang lại.

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

Kể từ tháng 5 năm 2020, phông chữ biến đổi được hỗ trợ trong hầu hết các trình duyệt. Xem bài viết Tôi có thể sử dụng phông chữ có thể thay đổi không?Phương án dự phòng.

Giới thiệu

Các nhà phát triển thường sử dụng thuật ngữ phông chữ và kiểu chữ thay thế cho nhau. Tuy nhiên, có một sự khác biệt: Phông chữ là thiết kế hình ảnh cơ bản có thể tồn tại trong nhiều công nghệ sắp chữ khác nhau và phông chữ là một trong những cách triển khai này, ở định dạng tệp kỹ thuật số. Nói cách khác, kiểu chữ là nội dung bạn thấy và phông chữ là nội dung bạn sử dụng.

Một khái niệm khác thường bị bỏ qua là sự khác biệt giữa kiểu và gia đình. Kiểu là một kiểu chữ đơn và cụ thể, chẳng hạn như Đậm nghiêng, còn bộ là tập hợp đầy đủ các kiểu.

Trước khi có phông chữ biến, mỗi kiểu được triển khai dưới dạng một tệp phông chữ riêng biệt. Với phông chữ biến, tất cả các kiểu có thể được chứa trong một tệp duy nhất.

Cấu trúc mẫu và danh sách các kiểu khác nhau của gia đình Roboto
Trái: một mẫu của bộ phông chữ Roboto. Phải: các kiểu được đặt tên trong gia đình.

Thách thức đối với nhà thiết kế và nhà phát triển

Khi tạo một dự án in, nhà thiết kế phải đối mặt với một số hạn chế, chẳng hạn như kích thước thực của bố cục trang, số lượng màu mà họ có thể sử dụng (được xác định theo loại máy in sẽ được sử dụng), v.v. Tuy nhiên, họ có thể sử dụng nhiều kiểu chữ như họ muốn. Điều này có nghĩa là kiểu chữ của các phương tiện in thường phong phú và tinh vi, nhờ đó mang lại trải nghiệm đọc thực sự thú vị. Hãy nghĩ đến lần gần đây nhất bạn thích thú khi xem một tạp chí tuyệt vời.

Nhà thiết kế và nhà phát triển web có những hạn chế khác với nhà thiết kế in, và một hạn chế quan trọng là chi phí băng thông liên quan đến thiết kế của chúng ta. Đây là điểm khó khăn đối với trải nghiệm kiểu chữ phong phú hơn, vì chúng có chi phí. Với phông chữ web truyền thống, mỗi kiểu được sử dụng trong thiết kế của chúng ta yêu cầu người dùng tải một tệp phông chữ riêng xuống, điều này làm tăng độ trễ và thời gian kết xuất trang. Chỉ bao gồm kiểu chữ Thường và Đậm, cùng với kiểu chữ nghiêng tương ứng, có thể lên đến 500 KB dữ liệu phông chữ. Điều này xảy ra ngay cả trước khi chúng ta xử lý cách hiển thị phông chữ, các mẫu dự phòng mà chúng ta cần sử dụng hoặc các hiệu ứng phụ không mong muốn như FOIT và FOUT.

Nhiều bộ phông chữ cung cấp nhiều kiểu chữ hơn, từ độ đậm Mỏng đến Đậm, chiều rộng hẹp và rộng, nhiều chi tiết về kiểu chữ và thậm chí là thiết kế dành riêng cho kích thước (được tối ưu hoá cho kích thước văn bản lớn hoặc nhỏ). Vì bạn sẽ phải tải một tệp phông chữ mới cho mỗi kiểu (hoặc tổ hợp kiểu), nên nhiều nhà phát triển web chọn không sử dụng các tính năng này, làm giảm trải nghiệm đọc của người dùng.

Phân tích cấu trúc của phông chữ biến đổi

Phông chữ biến thể giải quyết những thách thức này bằng cách đóng gói các kiểu vào một tệp duy nhất.

Cách này hoạt động bằng cách bắt đầu với một kiểu chữ trung tâm hoặc "mặc định", thường là "Chữ thường" – một thiết kế chữ La Mã thẳng đứng với độ đậm và chiều rộng điển hình nhất phù hợp nhất với văn bản thuần tuý. Sau đó, kiểu này được kết nối với các kiểu khác trong một phạm vi liên tục, được gọi là "trục". Trục phổ biến nhất là Độ đậm, có thể kết nối kiểu mặc định với kiểu In đậm. Mọi kiểu riêng lẻ đều có thể nằm dọc theo một trục và được gọi là "phiên bản" của phông chữ biến. Một số thực thể được nhà phát triển phông chữ đặt tên, ví dụ: vị trí trục Trọng số 600 được gọi là SemiBold.

Phông chữ biến thể Roboto Flex có ba kiểu cho trục Weight (Độ đậm). Kiểu thông thường nằm ở giữa, và có hai kiểu ở hai đầu đối diện của trục, một kiểu đậm hơn và kiểu còn lại nhạt hơn. Trong số này, bạn có thể chọn trong số 900 thực thể:

Chữ cái "A" hiển thị ở nhiều độ đậm
Ở trên: Hình minh hoạ cấu trúc của trục Trọng số cho kiểu chữ Roboto.

Nhà phát triển phông chữ có thể cung cấp một tập hợp các trục khác nhau. Bạn có thể kết hợp các thành phần này vì tất cả đều có cùng kiểu mặc định. Roboto có ba kiểu trong trục Chiều rộng: kiểu Thường nằm ở giữa trục và hai kiểu hẹp hơn và rộng hơn nằm ở mỗi đầu. Các giá trị này cung cấp tất cả chiều rộng của kiểu Regular (Thông thường) và kết hợp với trục Weight (Độ đậm) để cung cấp tất cả chiều rộng cho mọi độ đậm.

Roboto Flex trong các tổ hợp ngẫu nhiên của Chiều rộng và Độ đậm

Điều này có nghĩa là có hàng nghìn kiểu! Điều này có vẻ như là quá mức cần thiết, nhưng chất lượng của trải nghiệm đọc có thể được nâng cao đáng kể nhờ sự đa dạng của các kiểu chữ. Và nếu không bị phạt về hiệu suất, nhà phát triển web có thể sử dụng một vài hoặc nhiều kiểu tuỳ ý – tuỳ thuộc vào thiết kế của họ.

In nghiêng

Cách xử lý phông chữ in nghiêng trong phông chữ biến đổi rất thú vị vì có hai phương pháp khác nhau. Các phông chữ như Helvetica hoặc Roboto có các đường viền tương thích với nội suy, vì vậy, kiểu chữ Roman và Italic có thể được nội suy giữa các kiểu chữ này và trục Slant (Góc nghiêng) có thể được dùng để chuyển từ kiểu chữ Roman sang kiểu chữ Italic.

Các kiểu chữ khác (chẳng hạn như Garamond, Baskerville hoặc Bodoni) có đường viền ký tự La Mã và Italic không tương thích với nội suy. Ví dụ: các đường viền thường xác định chữ "n" viết thường theo kiểu chữ La Mã không khớp với các đường viền dùng để xác định chữ "n" viết thường theo kiểu chữ nghiêng. Thay vì nội suy một đường viền với đường viền khác, trục Italic (Chữ in nghiêng) sẽ chuyển đổi từ đường viền Roman sang đường viền Italic.

Ví dụ về Trục độ đậm cho phông chữ Amstelvar
Đường viền "n" của Amstelvar theo kiểu Italic (12 điểm, độ đậm thông thường, chiều rộng thông thường) và theo kiểu Roman. Hình ảnh do David Berlow, nhà thiết kế và nhà in phông chữ cung cấp tại Font Bureau.

Sau khi chuyển sang phông chữ nghiêng, các trục mà người dùng có thể sử dụng phải giống với các trục cho phông chữ Roman, cũng như bộ ký tự phải giống nhau.

Bạn cũng có thể thấy khả năng thay thế ký tự cho từng ký tự và sử dụng tính năng này ở bất kỳ đâu trong không gian thiết kế của phông chữ biến. Ví dụ: thiết kế dấu đô la có hai thanh dọc hoạt động tốt nhất ở kích thước điểm lớn hơn, nhưng ở kích thước điểm nhỏ hơn, thiết kế chỉ có một thanh sẽ tốt hơn. Khi chúng ta có ít pixel hơn để kết xuất ký tự, thiết kế hai thanh có thể trở nên khó đọc. Để khắc phục vấn đề này, tương tự như trục Italic, việc thay thế một ký tự bằng một ký tự khác có thể xảy ra dọc theo trục Kích thước quang học tại một điểm do nhà thiết kế phông chữ quyết định.

Tóm lại, khi đường viền cho phép, nhà thiết kế phông chữ có thể tạo phông chữ nội suy giữa nhiều kiểu trong không gian thiết kế nhiều chiều. Điều này giúp bạn kiểm soát chi tiết kiểu chữ và có nhiều quyền.

Định nghĩa về trục

Có 5 trục đã đăng ký kiểm soát các tính năng đã biết và có thể dự đoán của phông chữ: độ đậm, chiều rộng, kích thước quang học, độ nghiêng và in nghiêng. Ngoài những trục này, phông chữ có thể chứa các trục tuỳ chỉnh. Các tham số này có thể kiểm soát mọi khía cạnh thiết kế của phông chữ mà nhà thiết kế phông chữ mong muốn: kích thước chữ cái có chân, độ dài nét cong, chiều cao của chữ cái trên hoặc kích thước dấu chấm trên chữ i.

Mặc dù các trục có thể kiểm soát cùng một tính năng, nhưng chúng có thể sử dụng các giá trị khác nhau. Ví dụ: trong phông chữ biến Oswald và Hepta Slab, chỉ có một trục, đó là Độ đậm, nhưng các dải là khác nhau – Oswald có cùng dải như trước khi được nâng cấp thành biến, từ 200 đến 700, nhưng Hepta Slab có độ đậm cực nhỏ ở mức 1 và tăng lên đến 900.

Năm trục đã đăng ký có các thẻ viết thường gồm 4 ký tự dùng để đặt giá trị trong CSS:

Tên trục và giá trị CSS
Trọng lượng wght
Chiều rộng wdth
Liếc mắt slnt
Kích thước quang học opsz
In nghiêng ital

Vì nhà phát triển phông chữ xác định những trục có sẵn trong phông chữ biến và những giá trị mà các trục đó có thể có, nên điều quan trọng là phải tìm hiểu xem mỗi phông chữ cung cấp những gì. Tài liệu của phông chữ sẽ cung cấp thông tin này hoặc bạn có thể kiểm tra phông chữ bằng một công cụ như Wakamai Fondue.

Trường hợp sử dụng và lợi ích

Việc đặt giá trị trục phụ thuộc vào sở thích cá nhân và việc áp dụng các phương pháp hay nhất về kiểu chữ. Mọi công nghệ mới đều có thể bị sử dụng sai cách, và các chế độ cài đặt quá nghệ thuật hoặc mang tính thử nghiệm cũng có thể làm giảm khả năng đọc của văn bản thực tế. Đối với tiêu đề, việc khám phá các trục khác nhau để tạo ra các thiết kế nghệ thuật tuyệt vời là điều thú vị, nhưng đối với nội dung chính, việc này có nguy cơ khiến văn bản khó đọc.

Biểu cảm phấn khích

Ví dụ về cỏ của Mandy Michael

Một ví dụ tuyệt vời về cách thể hiện nghệ thuật được hiển thị ở trên, đó là việc khám phá phông chữ Decovar của Mandy Michael.

Bạn có thể xem ví dụ và mã nguồn hoạt động của mẫu trên tại đây.

Hoạt ảnh

Kiểu chữ Zycon, được thiết kế cho ảnh động bởi David Berlow, nhà thiết kế kiểu chữ và nhà in phông chữ tại Font Bureau.

Bạn cũng có thể khám phá việc tạo ảnh động cho các ký tự bằng phông chữ biến thể. Trên đây là ví dụ về các trục khác nhau được sử dụng với kiểu chữ Zycon. Xem ví dụ về ảnh động trực tiếp trên Axis Praxis.

Anicons là phông chữ biểu tượng màu động đầu tiên trên thế giới, dựa trên Biểu tượng Material Design. Anicons là một thử nghiệm kết hợp hai công nghệ phông chữ tiên tiến: phông chữ biến thể và phông chữ màu.

Một số ví dụ về ảnh động khi di chuột qua phông chữ biểu tượng màu của Anicon

Finesse

Amstelvar sử dụng một chút XTRA theo hướng ngược lại để chiều rộng của các từ được làm đều nhau

Roboto FlexAmstelvar cung cấp một bộ "Trục tham số". Trong các trục này, các chữ cái được phân tích thành 4 khía cạnh cơ bản của hình thức: hình dạng màu đen hoặc dương, hình dạng màu trắng hoặc âm và kích thước x và y. Tương tự như cách bạn có thể kết hợp màu chính với bất kỳ màu nào khác để điều chỉnh màu chính, bạn cũng có thể sử dụng 4 khía cạnh này để tinh chỉnh bất kỳ trục nào khác.

Trục XTRA trong Amstelvar cho phép bạn điều chỉnh giá trị "trắng" trên mỗi nghìn, như minh hoạ ở trên. Khi sử dụng một chút XTRA theo hướng ngược lại, chiều rộng của các từ sẽ được làm đều.

Phông chữ biến đổi trong CSS

Tải tệp phông chữ biến đổi

Phông chữ biến đổi được tải thông qua cơ chế @font-face giống như phông chữ web tĩnh truyền thống, nhưng có hai tính năng nâng cao mới:

@font-face {
    font-family: 'Roboto Flex';
    src: url('RobotoFlex-VF.woff2') format('woff2-variations');
    src: url('RobotoFlex-VF.woff2') format('woff2') tech('variations');
    font-weight: 100 1000;
    font-stretch: 25% 151%;
}

1. Định dạng nguồn: Chúng ta không muốn trình duyệt tải phông chữ xuống nếu trình duyệt đó không hỗ trợ phông chữ biến, vì vậy, chúng ta thêm nội dung mô tả formattech: một lần trong cú pháp trong tương lai (format('woff2') tech('variations')), một lần trong cú pháp không dùng nữa nhưng được hỗ trợ trong các trình duyệt (format('woff2-variations')). Nếu trình duyệt hỗ trợ phông chữ biến và hỗ trợ cú pháp sắp ra mắt, thì trình duyệt sẽ sử dụng nội dung khai báo đầu tiên. Nếu hỗ trợ phông chữ biến và cú pháp hiện tại, thì trình biên dịch sẽ sử dụng nội dung khai báo thứ hai. Cả hai đều trỏ đến cùng một tệp phông chữ.

2. Phạm vi kiểu: Bạn sẽ nhận thấy chúng ta đang cung cấp hai giá trị cho font-weightfont-stretch. Thay vì cho trình duyệt biết phông chữ này cung cấp độ đậm cụ thể nào (ví dụ: font-weight: 500;), giờ đây, chúng ta sẽ cung cấp cho trình duyệt dải độ đậm mà phông chữ hỗ trợ. Đối với Roboto Flex, trục Trọng số có phạm vi từ 100 đến 1000 và CSS trực tiếp liên kết phạm vi trục với thuộc tính kiểu font-weight. Bằng cách chỉ định phạm vi trong @font-face, mọi giá trị nằm ngoài phạm vi này sẽ được "giới hạn" ở giá trị hợp lệ gần nhất. Phạm vi trục Chiều rộng được liên kết theo cách tương tự với thuộc tính font-stretch.

Nếu bạn đang sử dụng API Phông chữ Google, thì tất cả những việc này sẽ được xử lý. CSS không chỉ chứa các định dạng và phạm vi nguồn thích hợp, mà Google Fonts cũng sẽ gửi phông chữ dự phòng tĩnh trong trường hợp không hỗ trợ phông chữ biến đổi.

Sử dụng trọng số và chiều rộng

Hiện tại, các trục mà bạn có thể thiết lập một cách đáng tin cậy từ CSS là trục wght thông qua font-weight và trục wdth thông qua font-stretch.

Theo truyền thống, bạn sẽ đặt font-weight làm từ khoá (light, bold) hoặc làm giá trị số từ 100 đến 900, theo bước 100. Với phông chữ biến thể, bạn có thể đặt bất kỳ giá trị nào trong phạm vi Chiều rộng của phông chữ:

.kinda-light {
  font-weight: 125;
}

.super-heavy {
  font-weight: 1000;
}
Trục Trọng số của Roboto Flex được thay đổi từ tối thiểu thành tối đa.

Tương tự, chúng ta có thể đặt font-stretch bằng từ khoá (condensed, ultra-expanded) hoặc bằng giá trị phần trăm:

.kinda-narrow {
  font-stretch: 33.3%;
}

.super-wide {
  font-stretch: 151%;
}
Trục Chiều rộng của Roboto Flex được thay đổi từ tối thiểu thành tối đa.

Sử dụng phông chữ nghiêng và phông chữ xiên

Trục ital dành cho các phông chữ chứa cả kiểu thông thường và kiểu nghiêng. Trục này là nút bật/tắt: giá trị 0 đang tắt và sẽ hiển thị kiểu thông thường, giá trị 1 sẽ hiển thị kiểu in nghiêng. Không giống như các trục khác, không có quá trình chuyển đổi. Giá trị 0.5 sẽ không cho bạn "nửa in nghiêng".

Trục slnt khác với kiểu in nghiêng ở chỗ đây không phải là một kiểu mới mà chỉ là kiểu nghiêng kiểu thông thường. Theo mặc định, giá trị của thuộc tính này là 0, nghĩa là các hình dạng chữ cái đứng mặc định. Roboto Flex có độ nghiêng tối đa là -10 độ, nghĩa là các chữ cái sẽ nghiêng về bên phải khi chuyển từ 0 đến -10.

Bạn có thể thiết lập các trục này một cách trực quan thông qua thuộc tính font-style, nhưng kể từ tháng 4 năm 2020, cách thực hiện chính xác việc này vẫn đang được nghiên cứu. Vì vậy, hiện tại, bạn nên coi các trục này là trục tuỳ chỉnh và thiết lập các trục này thông qua font-variation-settings:

i, em, .italic {
    /* Should be font-style: italic; */
    font-variation-settings: 'ital' 1;
}

.slanted {
    /* Should be font-style: oblique 10deg; */
    font-variation-settings: 'slnt' 10;
}
Trục nghiêng của Roboto Flex được thay đổi từ tối thiểu thành tối đa.

Sử dụng kích thước quang học

Phông chữ có thể được hiển thị rất nhỏ (chú thích 12px) hoặc rất lớn (dòng tiêu đề 80px). Phông chữ có thể phản hồi những thay đổi về kích thước này bằng cách thay đổi hình dạng chữ cái để phù hợp hơn với kích thước của phông chữ. Kích thước nhỏ có thể phù hợp hơn khi không có chi tiết nhỏ, trong khi kích thước lớn có thể hưởng lợi từ nhiều chi tiết hơn và nét vẽ mỏng hơn.

Chữ cái "a" hiển thị ở nhiều kích thước quang học
Chữ cái "a" trong Roboto Flex ở các kích thước pixel khác nhau, sau đó được điều chỉnh theo tỷ lệ để có cùng kích thước, cho thấy sự khác biệt trong thiết kế. Tự thử trên Codepen

Một thuộc tính CSS mới đã được giới thiệu cho trục này: font-optical-sizing. Theo mặc định, giá trị này được đặt thành auto, khiến trình duyệt đặt giá trị trục dựa trên font-size. Điều này có nghĩa là trình duyệt sẽ tự động chọn kích thước quang học tốt nhất, nhưng nếu muốn tắt tính năng này, bạn có thể đặt font-optical-sizing thành none.

Bạn cũng có thể đặt giá trị tuỳ chỉnh cho trục opsz, nếu bạn cố ý muốn kích thước quang học không khớp với kích thước phông chữ. CSS sau đây sẽ khiến văn bản hiển thị ở kích thước lớn, nhưng ở kích thước quang học như thể văn bản được in trong 8pt:

.small-yet-large {
  font-size: 100px;
  font-variation-settings: 'opsz' 8;
}

Sử dụng trục tuỳ chỉnh

Không giống như các trục đã đăng ký, các trục tuỳ chỉnh sẽ không được liên kết với một thuộc tính CSS hiện có, vì vậy, bạn sẽ luôn phải đặt các trục đó thông qua font-variation-settings. Thẻ cho trục tuỳ chỉnh luôn viết hoa để phân biệt với trục đã đăng ký.

Roboto Flex cung cấp một số trục tuỳ chỉnh, trong đó quan trọng nhất là Grade (GRAD). Trục Grade rất thú vị vì nó thay đổi độ đậm của phông chữ mà không thay đổi chiều rộng, vì vậy, các dấu ngắt dòng sẽ không thay đổi. Bằng cách chơi với trục Độ dốc, bạn có thể tránh bị buộc phải điều chỉnh các thay đổi đối với trục Trọng số ảnh hưởng đến chiều rộng tổng thể, sau đó thay đổi trục Chiều rộng ảnh hưởng đến trọng số tổng thể.

Trục Độ đậm của Roboto Flex được thay đổi từ tối thiểu thành tối đa.

GRAD là một trục tuỳ chỉnh, có phạm vi từ -200 đến 150 trong Roboto Flex. Chúng ta cần giải quyết vấn đề này bằng font-variation-settings:

.grade-light {
    font-variation-settings: `GRAD` -200;
}

.grade-normal {
    font-variation-settings: `GRAD` 0;
}

.grade-heavy {
    font-variation-settings: `GRAD` 150;
}

Phông chữ biến đổi trên Google Fonts

Google Fonts đã mở rộng danh mục của mình bằng phông chữ biến và thường xuyên thêm các phông chữ mới. Giao diện hiện đang nhắm đến việc chọn các thực thể đơn lẻ từ phông chữ: bạn chọn biến thể bạn muốn, nhấp vào "Chọn kiểu này" và biến thể đó sẽ được thêm vào phần tử <link> để tìm nạp CSS và phông chữ từ Google Fonts.

Để sử dụng tất cả các trục hoặc dải giá trị có sẵn, bạn sẽ phải tự tạo URL đến API Phông chữ Google. Phần tổng quan về phông chữ biến liệt kê tất cả các trục và giá trị.

Công cụ Đường liên kết đến phông chữ biến đổi của Google cũng có thể cung cấp cho bạn các URL mới nhất cho toàn bộ phông chữ biến đổi.

Kế thừa chế độ cài đặt biến thể phông chữ

Mặc dù tất cả các trục đã đăng ký sẽ sớm được hỗ trợ thông qua các thuộc tính CSS hiện có, nhưng hiện tại, bạn có thể cần dựa vào font-variation-settings làm phương án dự phòng. Và nếu phông chữ của bạn có trục tuỳ chỉnh, bạn cũng sẽ cần font-variation-settings.

Tuy nhiên, có một điểm cần lưu ý về font-variation-settings. Mọi thuộc tính mà bạn không đặt rõ ràng sẽ tự động được đặt lại về giá trị mặc định. Các giá trị đã đặt trước đó không được kế thừa! Điều này có nghĩa là các tính năng sau sẽ không hoạt động như mong đợi:

<span class="slanted grade-light">
    I should be slanted and have a light grade
</span>

Trước tiên, trình duyệt sẽ áp dụng font-variation-settings: 'slnt' 10 từ lớp .slanted. Sau đó, lớp này sẽ áp dụng font-variation-settings: 'GRAD' -200 từ lớp .grade-light. Tuy nhiên, thao tác này sẽ đặt lại slnt về giá trị mặc định là 0! Kết quả sẽ là văn bản có độ đậm nhạt, nhưng không bị nghiêng.

May mắn là chúng ta có thể giải quyết vấn đề này bằng cách sử dụng biến CSS:

/* Set the default values */
:root {
    --slnt: 0;
    --GRAD: 0;
}

/* Change value for these elements and their children */
.slanted {
    --slnt: 10;
}

.grade-light {
    --grad: -200;
}

.grade-normal {
    --grad: 0;
}

.grade-heavy {
    --grad: 150;
}

/* Apply whatever value is kept in the CSS variables */
.slanted,
.grade-light,
.grade-normal,
.grade-heavy {
    font-variation-settings: 'slnt' var(--slnt), 'GRAD' var(--GRAD);
}

Các biến CSS sẽ được chuyển tiếp, vì vậy, nếu một phần tử (hoặc một trong các phần tử mẹ) đã đặt slnt thành 10, thì phần tử đó sẽ giữ nguyên giá trị đó, ngay cả khi bạn đặt GRAD thành một giá trị khác. Hãy xem phần Khắc phục lỗi kế thừa phông chữ biến để biết nội dung giải thích chuyên sâu về kỹ thuật này.

Xin lưu ý rằng việc tạo ảnh động cho các biến CSS sẽ không hoạt động (theo thiết kế), vì vậy, các mã như sau sẽ không hoạt động:

@keyframes width-animation {
   from { --wdth: 25; }
   to   { --wdth: 151; }
}

Các ảnh động này sẽ phải diễn ra trực tiếp trên font-variation-settings.

Tăng hiệu suất

Phông chữ biến đổi OpenType cho phép chúng ta lưu trữ nhiều biến thể của một bộ phông chữ vào một tệp phông chữ duy nhất. Monotype đã tiến hành một thử nghiệm bằng cách kết hợp 12 phông chữ đầu vào để tạo ra 8 độ đậm, trên 3 chiều rộng, trên cả kiểu Italic và Roman. Việc lưu trữ 48 phông chữ riêng lẻ trong một tệp phông chữ biến đổi có nghĩa là kích thước tệp giảm 88%.

Tuy nhiên, nếu đang sử dụng một phông chữ duy nhất như Roboto Regular và không có phông chữ nào khác, bạn có thể không thấy sự gia tăng về kích thước phông chữ nếu chuyển sang phông chữ biến thiên có nhiều trục. Như mọi khi, điều này phụ thuộc vào trường hợp sử dụng của bạn.

Mặt khác, việc tạo ảnh động cho phông chữ giữa các chế độ cài đặt có thể gây ra vấn đề về hiệu suất. Mặc dù vấn đề này sẽ được cải thiện sau khi tính năng hỗ trợ phông chữ biến thiên trong trình duyệt trở nên hoàn thiện hơn, nhưng bạn có thể giảm bớt vấn đề bằng cách chỉ tạo ảnh động cho các phông chữ hiện có trên màn hình. Đoạn mã tiện dụng này của Dinamo tạm dừng ảnh động trong các phần tử có lớp vf-animation khi các phần tử đó không xuất hiện trên màn hình:

var observer = new IntersectionObserver(function(entries, observer) {
  entries.forEach(function(entry) {
    // Pause/Play the animation
    if (entry.isIntersecting) entry.target.style.animationPlayState = "running"
    else entry.target.style.animationPlayState = "paused"
  });
});

var variableTexts = document.querySelectorAll(".vf-animation");
variableTexts.forEach(function(el) { observer.observe(el); });

Nếu phông chữ của bạn phản hồi hoạt động tương tác của người dùng, bạn nên hạn chế hoặc làm giảm độ trễ các sự kiện đầu vào. Điều này sẽ ngăn trình duyệt hiển thị các thực thể của phông chữ biến đổi thay đổi rất ít so với thực thể trước đó mà mắt người không thấy được sự khác biệt.

Nếu đang sử dụng Google Fonts, bạn nên kết nối trước với https://fonts.gstatic.com, miền lưu trữ phông chữ của Google. Điều này sẽ đảm bảo trình duyệt sớm biết nơi lấy phông chữ khi gặp phông chữ trong CSS:

<link rel="preconnect" href="https://fonts.gstatic.com" />

Mẹo này cũng áp dụng cho các CDN khác: bạn càng cho phép trình duyệt thiết lập kết nối mạng sớm thì trình duyệt càng có thể tải phông chữ xuống sớm.

Hãy xem thêm các mẹo về hiệu suất để tải Google Fonts trong bài viết Google Fonts nhanh nhất.

Phương án dự phòng và hỗ trợ trình duyệt

Tất cả trình duyệt hiện đại đều hỗ trợ phông chữ biến. Trong trường hợp cần hỗ trợ các trình duyệt cũ, bạn có thể chọn tạo trang web bằng phông chữ tĩnh và sử dụng phông chữ biến thể làm tính năng nâng cao dần:

/* Set up Roboto for old browsers, only regular + bold */
@supports not (font-variation-settings: normal) {
  @font-face {
    font-family: Roboto;
    src: url('Roboto-Regular.woff2');
    font-weight: normal;
  }

  @font-face {
    font-family: Roboto;
    src: url('Roboto-Bold.woff2');
    font-weight: bold;
  }

  body {
    font-family: Roboto;
  }

  .super-bold {
    font-weight: bold;
  }
}

/* Set up Roboto for modern browsers, all weights */
@supports (font-variation-settings: normal) {
  @font-face {
    font-family: 'Roboto';
    src: url('RobotoFlex-VF.woff2') format('woff2 supports variations'),
         url('RobotoFlex-VF.woff2') format('woff2-variations');
    font-weight: 100 1000;
    font-stretch: 25% 151%;
  }

  .super-bold {
    font-weight: 1000;
  }
}

Đối với các trình duyệt cũ, văn bản có lớp .super-bold sẽ được hiển thị ở dạng chữ đậm thông thường, vì đó là phông chữ đậm duy nhất mà chúng tôi có. Khi phông chữ biến được hỗ trợ, chúng ta thực sự có thể sử dụng độ đậm nhất là 1000.

Internet Explorer không hỗ trợ quy tắc @supports, vì vậy, trình duyệt này sẽ không hiển thị bất kỳ kiểu nào. Nếu gặp vấn đề này, bạn có thể sử dụng một trong các mã độc cũ để nhắm đến các trình duyệt cũ có liên quan.

Nếu bạn đang sử dụng API Phông chữ Google, API này sẽ giúp tải các phông chữ phù hợp cho trình duyệt của khách truy cập. Giả sử bạn yêu cầu phông chữ Oswald trong phạm vi độ đậm từ 200 đến 700, như sau:

<link href="https://fonts.googleapis.com/css2?family=Oswald:wght@200..700&display=swap" rel="stylesheet">

Các trình duyệt hiện đại có thể xử lý phông chữ biến sẽ nhận được phông chữ biến và có mọi độ đậm từ 200 đến 700. Các trình duyệt cũ sẽ được phân phát phông chữ tĩnh riêng lẻ cho mỗi độ đậm. Trong trường hợp này, tức là người dùng sẽ tải 6 tệp phông chữ xuống: một tệp cho độ đậm 200, một tệp cho độ đậm 300, v.v.

Cảm ơn bạn!

Bài viết này chỉ có thể được thực hiện với sự trợ giúp của những người sau:

Hình ảnh chính của Bruno Martins trên Unsplash.