Menu

Header trong HTML: thẻ header, ví dụ và sticky header

Phần tử <header> chứa phần mở đầu của một trang hoặc một phần: logo, tiêu đề, menu điều hướng, dòng tác giả. Tìm hiểu cách dựng header cho trang web, <header> khác gì <head> và thẻ tiêu đề, cách dùng header trong bài viết và cách làm header dính trên đầu trang.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

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 ở đâuHiể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ầnBao 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.

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: hidden hoặc overflow: auto trở 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.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu