Khi xây dựng website, HTML không chỉ đơn thuần là công cụ tạo nên giao diện mà còn giúp định nghĩa cách nội dung được tổ chức và diễn giải. Semantic HTML ra đời với mục tiêu sử dụng các thẻ có ý nghĩa rõ ràng như < header >, < nav >, < main >, < article >, < section > hay < footer > thay cho việc phụ thuộc quá nhiều vào < div > và < span >. Cách tổ chức này giúp developer dễ quản lý mã nguồn, đồng thời hỗ trợ công cụ tìm kiếm và các công nghệ hỗ trợ hiểu rõ hơn cấu trúc website. Vậy semantic HTML là gì, khác gì với non-semantic HTML và nên sử dụng các semantic tags như thế nào cho đúng chuẩn? Bài viết dưới đây sẽ phân tích chi tiết các nhóm thẻ phổ biến, nguyên tắc xây dựng cấu trúc semantic, những sai lầm thường gặp và các công cụ giúp kiểm tra, audit semantic HTML hiệu quả.

- Semantic HTML là gì?
- Phân biệt semantic HTML và non-semantic HTML
- Tầm quan trọng của semantic HTML trong phát triển website
- Các thẻ semantic HTML phổ biến trên website
- Hướng dẫn sử dụng HTML semantic tags đúng chuẩn
- Ví dụ cấu trúc trang web sử dụng semantic HTML
- Những sai lầm phổ biến khi dùng semantic HTML và cách khắc phục
- Semantic HTML5 trong kỷ nguyên Component-Driven Frameworks
- Bộ công cụ kiểm tra và audit semantic HTML chuyên nghiệp
- Một số câu hỏi thường gặp về semantic html
- 1. Semantic HTML có bắt buộc phải sử dụng cho website không?
- 2. HTML semantic tags có giúp website lên top Google nhanh hơn không?
- 3. Thẻ div và span có còn giá trị khi đã có semantic HTML không?
- 4. Một trang web có thể có nhiều thẻ header, footer hoặc article không?
- 5. Sự khác biệt giữa thuộc tính ARIA (WAI-ARIA) và semantic HTML là gì?
- 6. Sử dụng HTML tag semantic có ảnh hưởng đến tốc độ website không?
Semantic HTML là gì?
Semantic HTML là cách sử dụng các thẻ HTML có ý nghĩa rõ ràng để mô tả vai trò và cấu trúc của từng phần nội dung trên website. Thay vì chỉ dùng các thẻ chung như < div > hoặc < span >, semantic HTML sử dụng những thẻ như < header >, < nav >, < main >, < article >, < section >, < footer > để trình duyệt, công cụ tìm kiếm và công nghệ hỗ trợ hiểu chính xác nội dung của trang.
Ví dụ, < nav > cho biết khu vực chứa hệ thống điều hướng, trong khi < article > xác định một nội dung độc lập có thể được phân phối hoặc tái sử dụng riêng. Sử dụng đúng semantic HTML giúp mã nguồn có cấu trúc logic hơn, đồng thời tạo nền tảng tốt cho SEO và khả năng truy cập.

Phân biệt semantic HTML và non-semantic HTML
Semantic HTML và non-semantic HTML khác nhau chủ yếu ở mức độ thể hiện ý nghĩa của nội dung thông qua tên thẻ. Semantic HTML sử dụng thẻ mô tả trực tiếp chức năng hoặc vai trò của thành phần, còn non-semantic HTML chủ yếu dùng các thẻ chung để xây dựng cấu trúc mà không truyền tải nhiều thông tin về nội dung.
| Tiêu chí | Semantic HTML | Non-semantic HTML |
| Khái niệm | Sử dụng các thẻ HTML có ý nghĩa, mô tả rõ vai trò của nội dung. | Sử dụng các thẻ chung, không thể hiện rõ ý nghĩa của nội dung. |
| Ví dụ | < header >, < nav >, < main >, < article >, < section >, < footer > | < div >, < span > |
| Khả năng hiểu cấu trúc | Giúp trình duyệt, công cụ tìm kiếm và screen reader dễ nhận diện cấu trúc trang. | Thường cần dựa vào class, id hoặc ngữ cảnh để xác định vai trò. |
| SEO | Hỗ trợ công cụ tìm kiếm hiểu rõ hơn cấu trúc và ngữ nghĩa nội dung. | Cung cấp ít thông tin ngữ nghĩa trực tiếp cho công cụ tìm kiếm. |
| Accessibility | Hỗ trợ tốt hơn cho screen reader và các công nghệ hỗ trợ. | Có thể cần bổ sung ARIA hoặc các thuộc tính hỗ trợ khác |
| Khả năng bảo trì | Mã nguồn dễ đọc, dễ hiểu và thuận tiện khi mở rộng. | Có thể khó quản lý nếu sử dụng quá nhiều thẻ < div > lồng nhau. |
| Ví dụ sử dụng | < nav>Menu | < div class="menu">Menu |
Tầm quan trọng của semantic HTML trong phát triển website
Semantic HTML không chỉ giúp mã nguồn HTML trở nên có cấu trúc mà còn tạo ra nhiều lợi ích cho SEO, accessibility và quá trình phát triển website. Khi mỗi thành phần được biểu diễn bằng thẻ phù hợp với vai trò, cả con người lẫn máy móc đều dễ dàng xác định cách nội dung được tổ chức.
1. Tối ưu hiệu quả SEO website
Semantic HTML giúp công cụ tìm kiếm hiểu rõ hơn về cấu trúc, vai trò và mối quan hệ giữa các nội dung trên trang. Thay vì chỉ nhìn thấy các khối < div > chung chung, trình thu thập dữ liệu có thể nhận biết đâu là nội dung chính, tiêu đề, điều hướng, bài viết hay phần thông tin bổ trợ thông qua các thẻ như < main >, < article >, < section >, < nav > và < header >. Sử dụng thẻ semantic đúng ngữ cảnh không phải là yếu tố đảm bảo thứ hạng cao trên Google, nhưng góp phần tạo ra cấu trúc HTML rõ ràng, giúp công cụ tìm kiếm dễ phân tích và hiểu nội dung trang. Đây cũng là nền tảng hỗ trợ triển khai các kỹ thuật SEO khác hiệu quả hơn.
2. Cải thiện khả năng truy cập
Semantic HTML giúp các công nghệ hỗ trợ, đặc biệt là screen reader, nhận diện các khu vực quan trọng trên trang dễ dàng hơn. Người dùng có thể nhanh chóng xác định phần điều hướng, nội dung chính, bài viết, các khu vực nội dung và chân trang mà không cần đọc toàn bộ trang theo thứ tự từ trên xuống.
Chẳng hạn, sử dụng < nav > thay cho một < div > chỉ có class navigation giúp bạn truyền tải rõ hơn rằng khu vực này chứa hệ thống điều hướng. Đây là nền tảng quan trọng để xây dựng website thân thiện với người dùng có nhu cầu được hỗ trợ tiếp cận.
3. Mã nguồn tối ưu và dễ bảo trì
Semantic HTML giúp developer nhìn vào mã nguồn và nhanh chóng hiểu chức năng của từng thành phần. Một cấu trúc sử dụng < header >, < main >, < section > và < footer > thường trực quan hơn một cấu trúc chứa quá nhiều < div > lồng nhau. Nhờ đó, quá trình phát triển, debug và mở rộng website cũng thuận lợi hơn. Khi cần chỉnh sửa một khu vực, developer có thể xác định nhanh vị trí và vai trò của thành phần thay vì phải đọc nhiều class hoặc id để hiểu cấu trúc.
4. Tối ưu hiển thị trên các thiết bị & tính năng đọc
Semantic HTML tạo ra cấu trúc nội dung nhất quán, giúp website hoạt động thuận lợi hơn với nhiều trình duyệt, thiết bị và công nghệ hỗ trợ khác nhau. Các thẻ HTML có ngữ nghĩa rõ ràng giúp trình duyệt và công cụ hỗ trợ xử lý nội dung theo đúng vai trò thay vì phải phụ thuộc hoàn toàn vào cách developer đặt tên class.
Đặc biệt, khi kết hợp semantic HTML với responsive design, heading hierarchy, ARIA khi thực sự cần thiết và các nguyên tắc accessibility, website có thể mang lại trải nghiệm nhất quán hơn trên desktop, tablet, mobile cũng như các thiết bị sử dụng screen reader.

Các thẻ semantic HTML phổ biến trên website
Semantic HTML gồm nhiều nhóm thẻ, mỗi nhóm đảm nhận một vai trò riêng trong việc tổ chức nội dung và cấu trúc website. Lựa chọn đúng thẻ semantic giúp mã HTML dễ hiểu hơn đối với developer, đồng thời hỗ trợ trình duyệt, công cụ tìm kiếm và công nghệ hỗ trợ nhận diện chính xác từng khu vực trên trang.
1. Nhóm thẻ cấu trúc chính
Nhóm thẻ cấu trúc chính được sử dụng để xác định bố cục và các khu vực quan trọng của một trang web. Đây là những thành phần thường xuất hiện xuyên suốt cấu trúc website, giúp phân chia trang thành phần đầu trang, khu vực điều hướng, nội dung chính và chân trang.
Các thẻ tiêu biểu trong nhóm này gồm < header >, < nav >, < main > và < footer >. Mỗi thẻ đại diện cho một khu vực có chức năng cụ thể, thay vì chỉ đóng vai trò là một vùng chứa nội dung như < div >.
< header > - Phần đầu trang
Thẻ < header > dùng để xác định phần đầu trang hoặc phần mở đầu của một khu vực nội dung. Header thường là nơi chứa logo, tên website, tiêu đề, thông tin giới thiệu hoặc các thành phần điều hướng. Một trang có thể có nhiều < header > nếu mỗi khu vực nội dung cần một phần mở đầu riêng.
Ví dụ:
< header>
< a href="/">Logo
< h1>Website của tôi
< /header>
Thẻ < nav > dùng để đánh dấu một khu vực chứa các liên kết điều hướng quan trọng của website. Nội dung phổ biến bên trong < nav > gồm menu chính, menu phụ, breadcrumb hoặc các liên kết giúp người dùng di chuyển giữa những khu vực chính. Không phải mọi nhóm liên kết đều cần đặt trong < nav >. Thẻ này nên được sử dụng cho những nhóm liên kết có vai trò điều hướng đáng kể.
Ví dụ:
< nav>
< a href="/">Trang chủ
< a href="/about">Giới thiệu
< a href="/services">Dịch vụ
< a href="/contact">Liên hệ
< main > - Nội dung chính
Thẻ < main > xác định nội dung chính của một trang, tức phần nội dung trực tiếp liên quan đến chủ đề hoặc chức năng chính mà người dùng đang truy cập. Những thành phần lặp lại trên nhiều trang như menu điều hướng, logo hoặc footer thường không nằm trong < main >. Thông thường, một tài liệu HTML chỉ nên có một phần tử < main > đại diện cho nội dung chính của trang.
Ví dụ:
< main>
< h1>Thiết kế website chuyên nghiệp
< p>Thông tin về dịch vụ thiết kế website.
< /main>
Thẻ < footer > xác định phần chân trang hoặc phần kết thúc của một khu vực nội dung. Footer website thường chứa thông tin bản quyền, thông tin liên hệ, liên kết chính sách, thông tin doanh nghiệp hoặc các liên kết bổ sung. Tương tự < header >, < footer > không nhất thiết chỉ xuất hiện một lần. Một < article > hoặc < section > cũng có thể có footer riêng nếu cần thể hiện thông tin kết thúc cho khu vực đó.
Ví dụ:
< footer>
< p>© 2026 Website của tôi
< a href="/privacy">Chính sách bảo mật
< /footer>

2. Nhóm thẻ nội dung
Nhóm thẻ nội dung giúp xác định vai trò, mối quan hệ và phạm vi của từng khối nội dung trên website. Thay vì gom toàn bộ nội dung vào thẻ < div >, developer có thể sử dụng < article >, < section >, < aside >, < figure > và < figcaption > để thể hiện rõ hơn cấu trúc và ngữ nghĩa của từng phần.
< article > - Nội dung độc lập
Thẻ < article > dùng để đánh dấu một khối nội dung độc lập, có thể được phân phối hoặc sử dụng riêng biệt mà vẫn giữ nguyên ý nghĩa. Các nội dung như bài blog, tin tức, bài đánh giá, bài đăng diễn đàn hoặc sản phẩm có thể sử dụng thẻ này.
Ví dụ:
< article >
< h2>Semantic HTML là gì?
< p>Semantic HTML sử dụng các thẻ có ý nghĩa để mô tả cấu trúc nội dung.
< /p>
< section > - Phân chia một chủ đề
Thẻ < section > dùng để xác định một nhóm nội dung có cùng chủ đề hoặc mục đích trong một trang. Mỗi section thường có tiêu đề riêng và được sử dụng để chia nội dung lớn thành các phần logic. Chẳng hạn, một bài viết có thể chia thành các section như “Semantic HTML là gì?”, “Lợi ích của Semantic HTML” và “Các thẻ Semantic HTML phổ biến”.
Ví dụ:
< section >
< h2>Lợi ích của Semantic HTML
< p>Semantic HTML giúp cấu trúc website rõ ràng và dễ truy cập hơn.
< /section>
< aside > - Nội dung minh họa
Thẻ < aside > dùng để xác định phần nội dung có liên quan nhưng không thuộc nội dung chính của trang hoặc một khu vực cụ thể. Nội dung bên trong thường mang tính bổ trợ, chẳng hạn như thanh bên, bài viết liên quan, thông tin tác giả, quảng cáo hoặc các liên kết bổ sung.
Thẻ này có thể được đặt ở cấp độ trang hoặc bên trong < article > tùy thuộc vào mối quan hệ của nội dung. Khi sử dụng đúng ngữ nghĩa, thẻ giúp trình duyệt, công cụ tìm kiếm và công nghệ hỗ trợ phân biệt nội dung chính với các thông tin bổ sung.
Ví dụ:
< aside>
< h2>Bài viết liên quan
< ul>
< li > HTML semantic là gì?
< li> Các thẻ HTML phổ biến
< /ul>
< /aside>
< figure & figcaption > - Chú thích nội dung minh họa
Thẻ < figcaption > dùng để tạo chú thích cho nội dung được đặt trong < figure >. Chú thích có thể giải thích hình ảnh, biểu đồ, sơ đồ hoặc bất kỳ nội dung minh họa nào khác. < figcaption > nên được đặt ở đầu hoặc cuối phần tử < figure > và giúp người dùng hiểu rõ hơn về nội dung được minh họa.
Ví dụ:
< figure>
< img src="html-structure.jpg" alt="Cấu trúc HTML semantic">
< figcaption>Ví dụ về cấu trúc HTML semantic.
< /figure>

3. Nhóm thẻ văn bản
Nhóm thẻ văn bản được sử dụng để xác định cấu trúc, mức độ quan trọng và ngữ nghĩa của nội dung chữ trên website. Sử dụng đúng các thẻ như < h1 > đến < h6 >, < p >, < strong >, < em >, < mark > hay < time > không chỉ giúp nội dung dễ đọc, dễ tổ chức mà còn cung cấp thêm ngữ cảnh cho trình duyệt, công cụ tìm kiếm và công nghệ hỗ trợ.
| Thẻ | Chức năng | Cách sử dụng |
| < h1 > - < h6 > | Xác định các cấp tiêu đề. | < h1 > cho tiêu đề chính, < h2 > - < h6 > cho các cấp nội dung thấp hơn. |
| < p > | Xác định một đoạn văn. | Dùng để phân chia nội dung thành các đoạn riêng biệt. |
| < strong > | Đánh dấu nội dung quan trọng. | Dùng cho từ hoặc cụm từ cần nhấn mạnh về mặt ngữ nghĩa. |
| < em > | Nhấn mạnh nội dung. | Dùng khi muốn thể hiện sự nhấn mạnh trong câu. |
| < mark > | Đánh dấu nội dung cần chú ý. | Dùng để làm nổi bật một phần văn bản trong ngữ cảnh cụ thể. |
| < time > | Biểu diễn ngày, giờ hoặc thời gian. | Có thể kết hợp thuộc tính datetime để cung cấp giá trị thời gian cho máy đọc. |
| < small > | Xác định nội dung phụ. | Dùng cho chú thích, điều khoản, thông tin bản quyền hoặc lưu ý. |
| < del > | Đánh dấu nội dung đã xóa. | Dùng khi thể hiện thông tin không còn được áp dụng. |
| < ins > | Đánh dấu nội dung được thêm. | Dùng để thể hiện phần nội dung mới được bổ sung. |
Sử dụng HTML semantic tags đúng cách giúp website có cấu trúc rõ ràng, dễ đọc và thuận lợi hơn cho SEO cũng như accessibility. Thay vì lựa chọn thẻ dựa trên cách hiển thị, developer nên xác định ý nghĩa và chức năng của nội dung trước khi quyết định sử dụng tag nào.
1. Nguyên tắc cốt lõi khi lựa chọn HTML tag semantic
Khi xây dựng cấu trúc HTML, cần ưu tiên ngữ nghĩa của nội dung thay vì kiểu trình bày trực quan. Mỗi semantic tag nên được sử dụng đúng với mục đích mà HTML quy định, đồng thời tránh lạm dụng thẻ hoặc dùng thẻ chỉ vì muốn đạt một hiệu ứng hiển thị nhất định.
Một số nguyên tắc quan trọng gồm:
- Chọn HTML semantic tag dựa trên ý nghĩa: Xác định nội dung là tiêu đề, điều hướng, nội dung chính, bài viết, phần bổ trợ hay thông tin độc lập trước khi chọn thẻ.
- Ưu tiên semantic tag khi có thẻ phù hợp: Nếu nội dung có thể được mô tả rõ bằng < nav >, < article >, < section > hoặc < aside >, không nên mặc định sử dụng < div >.
- Không chọn tag chỉ vì cách hiển thị: Ví dụ, không dùng chỉ vì muốn làm chữ đậm hoặc < h1 > chỉ vì muốn tạo chữ lớn. CSS nên đảm nhận nhiệm vụ định dạng.
- Duy trì cấu trúc heading hợp lý: Sắp xếp < h1 > đến < h6 > theo thứ bậc nội dung, giúp người dùng và công nghệ hỗ trợ dễ hiểu cấu trúc trang.
- Không lạm dụng semantic tags: Không phải mọi nhóm nội dung đều cần một semantic tag riêng. Khi không có thẻ phù hợp, < div > vẫn là lựa chọn hợp lệ.
- Đảm bảo tính nhất quán: Các thành phần có cùng vai trò nên được đánh dấu bằng cùng loại tag để mã nguồn dễ đọc, quản lý và bảo trì.
- Kết hợp semantic HTML với accessibility: Semantic tags tạo nền tảng tốt cho khả năng truy cập, nhưng vẫn cần sử dụng thuộc tính như alt, aria-* hoặc các kỹ thuật accessibility khác khi cần thiết.
2. Cấu trúc layout chuẩn
Một layout semantic nên được xây dựng theo thứ tự và vai trò rõ ràng, giúp trình duyệt, công cụ tìm kiếm và công nghệ hỗ trợ dễ nhận diện từng khu vực của trang. Thay vì sử dụng quá nhiều thẻ < div > và thẻ < span > , developer nên kết hợp các semantic tags phù hợp để mô tả cấu trúc tổng thể.
Cấu trúc cơ bản có thể triển khai như sau:
< body>
< header>
< nav>
< !-- Menu điều hướng -->
< /nav>
< /header>
< main>
< section>
< h1>Tiêu đề chính
< !-- Nội dung chính -->
< /section>
< section>
< h2>Chủ đề liên quan
< !-- Nội dung -->
< /section>
< aside>
< !-- Nội dung bổ trợ -->
< /aside>
< /main>
< footer>
< !-- Thông tin chân trang -->
< /footer>
< /body>
Trong đó:
- < header > đảm nhận phần đầu trang và thường chứa khu vực điều hướng < nav >.
- < main > bao bọc nội dung chính, bên trong có thể sử dụng < section > để phân chia các chủ đề và < aside > cho thông tin bổ trợ.
- Cuối cùng, < footer > chứa các thông tin ở phần chân trang.
Khi xây dựng layout, cần đảm bảo mỗi semantic tag phản ánh đúng vai trò của nội dung. Tuy nhiên, không nên sử dụng < section > hoặc < aside > chỉ để tạo bố cục; CSS Grid, Flexbox và các thuộc tính CSS mới là công cụ phù hợp để xử lý việc trình bày và sắp xếp giao diện.

3. Kết hợp với CSS và JavaScript
Semantic HTML chịu trách nhiệm xác định ý nghĩa và cấu trúc nội dung, trong khi CSS đảm nhận phần trình bày và JavaScript xử lý các hành vi tương tác. Phân tách rõ ba vai trò này giúp mã nguồn dễ đọc, dễ bảo trì và hạn chế phụ thuộc lẫn nhau.
Kết hợp semantic HTML với CSS
Developer có thể sử dụng CSS để định dạng trực quan cho các semantic tags mà không làm thay đổi ý nghĩa của chúng. Chẳng hạn, < header >, < nav >, < main > và < footer > có thể được tùy chỉnh bằng Flexbox hoặc Grid để tạo layout responsive.
< header class="site-header">
< nav class="main-nav">
< a href="/">Trang chủ
< a href="/blog">Blog
< /nav>
< /header>
.site -header {
display : flex;
justify-content : space-between;
}
.main-nav {
display : flex;
gap : 20px;
}
Kết hợp semantic HTML với JavaScript
JavaScript nên thao tác dựa trên các phần tử có vai trò rõ ràng thay vì phụ thuộc quá nhiều vào cấu trúc DOM hoặc các class chỉ dùng cho mục đích hiển thị. Ví dụ, có thể sử dụng < button > cho một hành động mở menu và JavaScript để xử lý sự kiện click.
< button type="button" id="menu-toggle">
Mở menu
< /button>
const button = document.querySelector('#menu-toggle');
button.addEventListener('click', () => {
// Xử lý mở/đóng menu
});
Cách tiếp cận này giúp HTML tập trung vào cấu trúc, CSS tập trung vào giao diện và JavaScript tập trung vào hành vi. Khi cần thay đổi thiết kế hoặc chức năng, developer cũng dễ dàng chỉnh sửa từng lớp mà ít ảnh hưởng đến các thành phần còn lại.
4. Xây dựng ma trận heading chuẩn SEO
Heading là hệ thống tiêu đề giúp phân cấp và tổ chức nội dung trên website. Khi xây dựng ma trận heading chuẩn SEO, cần sắp xếp các thẻ < h1 > đến < h6 > theo thứ tự logic, phản ánh đúng mối quan hệ giữa chủ đề chính và các nội dung con. Cấu trúc này vừa giúp người dùng dễ theo dõi, vừa hỗ trợ công cụ tìm kiếm hiểu rõ bố cục trang.
Có thể xây dựng ma trận heading theo nguyên tắc:
| Cấp heading | Vai trò | Cách sử dụng |
| < h1 > | Chủ đề chính của trang | Thường dùng cho tiêu đề chính, xác định nội dung trọng tâm. |
| < h2 > | Chủ đề lớn | Phân chia nội dung thành các phần chính. |
| < h3 > | Chủ đề phụ | Triển khai các nội dung thuộc < h2 >. |
| < h4 > | Nội dung chi tiết | Phân nhỏ nội dung thuộc < h3 > khi cần. |
| < h5 > | Cấp nội dung sâu hơn | Chỉ sử dụng khi cấu trúc nội dung thực sự cần. |
| < h6 > | Cấp thấp nhất | Dùng cho các nội dung có nhiều tầng phân cấp. |
Ví dụ cấu trúc trang web sử dụng semantic HTML
Dưới đây là một cấu trúc trang web cơ bản sử dụng các semantic HTML tags phổ biến. Mỗi thẻ đảm nhận một vai trò riêng, giúp mã nguồn dễ hiểu và thể hiện rõ mối quan hệ giữa các khu vực nội dung.
< !DOCTYPE html>
< html lang="vi">
< head>
< meta charset="UTF-8">
< meta name="viewport" content="width=device-width, initial-scale=1.0">
< title>Semantic HTML
< /head>
< body>
< header>
< a href="/" class="logo">Website
< nav>
< a href="/">Trang chủ
< a href="/about">Giới thiệu
< a href="/blog">Blog
< a href="/contact">Liên hệ
< /nav>
< /header>
< main>
< article>
< header>
< h1>Semantic HTML là gì?
< p>
Cập nhật ngày
< time datetime="2026-08-14">14/08/2026
< /p>
< /header>
< section>
< h2>Semantic HTML là gì?
< p>
Semantic HTML sử dụng các thẻ có ý nghĩa để mô tả
cấu trúc và vai trò của nội dung trên website.
< /p>
< /section>
< section>
< h2>Các thẻ semantic HTML phổ biến
< h3>Nhóm thẻ cấu trúc
< p>Gồm header, nav, main và footer.
< figure>
< img src="semantic-html.jpg" alt="Cấu trúc semantic HTML">
< figcaption>Cấu trúc cơ bản của một trang semantic HTML.< /figcaption>
< /figure>
< /section>
< /article>
< aside>
< h2>Bài viết liên quan
< ul>
< li > HTML là gì?
< li > SEO website là gì?
< /ul>
< /aside>
< /main>
< footer>
< p>© 2026 Website. All rights reserved.
< /footer>
< /body>
< /html>
Cụ thể:
| Semantic tag | Vai trò trong trang |
| < header > | Chứa phần đầu trang hoặc phần mở đầu của một nội dung |
| < nav > | Chứa các liên kết điều hướng chính |
| < main > | Bao bọc nội dung chính của trang |
| < article > | Chứa một nội dung độc lập, chẳng hạn bài viết |
| < section > | Phân chia bài viết thành các chủ đề liên quan |
| < aside > | Chứa nội dung bổ trợ như bài viết liên quan |
| < figure > | Bao bọc hình ảnh hoặc nội dung minh họa |
| < figcaption > | Cung cấp chú thích cho nội dung trong < figure > |
| < footer > | Chứa thông tin ở cuối trang hoặc cuối một nội dung |
Những sai lầm phổ biến khi dùng semantic HTML và cách khắc phục
Semantic HTML giúp cấu trúc website rõ ràng hơn nhưng sử dụng không đúng ngữ cảnh có thể làm mất đi lợi ích. Hiện nay, một số developer có xu hướng lạm dụng semantic tags hoặc thay thế mọi < div > bằng các thẻ semantic dù không thực sự phù hợp. Vì vậy, bạn cần hiểu rõ vai trò của từng thẻ và lựa chọn dựa trên ngữ nghĩa nội dung thay vì sử dụng theo khuôn mẫu.
1. Lạm dụng HTML semantic
Một trong những sai lầm phổ biến là sử dụng quá nhiều semantic tags cho những nội dung không có vai trò tương ứng. Chẳng hạn, không phải mọi nhóm nội dung đều cần đặt trong < section >, cũng như không phải mọi nhóm liên kết đều nên sử dụng < nav >. Lạm dụng có thể khiến cấu trúc HTML trở nên phức tạp và gây khó khăn cho công nghệ hỗ trợ khi phân tích nội dung.
Cách khắc phục là chỉ sử dụng semantic tag khi nó thực sự mô tả đúng vai trò của nội dung. Nếu không có thẻ semantic phù hợp, < div > vẫn là lựa chọn hoàn toàn hợp lệ để tạo vùng chứa hoặc phục vụ mục đích bố cục.
2. Thay thế hoàn toàn div bằng thẻ semantic
Sử dụng semantic HTML không có nghĩa là bạn phải loại bỏ hoàn toàn < div > khỏi mã nguồn website. Thẻ < div > vẫn cần thiết khi developer chỉ cần một phần tử chứa để nhóm các thành phần hoặc phục vụ việc xây dựng layout mà không có ý nghĩa ngữ nghĩa cụ thể. Cố gắng thay mọi < div > bằng < section >, < article > hoặc < aside > có thể khiến mã HTML trở nên thiếu chính xác.
Do đó, cần xác định mục đích của phần tử trước khi lựa chọn tag. Nếu nội dung có vai trò semantic rõ ràng, hãy dùng thẻ tương ứng; nếu chỉ cần một container để xử lý CSS hoặc JavaScript, < div > vẫn là lựa chọn phù hợp.
3. Vi phạm quy tắc phân cấp heading
Sử dụng heading không theo thứ tự logic là lỗi thường gặp khi xây dựng cấu trúc nội dung. Ví dụ, một trang có thể chuyển trực tiếp từ < h2 > sang < h4 > chỉ vì muốn thay đổi kích thước tiêu đề, khiến mối quan hệ giữa các nội dung trở nên khó hiểu. Heading cần phản ánh cấp độ và cấu trúc của nội dung, không nên được lựa chọn chỉ dựa trên cách hiển thị. Cách khắc phục là xây dựng hệ thống heading theo thứ bậc từ < h1 > đến các cấp thấp hơn dựa trên cấu trúc nội dung thực tế. Sử dụng CSS để điều chỉnh kích thước, font chữ hoặc khoảng cách của heading thay vì thay đổi cấp thẻ chỉ để đạt được một kiểu hiển thị mong muốn.

Một số website vẫn sử dụng < div > để bao bọc toàn bộ nội dung chính hoặc khu vực menu mà không dùng < main > và < nav >. Điều này khiến cấu trúc trang kém rõ ràng, đồng thời làm giảm khả năng nhận diện các khu vực quan trọng đối với screen reader và công nghệ hỗ trợ. Đặc biệt, < main > giúp xác định phần nội dung chính, còn < nav > cho biết khu vực chứa các liên kết điều hướng quan trọng. Cách xử lý là sử dụng < main > để bao bọc nội dung chính của trang và < nav > cho các khu vực điều hướng có ý nghĩa.
5. Nhầm lẫn giữa thẻ section và article
Thẻ < section > và < article > đều dùng để tổ chức nội dung nên dễ bị sử dụng nhầm trong quá trình xây dựng website. Thẻ < section > phù hợp với một nhóm nội dung có cùng chủ đề trong một trang, trong khi < article > dành cho nội dung độc lập có thể tồn tại hoặc được phân phối riêng. Ví dụ, một bài viết có thể là < article > và bên trong được chia thành nhiều < section > theo từng chủ đề.
Do đó trước khi lựa chọn thẻ, bạn cần xác định nội dung có thể tồn tại độc lập với phần còn lại hay không. Nếu nội dung có ý nghĩa riêng và có thể được phân phối hoặc tái sử dụng độc lập, nên sử dụng < article >; ngược lại, nếu chỉ là một phần nội dung thuộc chủ đề lớn hơn, < section > sẽ phù hợp hơn.
Một lỗi khác là cho rằng < header > và < footer > chỉ được phép xuất hiện một lần ở đầu và cuối toàn bộ trang. Trên thực tế, hai thẻ này có thể được sử dụng cho một trang hoặc một khu vực nội dung như < article > hay < section >, miễn là chúng đảm nhận đúng vai trò phần mở đầu hoặc kết thúc. Sử dụng sai ngữ cảnh có thể khiến cấu trúc semantic trở nên khó hiểu và không phản ánh đúng mối quan hệ giữa các thành phần.
Cách khắc phục chính là sử dụng thẻ < header > cho phần giới thiệu hoặc nội dung mở đầu của trang hay một sectioning content, chẳng hạn tiêu đề, thông tin tác giả hoặc điều hướng liên quan. Sử dụng < footer > cho thông tin kết thúc như tác giả, bản quyền, liên kết bổ sung hoặc thông tin liên quan đến khu vực nội dung đó.

Semantic HTML5 trong kỷ nguyên Component-Driven Frameworks
Sự phát triển của các component-driven frameworks như React, Vue hay Angular khiến website được xây dựng từ các component có khả năng tái sử dụng. Tuy nhiên, component không thay thế vai trò của semantic HTML5 mà cần được kết hợp để tạo cấu trúc website rõ ràng, dễ bảo trì và thân thiện với accessibility. Khi triển khai semantic HTML trong mô hình component-driven, bạn cần chú ý các nguyên tắc sau:
- Component nên sử dụng semantic tag phù hợp: Component Header có thể sử dụng < header >, Navigation sử dụng < nav >, còn component bài viết có thể sử dụng < article > và < section >.
- Không đồng nhất component với semantic tag: Component được tạo ra nhằm tái sử dụng giao diện, logic hoặc chức năng, trong khi semantic tag được lựa chọn dựa trên ý nghĩa của nội dung. Vì vậy, không phải component nào cũng cần tương ứng với một semantic tag.
- Không thay thế mọi < div > bằng semantic tag: Thẻ < div > vẫn phù hợp khi chỉ đóng vai trò container phục vụ CSS, layout hoặc JavaScript mà không có ý nghĩa ngữ nghĩa cụ thể.
- Ưu tiên HTML native cho thành phần tương tác: Với các chức năng như nút bấm, liên kết hoặc trường nhập liệu, nên sử dụng < button >, < a >, < input > thay vì dùng < div > hoặc < span > kết hợp JavaScript để mô phỏng hành vi.
- Kết hợp semantic HTML với accessibility: Semantic tag giúp trình duyệt và công nghệ hỗ trợ hiểu cấu trúc component tốt hơn. Khi cần, developer có thể kết hợp thêm thuộc tính ARIA và các kỹ thuật accessibility phù hợp.
- Chuẩn hóa semantic structure trong hệ thống component: Các component dùng chung nên có cấu trúc semantic nhất quán. Ví dụ, Card có thể sử dụng < article > nếu mỗi card là một nội dung độc lập, nhưng thẻ < div > sẽ phù hợp hơn nếu card chỉ là một container trình bày.
- Duy trì cấu trúc heading hợp lý: Khi component chứa tiêu đề, cần đảm bảo < h1 > đến < h6 > phản ánh đúng thứ bậc nội dung thay vì lựa chọn cấp heading dựa trên kích thước hiển thị.

Bộ công cụ kiểm tra và audit semantic HTML chuyên nghiệp
Semantic HTML cần được kiểm tra ở nhiều khía cạnh, từ tính hợp lệ của mã nguồn, cấu trúc nội dung đến khả năng truy cập thực tế. Không có một công cụ duy nhất có thể đánh giá toàn bộ các yếu tố này, vì vậy developer nên kết hợp validator, công cụ audit tự động và kiểm tra thủ công để có kết quả chính xác hơn.
- W3C Markup Validation Service: Đây là công cụ dùng để kiểm tra tính hợp lệ của HTML theo các tiêu chuẩn web. Công cụ có thể phát hiện lỗi cú pháp, phần tử không được phép sử dụng, thuộc tính không hợp lệ hoặc cấu trúc HTML không đúng. Khi audit semantic HTML, W3C Validator giúp đảm bảo các semantic tags như < header >, < main >, < article >, < section > và < nav > được triển khai trong một document HTML hợp lệ. Tuy nhiên, công cụ chủ yếu kiểm tra tính hợp lệ của markup chứ không đánh giá đầy đủ trải nghiệm accessibility hoặc chất lượng semantic của nội dung.
- Google Lighthouse: Lighthouse là công cụ audit tích hợp trong Chrome DevTools, cho phép đánh giá website theo các nhóm Performance, Accessibility, Best Practices và SEO. Khi kiểm tra semantic HTML, Lighthouse có thể phát hiện một số vấn đề liên quan đến heading, linkbutton, tên accessible và khả năng sử dụng với công nghệ hỗ trợ. Developer có thể chạy audit trực tiếp trên trang hoặc sử dụng Lighthouse trong quy trình phát triển để theo dõi chất lượng website qua nhiều phiên bản. Đây là lựa chọn phù hợp khi muốn kiểm tra semantic HTML cùng với các yếu tố kỹ thuật khác thay vì audit markup riêng lẻ.
- axe DevTools: axe DevTools tập trung mạnh vào accessibility testing, đặc biệt hữu ích khi kiểm tra semantic HTML trong các website có nhiều component và tương tác. Công cụ có thể phát hiện các vấn đề như thiếu accessible name, lỗi ARIA, cấu trúc heading không phù hợp, phần tử tương tác không thể truy cập bằng bàn phím hoặc các vấn đề về liên kết giữa label và form control. Kết quả thường đi kèm mô tả lỗi, vị trí phần tử và hướng dẫn khắc phục, giúp developer nhanh chóng xác định nguyên nhân trong mã nguồn. axe cũng có thể được tích hợp vào quy trình kiểm thử tự động để phát hiện lỗi accessibility ngay trong quá trình phát triển.
- WAVE: WAVE cung cấp giao diện trực quan để phân tích accessibility ngay trên trang web. Sau khi kiểm tra, công cụ đánh dấu trực tiếp các phần tử có lỗi, cảnh báo hoặc thông tin cần xem xét, giúp developer dễ liên hệ giữa vấn đề và vị trí cụ thể trong giao diện. WAVE đặc biệt hữu ích khi kiểm tra heading structure, landmark, alternative text, form labels và các thành phần semantic có liên quan đến accessibility. Bên cạnh lỗi tự động phát hiện, WAVE cũng cung cấp các thông tin để developer thực hiện đánh giá thủ công thay vì chỉ dựa vào điểm số.

Một số câu hỏi thường gặp về semantic html
Semantic HTML là một phần quan trọng trong việc xây dựng cấu trúc website rõ ràng, nhưng vẫn có nhiều vấn đề khiến developer dễ nhầm lẫn khi áp dụng. Dưới đây là những câu hỏi thường gặp giúp làm rõ cách sử dụng semantic HTML, mối liên hệ với SEO, accessibility và hiệu suất website.
1. Semantic HTML có bắt buộc phải sử dụng cho website không?
Không bắt buộc nhưng semantic HTML được khuyến khích sử dụng khi xây dựng website hiện đại. HTML vẫn có thể hoạt động khi sử dụng nhiều thẻ < div > và < span >, nhưng cấu trúc này thường khó thể hiện rõ vai trò của từng khu vực nội dung. Sử dụng semantic tags đúng ngữ cảnh giúp mã nguồn dễ hiểu hơn, hỗ trợ accessibility và tạo cấu trúc rõ ràng cho công cụ tìm kiếm.
Semantic HTML không phải yếu tố đảm bảo website lên top Google nhanh hơn và cũng không phải một "mẹo SEO" trực tiếp giúp tăng thứ hạng. Tuy nhiên, cấu trúc HTML có ngữ nghĩa giúp công cụ tìm kiếm hiểu rõ hơn về nội dung và cấu trúc của trang, đồng thời có thể hỗ trợ accessibility và khả năng thu thập dữ liệu. Vì vậy, semantic HTML nên được xem là một phần của nền tảng SEO kỹ thuật, kết hợp với nội dung chất lượng, heading hợp lý, internal link, hiệu suất và nhiều yếu tố SEO khác.
3. Thẻ div và span có còn giá trị khi đã có semantic HTML không?
Có. Semantic HTML giúp bạn chọn đúng thẻ cho từng loại nội dung. Tuy nhiên, khi không có thẻ phù hợp, bạn vẫn có thể dùng div hoặc span.
Ví dụ:
- Thẻ div dùng để gom nhiều nội dung lại với nhau.
- Thẻ span dùng để đánh dấu một phần nhỏ trong câu.
Chẳng hạn, khi muốn gom tiêu đề, hình ảnh và đoạn văn thành một nhóm nhưng nhóm này không có ý nghĩa cụ thể, bạn có thể dùng div.
Có thể. Cả hai thẻ < header > và < footer > có thể xuất hiện nhiều lần trong một tài liệu nếu chúng thuộc các khu vực nội dung khác nhau, chẳng hạn một < article > có thể có < header > chứa tiêu đề và < footer > chứa thông tin tác giả. Tương tự, một trang có thể chứa nhiều < article > nếu có nhiều nội dung độc lập như danh sách bài viết hoặc tin tức. Tuy nhiên, < main > có quy tắc khác và thông thường một document chỉ nên có một < main > đại diện cho nội dung chính.
5. Sự khác biệt giữa thuộc tính ARIA (WAI-ARIA) và semantic HTML là gì?
Semantic HTML sử dụng các phần tử HTML có ý nghĩa được định nghĩa sẵn như < button >, < nav >, < main > và < article > để mô tả vai trò của nội dung. Trong khi đó, WAI-ARIA cung cấp các thuộc tính và role bổ sung như aria-label, aria-expanded hoặc role nhằm truyền thêm thông tin accessibility khi HTML native không đủ để mô tả trạng thái hoặc hành vi của một thành phần. Vì vậy, developer nên ưu tiên semantic HTML trước và chỉ sử dụng ARIA khi thực sự cần thiết, tránh thêm ARIA không cần thiết hoặc sử dụng sai vai trò.
6. Sử dụng HTML tag semantic có ảnh hưởng đến tốc độ website không?
Sử dụng semantic HTML hầu như không tạo ra ảnh hưởng đáng kể đến tốc độ tải trang. Các semantic tags như < main >, < section >, < article > hay < nav > chủ yếu cung cấp ngữ nghĩa cho cấu trúc document và không tạo ra tài nguyên lớn cần tải thêm. Những yếu tố như kích thước hình ảnh, JavaScript, CSS, font, số lượng request và cách tối ưu tài nguyên thường có ảnh hưởng lớn hơn đến hiệu suất website. Vì vậy, developer nên lựa chọn semantic tags dựa trên cấu trúc và ý nghĩa nội dung thay vì lo ngại chúng làm website chậm hơn.

Qua bài viết của Phương Nam Vina, có thể thấy semantic HTML không chỉ giúp mã nguồn website rõ ràng, dễ đọc mà còn tạo nền tảng tốt cho SEO và accessibility. Sử dụng đúng các thẻ như < header >, < nav >, < main >, < article >, < section > hay < footer > giúp trình duyệt, công cụ tìm kiếm và công nghệ hỗ trợ hiểu chính xác hơn cấu trúc, vai trò của từng thành phần. Để khai thác hiệu quả semantic HTML, developer cần lựa chọn tag dựa trên ý nghĩa của nội dung, duy trì cấu trúc heading hợp lý và không lạm dụng semantic tags. Đồng thời, semantic HTML nên được kết hợp với CSS, JavaScript và các tiêu chuẩn accessibility như WAI-ARIA khi cần thiết. Đây là cách xây dựng website có cấu trúc tốt, dễ bảo trì và mang lại trải nghiệm nhất quán trên nhiều thiết bị.
