Thêm nhiều tuỳ chọn phông chữ có thể thay đổi cho phông chữ giao diện người dùng hệ thống của macOS trong Chromium 83

Catalina mang phông chữ hệ thống có thể thay đổi thống nhất mới cho macOS.

Dominik Röttsch (Nhà nước Dominik)
Dominik Röttsch

Phần "system-ui" của thông số kỹ thuật Mô-đun phông chữ CSS cấp 4 xác định từ khoá phông chữ system-ui cho phép nhà phát triển sử dụng phông chữ hệ điều hành mặc định tích hợp sẵn, được tối ưu hoá cho turbo, được bản địa hoá, chất lượng cao, không cần tải xuống, ngay trong trang web và ứng dụng của họ.

body {
  font-family: system-ui;
}

Lựa chọn kiểu chữ này gần giống với cách nói "sử dụng phông chữ hệ thống mặc định cho ngôn ngữ hiện tại của người dùng này".

Trên macOS, phông chữ system-ui là San Francisco, phông chữ mà nhóm thiết kế đã xem xét kỹ lưỡng, thử nghiệm và... gần đây đã nâng cấp! Trước tiên, chúng ta sẽ tìm hiểu về các tính năng mới thú vị về phông chữ trong Catalina. Sau đó, chúng ta sẽ tìm hiểu một số lỗi và cách các kỹ sư Chromium giải quyết các lỗi đó.

Bài đăng này giả định rằng bạn đã quen thuộc với phông chữ biến đổi. Nếu chưa, hãy xem bài viết Giới thiệu về các phông chữ có thể thay đổi trên web và video bên dưới.

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

Tại thời điểm viết bài, system-ui được hỗ trợ trên Chromium (kể từ phiên bản 56), Edge (kể từ phiên bản 79), Safari (kể từ phiên bản 11) và từ Firefox (kể từ phiên bản 43) nhưng với từ khoá -apple-system. Hãy xem mục Tôi có thể sử dụng phông chữ thay đổi không? để biết thông tin cập nhật.

Sức mạnh mới

Các tính năng mới mà Catalina mang đến cho phông chữ hệ thống hiện có sẵn cho các nhà phát triển web kể từ Chromium 83. Phông chữ system-ui hiện có nhiều chế độ cài đặt khác nhau: kích thước quang học và 2 mức điều chỉnh trọng lượng riêng biệt:

Giày Mojave
h1 {
  font-family: system-ui;
  font-weight: 700;
  font-variation-settings:
    'wght' 750
  ;
}

Catalina
h1 {
  font-family: system-ui;
  font-weight: 700;
  font-variation-settings:
    'wght' 750,
    'opsz' 20,
    'GRAD' 400,
    'YAXS' 400
  ;
}

Trên Mojave, system-ui là một phông chữ có thể thay đổi chỉ có các chế độ cài đặt wght. Trong khi system-ui trên Catalina là một phông chữ biến đổi có các chế độ cài đặt wght, opsz, GRADYAXS.

Có vẻ như tôi đã có một số cơ hội thiết kế nâng cao dần dần! Bạn nên thực sự đào sâu vào sự tinh tế của phông chữ hệ thống nếu muốn.

wght

Chấp nhận độ đậm phông chữ từ 0 đến 900 và được áp dụng đồng đều cho tất cả các ký tự.

/* 0-900 */
font-variation-settings: 'wght' 750;

opsz

Kích thước quang học tương tự như giãn cách hoặc giãn cách chữ, nhưng khoảng cách này là do mắt người thực hiện thay vì bằng toán học. Giá trị 19 hoặc thấp hơn là dành cho khoảng cách giữa văn bản và nội dung, còn 20 trở lên là dành cho khoảng cách tiêu đề và tiêu đề hiển thị.

/* 19 or 20 */
font-variation-settings: 'opsz' 20;

GRAD

Tương tự như trọng lượng, nhưng không chạm vào khoảng cách theo chiều ngang. Phương thức này chấp nhận các giá trị từ 400 đến 1000.

/* 400-1000 */
font-variation-settings: 'GRAD' 500;

YAXS

Kéo giãn ký tự theo chiều dọc. Phương thức này chấp nhận các giá trị từ 400 đến 1000.

/* 400-1000 */
font-variation-settings: 'YAXS' 500;

Kết hợp các lựa chọn

Với một vài dòng CSS, chúng ta có thể chỉnh sửa các cài đặt phông chữ thành chữ in đậm theo lựa chọn của chúng tôi hoặc thử những cách kết hợp thú vị khác:

font-weight: 700;
font-weight: bold;
font-variation-settings: 'wght' 750, 'YAXS' 600, 'GRAD' 500, 'opsz' 20;

Như vậy, người dùng Chromium trên macOS sẽ thấy trọng lượng 750 tuỳ chỉnh đã nâng cấp của bạn cùng một số tính năng thú vị khác 👍

Sân chơi

