Cách làm header trong HTML
Bọc phần đầu trang (logo, tên trang web, menu chính) trong phần tử <header>. Đây là một khối block không có giao diện mặc định, nên vài dòng CSS sẽ biến nó thành một thanh ngang:
margin-inline-end: auto trên logo đẩy menu và nút bấm về đầu bên kia của thanh. Bỏ phần tử <style> đi bạn vẫn có một header: chính thẻ đó tạo nên header, không phải nền tối.
header, head và h1
Ba cái tên nghe giống nhau nhưng làm những việc khác nhau:
| Phần tử | Nằm ở đâu | Hiển thị | Số lượng |
|---|---|---|---|
<head> | Ngay trong <html>, trước <body> | Không: chứa <title>, <meta>, <link> | Đúng một |
<header> | Bên trong <body> | Có: nội dung mở đầu của trang hoặc một phần | Bao nhiêu cũng được |
<h1> đến <h6> | Bất kỳ đâu trong <body> | Có: một tiêu đề | Bao nhiêu cũng được |
<head> bên dưới đặt tiêu đề trang mà trình duyệt hiện trên tab. Mọi thứ bạn thấy trong bản xem trước đều đến từ <body>:
Header thường chứa một thẻ tiêu đề, nhưng không bắt buộc, và một thẻ tiêu đề cũng không cần header bọc quanh.
Header bên trong bài viết
<header> mở đầu cho article hoặc section gần nhất chứa nó, không chỉ cho cả trang. Một danh sách bài blog mà mỗi bài có header riêng là hợp lệ và rất phổ biến:
Với trình đọc màn hình, chỉ header cấp trang (không nằm trong article, aside, main, nav hay section) mới trở thành landmark banner. Các header trong bài viết chỉ là nhóm bình thường, nên trang không bị có nhiều banner.
Sticky header
position: sticky giữ header ở trên cùng trong khi nội dung bên dưới cuộn. Cuộn bên trong khung dưới đây:
Có ba chi tiết giúp nó hoạt động: top: 0 (sticky không làm gì nếu thiếu khoảng lệch), một màu nền (nếu không các hàng sẽ hiện xuyên qua), và z-index để nội dung được định vị không vẽ đè lên nó. Trên trang thật, khung cuộn chính là trang, nên header nằm ngay trong <body>.
Header có position: fixed cũng đứng yên, nhưng nó rời khỏi luồng của trang, nên nội dung trượt xuống bên dưới và cần thêm padding ở trên. Sticky vẫn giữ chỗ của nó trong bố cục.
Header có thể chứa gì
Header có thể chứa gần như mọi nội dung: thẻ tiêu đề, ảnh logo, <nav>, form tìm kiếm, nút bấm. Nó không được chứa một <header> khác hay <footer>, và không được nằm bên trong <footer>, <address> hay một <header> khác.
<header>
<a href="/"><img src="logo.svg" alt="Acme home"></a>
<nav aria-label="Main">...</nav>
<form role="search">...</form>
</header>
Khi logo là liên kết về trang chủ, văn bản alt của nó nên nói liên kết dẫn tới đâu ("Acme home"), vì đó là những gì trình đọc màn hình đọc ra.
Lỗi thường gặp
- Nhầm
<header>với<head>. Metadata nằm trong<head>; nội dung hiển thị thì không bao giờ. - Dùng
<header>cho mọi thẻ tiêu đề. Một thẻ tiêu đề đứng riêng không cần header bọc ngoài. Dùng<header>khi có một nhóm nội dung mở đầu. - Sticky header không có nền. Chữ trên trang cuộn lộ rõ xuyên qua nó. Hãy đặt
background. - Sticky mà không dính. Một phần tử tổ tiên có
overflow: hiddenhoặcoverflow: autotrở thành khung cuộn của sticky, nên header chỉ dính trong khung đó (hoặc không dính chút nào). Hãy kiểm tra các phần tử tổ tiên. - Đặt menu của trang web trong một
<div>bên trong header. Hãy dùng<nav>để người dùng trình đọc màn hình có thể nhảy tới đó.
Câu hỏi thường gặp
Thẻ header trong HTML là gì?
<header> là một phần tử ngữ nghĩa dành cho nội dung mở đầu: logo và menu của trang web ở đầu trang, hoặc tiêu đề và dòng tác giả ở đầu một bài viết. Đây là một khối block bình thường, không có định dạng mặc định.
head và header trong HTML khác nhau thế nào?
<head> là phần không hiển thị của tài liệu, chứa <title>, các thẻ <meta> và liên kết tới stylesheet, và mỗi trang có đúng một. <header> là nội dung hiển thị bên trong <body>, và một trang có thể có nhiều header.
Một trang có thể có nhiều phần tử header không?
Có. Một trang thường có một header của trang web, và mỗi <article> hoặc <section> có thể có <header> riêng cho tiêu đề và thông tin đi kèm. Chỉ header không nằm trong article, aside, main, nav hay section mới được trình đọc màn hình coi là banner của trang.
Có nên đặt nav bên trong header không?
Có thể, và thường là vậy khi menu chính nằm ở đầu trang. Đặt <nav> bên ngoài <header> cũng hợp lệ; hãy chọn cách hợp với bố cục của bạn.
Làm sao để header luôn ở trên cùng khi cuộn trang?
Cho header position: sticky; top: 0; cùng một màu nền và z-index, để nội dung cuộn bên dưới nó. Sticky chỉ hoạt động khi phần tử cha cao hơn header, và một phần tử tổ tiên có overflow: hidden sẽ khiến header không dính vào trang.