Thanh điều hướng với nav
Bọc menu trong <nav> và đặt các liên kết trong một danh sách. Flexbox biến danh sách thành một thanh nằm ngang:
list-style: none và padding: 0 bỏ dấu đầu dòng và phần thụt lề. display: block trên mỗi liên kết cho phép padding của nó chiếm chỗ thật trong thanh, nên cả khung có padding đều là vùng nhấp. Xóa dòng display: flex thì cùng menu đó trở thành danh sách dọc, giống một menu ở thanh bên.
Bản thân <nav> không có hình thức gì. Nhiệm vụ của nó là ngữ nghĩa: trình đọc màn hình hiển thị nó như một vùng điều hướng (navigation landmark), nên người dùng có thể nhảy tới menu, hoặc bỏ qua nó, chỉ bằng một phím.
Đánh dấu trang hiện tại
Thêm aria-current="page" vào liên kết của trang đang được hiển thị. Nó cho trình đọc màn hình biết "bạn đang ở đây", và cho CSS một điểm bám để tô sáng liên kết:
Chuyển aria-current="page" sang liên kết khác thì phần tô sáng đi theo. Định dạng dựa trên thuộc tính thay vì class .active giúp hình thức và khả năng tiếp cận luôn đồng bộ: không thể có cái này mà thiếu cái kia.
Nhiều nav trên một trang: nhãn và breadcrumb
Một trang có thể có menu chính, breadcrumb và mục lục, mỗi thứ trong một <nav> riêng. Gán cho mỗi cái một aria-label, để trình đọc màn hình đọc "Breadcrumb navigation" thay vì ba mục "navigation" giống hệt nhau:
Breadcrumb dùng danh sách có thứ tự <ol> vì thứ tự có ý nghĩa. Các dấu gạch chéo đến từ CSS ::before, nên trình đọc màn hình không đọc "slash" giữa từng mục. Mục cuối cùng là trang hiện tại và không phải là liên kết.
Mục lục
Một danh sách liên kết tới các phần của cùng một trang cũng là điều hướng. Các liên kết #id nhảy tới phần tử có id đó; hãy thử chúng trong bản xem trước:
Ở đây nhãn đến từ một tiêu đề hiển thị qua aria-labelledby, cách này tốt hơn aria-label khi tiêu đề đã có sẵn trên màn hình.
Nút bật tắt menu cho di động
Trên màn hình hẹp, menu thường được giấu sau một nút. Hãy dùng một <button> thật với aria-expanded, và giữ các liên kết bên trong <nav>:
aria-expanded cho trình đọc màn hình biết menu đang mở hay đóng, và thuộc tính hidden loại danh sách khỏi cả màn hình lẫn cây khả năng tiếp cận (accessibility tree) khi menu đóng. Trên màn hình rộng, bạn sẽ hiện danh sách bằng media query và ẩn nút đi.
Lỗi thường gặp
- Bọc mọi nhóm liên kết trong
<nav>. Chỉ dùng nó cho menu chính, breadcrumb, phân trang và mục lục. Các liên kết nằm trong đoạn văn không phải là khối điều hướng. - Nút menu làm từ
<div>. Nó không nhận focus và không bấm được bằng bàn phím. Hãy dùng<button>. - Nhiều nav mà không có nhãn. Thêm
aria-labelhoặcaria-labelledbycho từng cái để phân biệt được chúng. - Chỉ tô màu liên kết hiện tại. Thêm
aria-current="page"; màu sắc thôi thì không được đọc lên và có thể không phải ai cũng nhìn thấy. - Liên kết
href="#"trên bản chính thức. Trong bản demo thì ổn, nhưng mục menu thật cần URL thật để còn hoạt động khi mở trong tab mới. Trang liên kết giải thích cách các giá trịhrefhoạt động.
Câu hỏi thường gặp
Thẻ nav trong HTML là gì?
<nav> là một phần tử ngữ nghĩa bao quanh một khối liên kết điều hướng chính, như menu của trang web, mục lục hoặc breadcrumb. Trình đọc màn hình liệt kê nó là một vùng điều hướng (navigation landmark) để người dùng nhảy thẳng tới đó.
Các liên kết trong nav có nên nằm trong danh sách không?
Đó là cách làm phổ biến và tốt: một <ul> gồm các mục <li> giúp trình đọc màn hình đọc được menu có bao nhiêu liên kết. Các liên kết đặt trực tiếp trong <nav> cũng hợp lệ, chẳng hạn với hai hoặc ba liên kết trên một hàng.
Mọi nhóm liên kết đều cần phần tử nav sao?
Không. Chỉ dùng <nav> cho các khối điều hướng chính. Vài liên kết trong một đoạn văn hay một danh sách ngắn các liên kết pháp lý ở chân trang không cần đến nó, và quá nhiều vùng nav khiến từng vùng khó tìm hơn.
Làm sao tạo thanh điều hướng nằm ngang?
Đặt các liên kết trong một <ul> bên trong <nav>, rồi gán cho danh sách display: flex; list-style: none; padding: 0; và một gap. Flexbox sẽ xếp các mục thành một hàng.
Làm sao hiển thị trang hiện tại trên navbar?
Thêm aria-current="page" vào liên kết của trang người dùng đang xem, và định dạng nó bằng selector [aria-current="page"]. Khi đó trình đọc màn hình cũng đọc nó là trang hiện tại.
Một trang có thể có nhiều nav không?
Có, ví dụ một menu chính, một breadcrumb và một mục lục. Gán cho mỗi cái một aria-label khác nhau như "Main" hoặc "Breadcrumb" để người dùng trình đọc màn hình phân biệt được.