3 điểm bởi GN⁺ 2025-04-11 | 1 bình luận | Chia sẻ qua WhatsApp
  • Các trình duyệt lớn đang triển khai bản cập nhật thay đổi kiểu mặc định (UA style) của thẻ <h1>
  • Đặc biệt ảnh hưởng tới <h1> được dùng bên trong các section, article, nav, aside lồng nhau
  • Nhà phát triển cần lưu ý vì thay đổi này có thể gây ra biến đổi kiểu hiển thị ngoài dự kiến trên website hoặc cảnh báo từ Lighthouse

Điểm thay đổi là gì

  • Trong đặc tả HTML từng có một quy tắc gọi là “outline algorithm”, khiến <h1> được xử lý để nhìn giống <h2>, <h3> tùy theo số lượng phần tử sectioning lồng nhau
  • Ví dụ, section > h1 được render như <h2>, còn section > section > h1 được render như <h3>
  • Điều này không được phản ánh trong accessibility tree thực tế, và còn bị các công cụ diễn giải khác nhau nên gây ra nhầm lẫn
  • Cuối cùng thuật toán này đã bị loại khỏi đặc tả HTML vào năm 2022, và giờ các trình duyệt cũng đang loại bỏ UA style liên quan

Ví dụ UA style của trình duyệt trước đây

  • x h1 { font-size: 1.50em }
  • x x h1 { font-size: 1.17em }
  • x x x h1 { font-size: 1.00em }
  • x x x x h1 { font-size: 0.83em }
  • x x x x x h1 { font-size: 0.67em }

Ví dụ cấu trúc HTML

<body>  
  <h1>Level 1</h1>  
  <section>  
    <h1>Level 2</h1>  
    <section>  
      <h1>Level 3</h1>  
      <section>  
        <h1>Level 4</h1>  
      </section>  
    </section>  
  </section>  
</body>  

Những thay đổi có thể kỳ vọng và thời điểm áp dụng

  • <h1> giờ sẽ không tự động đổi kiểu chỉ vì nằm bên trong các phần tử section lồng nhau
  • UA style sẽ áp dụng cùng một kiểu cho mọi <h1>
  • Lighthouse sẽ hiển thị cảnh báo nếu <h1> không được định nghĩa font-size
  • Cảnh báo hiển thị: H1UserAgentFontSizeInSection

Firefox

  • Từ ngày 31/3/2025, Firefox Beta 138 bắt đầu triển khai thay đổi kiểu cho 50% người dùng desktop
  • Firefox Stable 138 sẽ triển khai cho 5% trước, sau đó rollout toàn bộ đến phiên bản 140
  • Từ Firefox 136 trở lên, nếu font-size hoặc margin chưa được định nghĩa thì sẽ có cảnh báo trong console
  • Cách đổi thiết lập: trong about:config, đặt layout.css.h1-in-section-ua-styles.enabled thành false

Chrome

  • Từ Chrome 136, nếu <h1> đang dùng kiểu mặc định bị thu nhỏ thì sẽ xuất hiện cảnh báo
  • Điều này có thể ảnh hưởng tới điểm “Best Practices” của Lighthouse

Safari

  • Hiện chưa có cập nhật cụ thể hay bug tracking rõ ràng, nhưng WebKit cũng được kỳ vọng sẽ có cập nhật tương tự

Cách sửa cảnh báo Lighthouse

  • Lighthouse hiển thị cảnh báo khi <h1> không có font-size, dựa trên cảnh báo của Chromium DevTools
  • Để tránh điều này, cần chỉ định style cho <h1> một cách tường minh

Ví dụ style

h1 {  
  margin-block: 0.67em;  
  font-size: 2em;  
}  
  • Để tránh specificity (độ ưu tiên), hãy dùng :where()
:where(h1) {  
  margin-block: 0.67em;  
  font-size: 2em;  
}  

Checklist tóm tắt

  • Không phụ thuộc vào kiểu mặc định của trình duyệt
  • Dùng <h2>, <h3>... phù hợp để biểu đạt phân cấp một cách tường minh
  • Chỉ định rõ font-sizemargin cho mọi <h1>
  • Cập nhật CSS reset để phản ánh thay đổi này
  • Kiểm tra cảnh báo bằng Lighthouse và DevTools
  • Tham khảo tài liệu liên quan trên MDN để cập nhật nội dung mới nhất

Tài liệu liên quan

1 bình luận

 
GN⁺ 2025-04-11
Ý kiến trên Hacker News
  • Trên bản ổn định của Firefox 138, thay đổi này sẽ được triển khai cho 5% người dùng và có kế hoạch mở rộng lên 50%

    • Có ý kiến cho rằng việc trình duyệt hoạt động khác với môi trường của lập trình viên web sẽ khiến việc kiểm thử trở nên khó khăn
    • Có ý kiến cho rằng có vẻ như họ tham khảo cách triển khai của Facebook, nhưng Firefox không phải phần mềm phía máy chủ nên cách này không phù hợp
  • Bối cảnh lịch sử của thuật toán outline được W3C chấp nhận khá thú vị

    • Trình duyệt và trình đọc màn hình đã từ chối áp dụng vì sự mơ hồ với nội dung web hiện có và các vấn đề bảo trì
    • Sau 8 năm, WHATWG cuối cùng đã từ bỏ nó
  • Có ý kiến thắc mắc từ khi nào hành vi của H1 được đưa vào đặc tả

    • Có ý kiến nói rằng đã viết HTML từ năm 1995 nhưng chưa từng nghe về chuyện này
    • Có ý kiến cho rằng nên loại bỏ nó vì dễ gây nhầm lẫn
  • Có ý kiến nói rằng chưa từng suy nghĩ sâu về hành vi của các phần tử section (<section>, <aside>, <nav>, <article>) và thẻ <h1>

  • Có ý kiến tiếc rằng thuật toán outline đã không thành công

    • Có ý kiến cho rằng cần có khả năng ghép nội dung từ nhiều nguồn khác nhau một cách tùy ý
    • Có ý kiến cho rằng nên có thể viết một mảnh <h1> và gán cho nó ý nghĩa là "tiêu đề cấp cao nhất trong ngữ cảnh của tôi", thay vì theo ngữ cảnh toàn cục của tài liệu
  • Có ý kiến cho rằng thẻ <h1> phải luôn là <h1> bất kể vị trí ở đâu

    • Mặc định không nên bị thay đổi, và điều này có thể giải quyết các vấn đề trợ năng của trình đọc màn hình
  • Có ý kiến cho rằng chính sự phức tạp này khiến nhiều nhà thiết kế dùng <div> cho mọi thứ

    • Nếu dùng thuộc tính role thì vẫn có thể đảm bảo khả năng truy cập
  • Có ý kiến cho rằng phần tiêu đề trong HTML hơi ngớ ngẩn

    • Có ý kiến cho rằng việc phân chia các phần của một cuốn sách bằng thẻ <section> là cách biểu đạt tốt hơn
    • Có ý kiến cho rằng h1 và h2 tạo ra các thẻ tường minh và cấu trúc phân cấp khác với những phần còn lại của HTML
    • Có một câu đùa rằng nếu có thể quay về quá khứ thì sẽ muốn nhờ Tim Berners-Lee sửa vấn đề này