Nhấp vào Remix để chỉnh sửa trong hiệu ứng Nhiễu bên dưới để tải bản sao có thể chỉnh sửa của Nhiễu sọc, sau đó chỉnh sửa các tuỳ chọn font-variation-settings mới để xem ảnh hưởng của hiệu ứng này đến phông chữ của bạn. Hãy nhớ rằng Nhiễu này sẽ chỉ hoạt động nếu bạn đang sử dụng thiết bị macOS Catalina.

macOS 10.15 đã thêm các tính năng mới vào phông chữ hệ thống của mình, và trong macOS 10.15, một lỗi system-ui phức tạp đã được ghi lại trong trình theo dõi lỗi Chromium. Không biết chúng có liên quan với nhau không!?

Phụ lục: Hồi quy system-ui

Câu chuyện này bắt đầu bằng một lỗi khác: #1005969. Vấn đề này được báo cáo dựa trên macOS 10.15 vì khoảng cách phông chữ system-ui trông hẹp và bị nhồi nhét.

So sánh hai đoạn văn từ một trang nhóm trên Facebook. Bên trái là Chrome, bên phải là Safari, còn Chrome tinh tế nhưng hơi hẹp hơn một chút
Chrome ở bên trái (theo dõi chặt chẽ hơn), Safari ở bên phải (khoảng cách quang học tốt hơn)

Thông tin khái quát

Bạn có bao giờ thấy trên macOS 10.14 cách các đoạn văn hoặc tiêu đề của bạn "bám" với một phông chữ trông khác khi tăng hoặc giảm kích thước không?

Trên Mojave (macOS 10.14), phông chữ system-ui chuyển đổi giữa hai phông chữ tùy thuộc vào kích thước phông chữ mục tiêu. Khi văn bản dưới 20px, macOS sử dụng "Văn bản San Francisco". Khi văn bản có kích thước từ 20px trở lên, macOS sử dụng "Màn hình San Francisco". Kích thước quang học được đặt cố định thành hai phông chữ riêng biệt.

Catalina (macOS 10.15) đã cung cấp phông chữ biến đổi hợp nhất mới cho San Francisco. Bạn không còn phải quản lý "Văn bản" và "Hiển thị" nữa. Biến thể này cũng đã nhận được chế độ cài đặt biến thể mới opsz mà chúng tôi mô tả trước đó.

h1 {
  font-variation-settings: 'opsz' 20;
}

Thật không may, giá trị opsz mặc định trong phông chữ Catalina mới là 20 và các kỹ sư Chromium chưa sẵn sàng áp dụng opsz cho phông chữ hệ thống. Điều này dẫn đến việc các kích thước nhỏ hơn hiển thị quá hẹp.

Để khắc phục vấn đề này, Chromium cần áp dụng đúng opsz cho phông chữ hệ thống. Điều này đã dẫn đến việc khắc phục Vấn đề #1005969. Chiến thắng! Hay là...?

Chưa xong

Đây là vấn đề phức tạp: Chromium đã áp dụng opsz nhưng có gì đó chưa ổn. Phông chữ hệ thống trên máy Mac có thêm một bảng phông chữ tên là trak, giúp điều chỉnh khoảng cách theo chiều ngang. Trong quá trình tìm cách khắc phục, các kỹ sư Chromium nhận thấy rằng trên macOS, khi truy xuất các chỉ số ngang từ một đối tượng CTFontRef, các chỉ số trak đã được đưa vào kết quả chỉ số. Thư viện tạo hình của Chromium HarfBuzz cần có các chỉ số trong đó giá trị trak chưa được đưa vào.

Hiển thị giao diện người dùng hệ thống, tất cả kiểu chữ và độ đậm phông chữ trong một danh sách. Một nửa trong số đó không áp dụng mức chênh lệch về trọng lượng.
Trái: Trọng số in đậm được áp dụng cho cỡ chữ từ 19 trở xuống. Bên phải: Kích thước phông chữ từ 20 trở lên sẽ mất kiểu in đậm

Trong nội bộ, Skia (thư viện đồ hoạ, không phải kiểu chữ của cùng tên) sử dụng cả lớp CGFontRef của CoreGraphics và lớp CTFontRef trong CoreText. Do cần phải chuyển đổi nội bộ giữa các đối tượng đó (dùng để duy trì khả năng tương thích ngược và truy cập vào các API cần thiết trên cả hai lớp), Skia sẽ giảm được trọng số thông tin trong một số trường hợp nhất định và phông chữ đậm sẽ ngừng hoạt động. Thông tin này đã được theo dõi trong Vấn đề #1057654.

Skia vẫn cần hỗ trợ macOS 10.11 vì Chromium vẫn hỗ trợ. Vào ngày 10.11, phông chữ "Văn bản San Francisco" và "Hiển thị San Francisco" thậm chí không còn là các phông chữ biến đổi. Thay vào đó, mỗi phông chữ là một bộ phông chữ riêng cho từng độ đậm có sẵn. Tại một số thời điểm, mã nhận dạng ký tự của họ không đồng bộ với nhau. Vì vậy, nếu Skia đã tạo hình dạng văn bản (chuyển đổi văn bản thành ký tự có thể vẽ được) bằng "Văn bản San Francisco", thì văn bản đó sẽ bị vô nghĩa nếu được vẽ bằng "Hiển thị San Francisco" và ngược lại. Ngay cả khi Skia chỉ yêu cầu kích thước khác, macOS có thể chuyển sang kích thước khác. Có thể luôn sử dụng một trong các phông chữ và chỉ điều chỉnh tỷ lệ (sử dụng ma trận để tăng tỷ lệ thay vì yêu cầu kích thước lớn hơn). Tuy nhiên, CoreText có một vấn đề là không điều chỉnh được sbix (biểu tượng cảm xúc màu) glyphs lên (chỉ giảm). Cách này phức tạp hơn một chút. Thực ra, CoreText có vẻ như giới hạn phạm vi theo chiều dọc sau khi áp dụng ma trận, vì điều này có vẻ như liên quan đến việc không thể vẽ biểu tượng cảm xúc ở góc 45 độ. Trong mọi trường hợp, nếu muốn biểu tượng cảm xúc của mình xuất hiện to, bạn cần tạo một bản sao phông chữ để có phiên bản lớn hơn.

Vì vậy, để tạo bản sao của các đối tượng CTFont có kích thước khác nhau trong nội bộ mà vẫn đảm bảo rằng dữ liệu phông chữ cơ bản được sử dụng, Chromium đã kéo CGFont ra khỏi CTFont, sau đó tạo một CTFont mới từ CGFont (các đối tượng CGFont không phụ thuộc vào kích thước, quá trình chuyển đổi kỳ diệu diễn ra ở cấp CoreText). Điều này hoạt động tốt cho đến ngày 10.154. Vào 10:15, chuyến đi khứ hồi này đã mất quá nhiều thông tin, dẫn đến vấn đề về cân nặng. Flutter nhận thấy vấn đề về trọng lượng và một bản sửa lỗi thay thế cho việc đổi kích thước đã được thực hiện để tạo CTFont mới ngay từ CTFont ban đầu, đồng thời trực tiếp điều khiển kích thước quang học bằng một thuộc tính cũ nhưng không được ghi lại trong CoreText. Điều này giúp mọi thứ hoạt động trên 10.11 và khắc phục các vấn đề khác (như đặt kích thước quang học thành giá trị mặc định một cách rõ ràng).

Tuy nhiên, cách này giúp giữ lại nhiều "ma thuật" CoreText trong phông chữ. Một trong những cách này có vẻ như vẫn điều chỉnh các tiến bộ về ký tự theo một cách nào đó ngoài bảng trak (ứng dụng mà Chromium đã cố gắng loại bỏ thông qua một thuộc tính không được ghi nhận khác).

CGFont không thực hiện bất kỳ 'phép màu' nào trong số này vì vậy có lẽ Chromium có thể loại bỏ CGFont khỏi CTFont và chỉ sử dụng nó để nâng cao? Rất tiếc, cách này không hiệu quả vì CoreText cũng kết hợp phông chữ theo những cách khác. Ví dụ: sẽ làm cho các biểu tượng cảm xúc nhỏ lớn hơn một chút so với yêu cầu thực tế của bạn (tăng kích thước một chút). CGFont không biết về điều này, vì vậy bạn sẽ để các biểu tượng cảm xúc dựa trên sbix của mình ở quá gần nhau vì bạn đo bằng một kích thước nhưng CoreText sẽ vẽ các biểu tượng này lớn hơn một chút. Chromium muốn CTFont tiến bộ, nhưng nó muốn chúng mà không cần theo dõi và tốt nhất là không cần bất kỳ sự can thiệp nào khác.

Vì để khắc phục vấn đề về dấu cách cần đến một tập hợp các bản sửa lỗi Blink và Skia kết nối với nhau, các kỹ sư của Chromium không thể "hoàn nguyên" để khắc phục vấn đề này. Các kỹ sư Chromium cũng đã thử sử dụng một cờ bản dựng khác để thay đổi đường dẫn mã liên quan đến phông chữ trong Skia. Thao tác này đã khắc phục sự cố phông chữ đậm nhưng đã hồi quy vấn đề về dấu cách.

Cách khắc phục

Cuối cùng, tất nhiên Chromium muốn khắc phục cả hai vấn đề. Chromium hiện sử dụng các hàm chỉ số phông chữ OpenType phông chữ tích hợp của Harf Buzz để truy xuất các chỉ số ngang trực tiếp qua dữ liệu nhị phân trong bảng phông chữ của hệ thống. Sử dụng tính năng này, Chromium sẽ thay đổi CoreText và Skia khi phông chữ có bảng trak (trừ phi đó là phông chữ của biểu tượng cảm xúc).

Hiển thị giao diện người dùng hệ thống, tất cả kiểu chữ và độ đậm phông chữ trong một danh sách. Một nửa thời gian trước đây không hoạt động giờ đây trông rất ổn.

Trong thời gian chờ đợi, vẫn còn Vấn đề #10123 của Skia cần theo dõi việc khắc phục vấn đề này hoàn toàn trong Skia. Sau đó, hãy quay lại sử dụng Skia để truy xuất các chỉ số phông chữ hệ thống từ đó, thay vì bản sửa lỗi hiện tại được khắc phục vào HarfBuzz.