Hãy học cách viết Semantic HTML giúp cải thiện khả năng truy cập, SEO và khả năng tương thích với trình đọc màn hình — và cách kiểm tra tính chính xác về ngữ nghĩa của HTML do AI tạo ra.
Semantic HTML là bộ khung của mọi trang web. Nó quyết định cách trình đọc màn hình điều hướng trang web của bạn, cách công cụ tìm kiếm hiểu nội dung của bạn và cách trình duyệt áp dụng các hành vi mặc định. AI tạo ra HTML hiển thị đúng về mặt hình ảnh nhưng hầu như luôn bỏ sót ý nghĩa ngữ nghĩa.
Tham khảo các phần tử ngữ nghĩa
Yếu tố
Ý nghĩa
Thay thế
<header>
Tiêu đề trang hoặc phần
<div class="header">
<nav>
Liên kết điều hướng
<div class="nav">
<main>
Nội dung chính của trang (một nội dung cho mỗi trang)
<div class="content">
<article>
Nội dung độc lập (bài đăng blog, thẻ sản phẩm)
<div class="card">
<section>
Phân nhóm theo chủ đề có tiêu đề
<div class="section">
<aside>
Nội dung có liên quan nhưng không trực tiếp (phần bên lề)
<div class="sidebar">
<footer>
Footer trang hoặc mục
<div class="footer">
<figure> + <figcaption>
Hình ảnh/sơ đồ kèm chú thích
<div class="image-wrapper">
<details> + <summary>
Nội dung có thể mở rộng/thu gọn
<div> + JavaScript accordion
<dialog>
Hộp thoại hoặc cửa sổ pop-up
<div class="modal">
<time>
Giá trị ngày/giờ
<span class="date">
Template cấu trúc trang
Prompt AI về cấu trúc ngữ nghĩa:
Chuyển đổi HTML dựa trên thẻ <div> này để sử dụng các phần tử ngữ nghĩa phù hợp. Thay thế các thẻ div chung chung bằng phần tử ngữ nghĩa cụ thể nhất hiện có. Thêm nhãn ARIA khi có nhiều phần tử đánh dấu cùng loại. Đảm bảo trang chỉ có chính xác một thẻ <main>, hệ thống phân cấp tiêu đề hợp lý (h1 → h2 → h3, không bỏ qua cấp độ nào) và các phần tử đánh dấu để điều hướng.
Cấu trúc trang chính xác:
📍 Nơi dán: Mở ChatGPT (chat.openai.com), Claude (claude.ai) hoặc Gemini (gemini.google.com) và bắt đầu một cuộc trò chuyện mới.
📋 Cách sao chép prompt này: Nhấp vào bất kỳ đâu bên trong khối màu xám, nhấn Cmd+A rồi Cmd+C (Mac) hoặc Ctrl+A rồi Ctrl+C (Windows). Hoặc sử dụng biểu tượng sao chép xuất hiện.
✏️ Cách điền thông tin chi tiết của bạn: Thay thế mỗi dấu ngoặc vuông [] và trình giữ chỗ trong ngoặc bằng thông tin cụ thể từ tình huống thực tế của bạn. Thông tin đầu vào mơ hồ sẽ tạo ra kết quả mơ hồ — hãy cụ thể.
👀 Những gì bạn sẽ thấy: Trong vòng vài giây, AI sẽ trả về một phản hồi có cấu trúc dựa vào prompt ở trên. Hãy đọc kỹ và coi đó là bản nháp, không phải câu trả lời cuối cùng.
📌 Nên làm gì với kết quả: Lưu phản hồi vào file Notes. Chọn gợi ý có hiệu quả cao nhất và thực hiện nó trong tuần này — đừng cố gắng làm tất cả cùng một lúc.
⚠️ Nếu kết quả không ổn: Nếu các gợi ý có vẻ chung chung, hãy dán nội dung sau: "Hãy cụ thể hơn với ngữ cảnh thực tế của tôi. Bỏ qua những lời khuyên chung chung." Nếu nó bỏ qua các chi tiết quan trọng bạn đã cung cấp, hãy hỏi: "Bạn đã bỏ sót [X] trong ngữ cảnh của tôi — hãy thực hiện lại với điều đó làm ràng buộc chính."
Cấu trúc phân cấp tiêu đề
Các tiêu đề tạo ra một dàn ý mà trình đọc màn hình sử dụng để điều hướng:
Quy tắc
Đúng
Sai
Một <h1> mỗi trang
<h1>Product Name</h1>
Nhiều thẻ <h1>
Không bỏ qua cấp độ nào
h1 → h2 → h3
h1 → h3 (bỏ qua h2)
Về mặt ngữ nghĩa, không phải về mặt hình ảnh
Sử dụng CSS để điều chỉnh kích thước, và tiêu đề để phân cấp thông tin
<h3> vì nó "trông có vẻ đúng"
Prompt AI cho việc kiểm tra tiêu đề:
Phân tích trang HTML này và kiểm tra thứ bậc tiêu đề: (1) Có chính xác một thẻ <h1> không? (2) Các cấp độ tiêu đề có tuần tự không (không có bước nhảy h1 → h3)? (3) Cấu trúc tiêu đề có hợp lý không nếu bạn chỉ đọc các tiêu đề? (4) Có tiêu đề nào được sử dụng để tạo kiểu trực quan thay vì cấu trúc ngữ nghĩa không?
Biểu mẫu: Thành phần semantic bị bỏ sót nhiều nhất
Các biểu mẫu do AI tạo ra thường thiếu nhãn và cấu trúc phù hợp:
Yếu tố
Mục đích
AI thường bỏ sót
<label for="email">
Liên kết nhãn với đầu vào
Sử dụng <span> thay thế
<fieldset> + <legend>
Các nhóm đầu vào liên quan
Không có sự phân nhóm nào cả
type="email"
Nhập đúng loại dữ liệu
Sử dụng type="text" cho mọi thứ
required
Chỉ báo trường bắt buộc
Chỉ là dấu sao hiển thị, không có thuộc tính nào khác
aria-describedby
Liên kết thông báo lỗi
Văn bản lỗi không được liên kết với dữ liệu đầu vào
✅ Kiểm tra nhanh: AI tạo ra một nút là `<div class="button" onclick="submit()">Submit</div>`. Tại sao điều này lại có vấn đề?
Câu trả lời: `<div>` không phải là một nút — nó không thể được chọn bằng bàn phím, không được trình đọc màn hình nhận dạng là nút, không thể được kích hoạt bằng phím Enter/Space và không được bao gồm trong thứ tự tab. Phần tử chính xác là `<button type="submit">Submit</button>`, phần tử này cung cấp tất cả các hành vi trên một cách tự nhiên. Nếu bạn BẮT BUỘC phải sử dụng một phần tử không phải là nút, hãy thêm `role="button", `tabindex="0"` và trình xử lý sự kiện bàn phím — nhưng hãy ưu tiên phần tử `<button>` thực sự.
Kiểm tra HTML do AI tạo ra
Prompt AI kiểm tra ngữ nghĩa:
Kiểm tra tính đúng đắn về ngữ nghĩa của HTML này: [DÁN HTML]. Kiểm tra: (1) Có sử dụng các phần tử `<div>` ở những nơi cần các phần tử ngữ nghĩa không? Liệt kê từng phần tử thay thế. (2) Hệ thống phân cấp tiêu đề có hợp lệ không (một `h1`, các cấp độ tuần tự)? (3) Tất cả hình ảnh có văn bản thay thế (alt text) có ý nghĩa không (không phải "image" hoặc "photo")? (4) Các biểu mẫu có được dán nhãn đúng cách không (mỗi ô nhập liệu đều có <label>)? (5) Các phần tử tương tác có sử dụng HTML chính xác không (nút là <button>, liên kết là <a>)? (6) Các mốc lặp lại có nhãn aria không?
Những điểm chính cần ghi nhớ
Semantic HTML truyền đạt ý nghĩa cho trình đọc màn hình, công cụ tìm kiếm và trình duyệt — <nav>, <main>, <article> tạo ra các mốc có thể điều hướng, trong khi <div> tạo ra những container vô hình; AI mặc định sử dụng cấu trúc thẻ `<div>` trông có vẻ đúng về mặt hình ảnh nhưng lại loại bỏ hoàn toàn ý nghĩa ngữ nghĩa.
Hãy sử dụng phần tử HTML cụ thể nhất có sẵn trước khi dùng đến `<div>` + JavaScript: `<details>/<summary>` cho các accordion, `<dialog>` cho những modal, `<button>` cho các hành động có thể nhấp chuột — những phần tử gốc cung cấp khả năng truy cập bằng bàn phím, hỗ trợ trình đọc màn hình và quản lý trạng thái miễn phí.
Luôn kiểm tra HTML do AI tạo ra về thứ tự phân cấp tiêu đề (một tiêu đề h1, không bỏ qua cấp độ nào), nhãn biểu mẫu (mỗi ô nhập liệu cần có `<label>`) và tính duy nhất của các điểm mốc (những phần tử `<nav>` hoặc `<aside>` lặp lại cần `aria-label` để phân biệt chúng).
Câu 1:
Trang của bạn có 3 khu vực điều hướng: Điều hướng chính, điều hướng thanh bên và điều hướng footer. AI đặt cả ba trong các phần tử `<nav>`. Điều này có đúng không?
GIẢI THÍCH:
Nhiều phần tử `<nav>` là hợp lệ và chính xác — nhưng chỉ khi mỗi phần tử được gắn nhãn để phân biệt chúng. Người dùng trình đọc màn hình điều hướng bằng các mốc: Họ có thể nhảy giữa tất cả các phần tử `<nav>` trên trang. Nếu không có nhãn, họ sẽ nghe thấy từ 'điều hướng' ba lần mà không có ngữ cảnh. `aria-label` giải quyết vấn đề này bằng cách đặt cho mỗi mốc một tên mô tả. Điều này áp dụng cho tất cả các mốc lặp lại.
Câu 2:
Bạn đang xây dựng một phần FAQ. AI tạo ra cấu trúc này: `<div class="faq"><div class="question">How do I...?</div><div class="answer">You can...</div></div>`. Cách tiếp cận nào tốt hơn?
GIẢI THÍCH:
HTML có các phần tử tương tác tích hợp sẵn giúp xử lý khả năng truy cập, điều hướng bằng bàn phím và quản lý trạng thái một cách miễn phí. `<details>/<summary>` cung cấp chức năng mở rộng/thu gọn mà không cần JavaScript. `<dialog>` cung cấp cửa sổ pop-up. `<select>` cung cấp menu drop-down. Trước khi xây dựng các thành phần tùy chỉnh với `<div>` + JavaScript, hãy kiểm tra xem phần tử HTML gốc đã thực hiện những gì bạn cần hay chưa.
Câu 3:
AI tạo ra code HTML này cho một trang bài đăng blog: `<div class="header"><div class="nav">...</div></div><div class="main"><div class="article">...</div></div><div class="footer">...</div>`. Trang trông có vẻ đúng trên trình duyệt. Vậy vấn đề là gì?
GIẢI THÍCH:
Các phần tử Semantic HTML truyền đạt ý nghĩa cho trình duyệt, trình đọc màn hình, công cụ tìm kiếm, và những công cụ khác. Thẻ `<div>` với tên lớp truyền đạt ý nghĩa cho các nhà phát triển đọc code, nhưng không phải cho máy móc xử lý nó. Thẻ `<nav>` tạo ra một điểm mốc mà người dùng trình đọc màn hình có thể nhảy đến. Thẻ `<main>` cho công nghệ hỗ trợ biết nội dung chính bắt đầu từ đâu. Đây là vấn đề số 1 trong HTML do AI tạo ra.
Theo Nghị định 147/2024/ND-CP, bạn cần xác thực tài khoản trước khi sử dụng tính năng này. Chúng tôi sẽ gửi mã xác thực qua SMS hoặc Zalo tới số điện thoại mà bạn nhập dưới đây: