Dấu ba chấm cho biết một dòng bị cắt, nhưng không nói phần còn lại có quan trọng hay không. Đổi marker thành “xem thêm” nghe rõ hơn, đồng thời dễ tạo ra một lời hứa sai: người đọc tưởng có thể bấm, trong khi đó vẫn chỉ là phần vẽ của CSS.

Chrome 157 Beta bổ sung chuỗi tùy chỉnh cho text-overflow. Một fixture tiếng Việt đã được chạy trên Chrome 155 Stable và Chrome for Testing 157.0.8103.6 để kiểm parser, fallback, nội dung copy, cây accessibility và nút mở rộng thật. Kết quả là cú pháp mới có ích cho tín hiệu thị giác, nhưng chưa thay được control tương tác; riêng cú pháp hai giá trị còn chưa được build 157 này nhận.

Chrome 157 thêm gì vào text-overflow?

Theo release notes Chrome 157, milestone này đang ở Beta ngày 19/10/2026 và dự kiến lên Stable ngày 03/11/2026. Thay đổi liên quan khá gọn: ngoài clip và ellipsis, text-overflow có thể nhận một chuỗi như " … xem thêm".

Chuỗi đó chỉ xuất hiện khi nội dung thực sự tràn theo chiều inline. MDN lưu ý text-overflow không tự tạo overflow; component vẫn cần giới hạn kích thước, thường đi cùng overflow: hidden và white-space: nowrap. Nó cũng không phải giải pháp cắt nhiều dòng như line-clamp.

.label {
  overflow: hidden;
  white-space: nowrap;

  /* Fallback cho browser chưa hiểu <string> */
  text-overflow: ellipsis;

  /* Chrome 157 Beta nhận declaration này */
  text-overflow: " … xem thêm";
}

Thứ tự hai declaration là phần quan trọng. Browser cũ bỏ giá trị không hiểu và giữ ellipsis; browser hỗ trợ sẽ dùng declaration sau. Đây là progressive enhancement đúng nghĩa, không cần user-agent sniffing.

Fixture đã kiểm những gì?

Fixture dùng Windows 11, Arial/Segoe UI, cùng chuỗi “Báo cáo thiết kế giao diện tháng Mười ✨ 2026” ở ba chiều rộng 160, 240 và 320 CSS px. Mỗi mẫu có cùng padding, border, overflow: hidden và white-space: nowrap; chỉ giá trị text-overflow thay đổi. Chrome 155.0.8059.80 đóng vai trò negative control, còn Chrome for Testing 157.0.8103.6 là positive control.

Fixture Chrome 157 so sánh clip, ellipsis, chuỗi tùy chỉnh và nút mở rộng thật ở ba độ rộng
Chrome 157.0.8103.6 nhận chuỗi tùy chỉnh; ảnh chụp từ fixture thật, không phải mockup hay ảnh AI.
Kiểm traChrome 155 StableChrome 157 Testing
CSS.supports với một chuỗifalsetrue
Computed style của mẫu customellipsis" … xem thêm"
Chuỗi hai giá trị ellipsis " … xem thêm"falsefalse
Text được chọn/copyĐầy đủ DOM textĐầy đủ DOM text
Nút mở rộng bằng EnterMở đúngMở đúng

Cả chín mẫu ở mỗi browser đều thực sự overflow: scrollWidth là 358 px, trong khi vùng nội dung lần lượt là 158, 238 và 318 px. Vì vậy kết quả không phải trường hợp marker không xuất hiện do text vẫn còn đủ chỗ.

Fallback hoạt động, nhưng hỗ trợ chưa đồng đều

Trên Chrome 155, parser từ chối declaration chuỗi nên computed style của cột custom trở về ellipsis. Trên build 157, chuỗi được giữ nguyên và render trong vùng content. Đây là hành vi fallback dễ kiểm soát: component không vỡ, không lộ text ra ngoài và vẫn có tín hiệu bị cắt.

Có một chi tiết nên tránh suy từ tài liệu sang implementation. Cú pháp hiện hành trong CSS Overflow Module Level 4 và ví dụ MDN cho phép một hoặc hai giá trị, trong đó hai giá trị điều khiển hai mép. Tuy nhiên, CSS.supports('text-overflow', 'ellipsis " … xem thêm"') vẫn trả false trên 157.0.8103.6. Bài này vì thế chỉ khuyến nghị cú pháp một chuỗi ở cuối dòng; không tuyên bố LTR/RTL hai mép đã sẵn sàng.

Nếu sản phẩm cần RTL hoặc nội dung cuộn để lộ cả đầu lẫn cuối, hãy giữ test riêng cho browser/channel mục tiêu. Release note nói tính năng <string> được đưa vào milestone, không bảo đảm mọi nhánh syntax mới trong spec đều đã triển khai cùng lúc.

Tiếng Việt bị cắt ở đâu?

Ở 160 px, marker “ … xem thêm” chiếm khá nhiều chỗ, chỉ để lại phần đầu rất ngắn của nhãn. Ở 240 và 320 px, người đọc thấy thêm ngữ cảnh nhưng vẫn mất phần cuối. Chuỗi marker càng dài thì nội dung thật còn lại càng ít; đây là đánh đổi trực tiếp chứ không phải “ellipsis tốt hơn”.

Với tên file, mã giao dịch hay nhãn chỉ khác nhau ở hậu tố, marker dài thậm chí có thể làm quyết định khó hơn. Lúc đó nên thiết kế disclosure khi focus/hover đã kiểm bàn phím, hoặc giữ phần quan trọng bằng cấu trúc dữ liệu khác. Đừng cố chữa một information architecture yếu bằng một câu “xem thêm” trang trí.

Việc chọn toàn bộ mẫu rồi copy trên cả hai browser vẫn trả về nguyên chuỗi DOM, không chèn marker vào clipboard. Đây là kết quả tốt cho thao tác sao chép, nhưng cũng nhắc rằng phần người dùng nhìn thấy và phần ứng dụng lưu giữ là hai lớp khác nhau. Khi font thay đổi, điểm cắt cũng đổi; bài font fallback tiếng Việt với size-adjust giải thích vì sao metric font cần ổn định trước khi so ảnh cắt chữ.

Zoom không làm marker thành giải pháp reflow

Fixture được thu viewport tương đương 200% và 400% để kiểm layout. Ở 700 CSS px, trang reflow về một cột và không có overflow ngang. Ở 350 CSS px, document rộng hơn viewport 22 px vì card 320 px cộng padding và border. Lỗi này thuộc kích thước component của fixture, không phải chuỗi marker, nhưng nó là bằng chứng hữu ích: text-overflow chỉ xử lý phần chữ trong box, không cứu một box có min-width quá lớn.

Nếu component phải chịu zoom cao hoặc màn hình hẹp, cần test container, padding, border và hit target cùng lúc. Marker nhìn gọn ở 100% không chứng minh cả component reflow đạt. Tương tự, CSS text-fit cho tiêu đề tiếng Việt giải quyết bài toán khác: co/fit typography trong vùng có sẵn, không báo phần nội dung bị ẩn.

“Xem thêm” không phải là một nút

Trong cây accessibility của Chrome 157, các mẫu clip, ellipsis và custom đều giữ tên là toàn bộ DOM text. Marker custom không tạo role, accessible name hay trạng thái có thể mở. Fixture này chưa chạy NVDA hoặc VoiceOver, nên không dùng kết quả cây accessibility để tuyên bố mọi screen reader sẽ đọc giống nhau. Điều có thể khẳng định là CSS marker tự nó không cung cấp control tương tác.

Nút “Xem thêm chi tiết” trong positive control thì khác: nó có role button, accessible name, trạng thái aria-expanded và liên kết tới vùng nội dung qua aria-controls. Khi focus rồi nhấn Enter, trạng thái đổi từ false sang true và phần nội dung bổ sung hiện ra. Đây mới là affordance phù hợp khi người dùng thật sự cần đọc tiếp.

Sơ đồ chọn ellipsis, disclosure hoặc nút mở rộng theo mức quan trọng của nội dung
Marker thị giác, cách xem đủ và control mở rộng là ba cấp quyết định khác nhau.

Một marker ghi “xem thêm” nhưng không bấm được còn có thể gây khó chịu hơn dấu ba chấm, vì hình thức gợi một hành động không tồn tại. Nếu dùng chuỗi custom, các từ trung tính như “bị cắt” hoặc một ký hiệu theo design system đôi khi thành thật hơn. Nếu cần action, hãy dùng button/link thật và giữ focus indicator đủ rõ.

Design system nên quyết định theo tác vụ

Không nên đặt một token marker rồi áp lên mọi component. Bảng quyết định dưới đây thực tế hơn:

Loại nội dungCách xử lýLý do
Nhãn phụ, ngữ cảnh đã rõellipsis hoặc chuỗi custom có fallbackChỉ cần báo đã cắt, rủi ro thấp
Tên file, mã, identifier quan trọngDisclosure khi focus/pointer hoặc bố cục giữ phần phân biệtNgười dùng cần xem/copy đủ giá trị
Mô tả hay hướng dẫn cần đọc tiếpNút mở rộng thậtCần role, trạng thái và bàn phím
Nội dung nhiều dòngGiải pháp line clamp hoặc bố cục khác có testtext-overflow không xử lý đáy block

Chuỗi marker cũng là nội dung bản địa hóa. “Xem thêm”, “bị cắt” hay ký hiệu ngắn có độ rộng rất khác giữa locale; vì vậy đừng nhúng một câu dài vào token dùng toàn cầu. Tối thiểu cần kiểm font thật, ba độ rộng đại diện và browser không hỗ trợ trước khi đưa vào component library.

Có nên dùng ngay không?

Có thể dùng theo progressive enhancement cho nhãn một dòng ít rủi ro, với ellipsis đứng trước và chuỗi custom đứng sau. Nhưng ngày 19/10/2026, Chrome 157 vẫn là Beta; bài kiểm này chỉ có Chrome 155 và Chrome for Testing 157 trên Windows, chưa chạy Firefox, Safari hay screen reader thật. Cú pháp hai giá trị cũng chưa qua parser ở build đã test.

Vì vậy, lựa chọn an toàn cho production vẫn là: giữ ellipsis làm baseline, dùng custom string như cải tiến thị giác có điều kiện, và dùng control thật khi tác vụ yêu cầu xem tiếp. Tính năng mới khá thú vị, nhưng marker chỉ nên nói đúng một việc: dòng này đã bị cắt. Phần còn lại là trách nhiệm của thiết kế tương tác.