Bài 12 · Vận dụng · 26 phút
Dự án: trang tin tức
Biên soạn bởi Nguyễn Anh Tuấn
Dự án 2: trang bài báo bằng HTML semantic - article với header (tựa, tác giả, time), section nội dung, aside tin liên quan, breadcrumb - tốt cho SEO.
Dự án trước là trang web bán hàng (nhiều sản phẩm nhỏ). Lần này đổi món: một trang bài báo - chủ yếu là MỘT bài viết dài. Bố cục vì thế khác hẳn, và sẽ dùng tới vài thẻ semantic mà trang bán hàng chưa đụng. Cùng nhìn bản đồ trang trước:
- ▸Cả bài báo nằm trong MỘT article lớn.
- ▸article có header riêng bên trong (tựa, tác giả, ngày đăng).
- ▸Kèm breadcrumb (nav) và aside "tin liên quan".
Vì cả bài là một mẩu nội dung độc lập, ta bọc nó trong một <article>. Phần mở đầu của bài (tựa, tác giả, ngày đăng) gom vào một <header> - đặt bên trong article, không phải header đầu trang.
bai-bao.html · article với header riêng (mở .html bằng trình duyệt)
<article>
<header>
<h1>Mèo con đầu tiên tốt nghiệp lớp HTML</h1>
<p>Tác giả: Mun · <time datetime="2026-06-01">ngày 1 tháng 6, 2026</time></p>
</header>
<!-- thân bài ở đây -->
</article> header không chỉ có một
Ngày đăng là thông tin quan trọng của một bài báo. Đánh dấu nó bằng <time>. Mẹo hay: phần chữ bên trong viết cho người đọc thoải mái, còn thuộc tính datetime ghi theo định dạng chuẩn cho máy đọc chính xác.
time.html · một mốc, hai cách đọc
<time datetime="2026-06-01">ngày 1 tháng 6, 2026</time> Dù mèo con viết ngày bằng lời kiểu gì ("mùng 1/6", "1 tháng 6"…), máy vẫn hiểu đúng nhờ datetime="2026-06-01" theo chuẩn năm-tháng-ngày. Đây chính là kiểu đánh dấu giúp Google biết bài đăng ngày nào.
- ▸time đánh dấu một mốc thời gian.
- ▸Chữ bên trong: cho người đọc; datetime: cho máy đọc theo chuẩn.
- ▸Định dạng datetime ngày: năm-tháng-ngày (vd 2026-06-01).
Thân bài dài nên chia thành các <section> theo mục, mỗi mục một h2. Phía trên cùng đặt breadcrumb - đường dẫn phân cấp cho biết bài nằm ở đâu - bằng một nav bọc danh sách có thứ tự ol. Bên lề là <aside> cho "tin liên quan".
cau-truc-bao.html · breadcrumb, section thân bài, aside (rút gọn)
<nav aria-label="Breadcrumb">
<ol>
<li><a href="/">Trang chủ</a></li>
<li><a href="/tin-tuc">Tin tức</a></li>
<li>Mèo con tốt nghiệp</li>
</ol>
</nav>
<article>
<header>…</header>
<section>
<h2>Chuyện gì đã xảy ra</h2>
<p>…</p>
</section>
<aside>
<h2>Tin liên quan</h2>
<ul>
<li><a href="#">Mèo con tập bơi</a></li>
</ul>
</aside>
</article> - ▸Thân bài chia section theo mục, mỗi section một h2.
- ▸Breadcrumb = nav bọc ol (có thứ tự); cấp cuối thường không phải link.
- ▸aside chứa "tin liên quan" - nội dung phụ bên lề bài.
Để ý điều hay: mèo con không cần nói riêng với Google "đây là bài báo". Chính cách đánh dấu đã nói hộ: article = một bài, header + h1 = tựa, time datetime = ngày đăng, tên tác giả nằm trong header. Semantic đúng là tự khai báo nội dung.
Nối với bài SEO
Trước khi coi là xong, chạy checklist tự kiểm:
- ▸Cả bài nằm trong một article; article có header riêng (h1 + tác giả + time).
- ▸time có datetime đúng chuẩn năm-tháng-ngày.
- ▸Thân bài chia section, mỗi section có h2; chỉ một h1.
- ▸Breadcrumb bằng nav + ol; tin liên quan bằng aside.
- ▸head có title + meta description (đã học ở bài SEO).
Bước tiếp theo
Câu hỏi thường gặp
header không phải duy nhất mỗi trang. Nó đánh dấu "phần đầu" của khối chứa nó: header của body là đầu trang, header trong một article là đầu của BÀI VIẾT đó (tựa, tác giả, ngày đăng). Tương tự, một article cũng có thể có footer riêng. Cùng thẻ, vai trò tuỳ nơi đặt.
time đánh dấu một mốc thời gian. Phần chữ bên trong là cho NGƯỜI đọc (vd "ngày 1 tháng 6, 2026"); thuộc tính datetime là cho MÁY đọc theo định dạng chuẩn (2026-06-01). Nhờ datetime, Google và máy biết chính xác ngày đăng dù mèo con viết ngày bằng lời thế nào.
Một nav bọc một danh sách có thứ tự ol, mỗi cấp là một li. Breadcrumb có thứ tự (Trang chủ rồi mới tới mục con) nên ol hợp hơn ul. Bọc trong nav để máy hiểu đây là một khu điều hướng. Thêm aria-label="Breadcrumb" cho nav để rõ nghĩa.
Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.
Trả lời vài câu để chắc rằng em đã nắm bài.
Thẻ <time datetime="2026-06-01"> dùng để làm gì?
- 1
header của bài báo
Viết phần header bên trong article cho một bài báo: tựa (h1), tên tác giả, và ngày đăng bằng thẻ time.
✅ Hoàn thành khi: article chứa <header> có một h1 (tựa), tên tác giả, và <time datetime="..."> cho ngày đăng.
- 2
time đúng cách
Viết thẻ time hiển thị "ngày 1 tháng 6, 2026" cho người đọc nhưng máy đọc được mốc 2026-06-01.
✅ Hoàn thành khi: <time datetime="2026-06-01">ngày 1 tháng 6, 2026</time> - phần chữ cho người, datetime cho máy.
- 3
Breadcrumb
Viết breadcrumb "Trang chủ > Tin tức > Bài này" đúng semantic.
✅ Hoàn thành khi: Một <nav> (aria-label="Breadcrumb") bọc <ol> với các <li>, hai cấp đầu là liên kết a.
- 4
Chia thân bài
Cho thân một bài báo dài. Chia nó thành 2 section, mỗi section có một tiêu đề (h2).
✅ Hoàn thành khi: Thân article có 2 <section>, mỗi section mở đầu bằng h2; h1 vẫn là tựa bài.
- 5
Tin liên quan
Thêm khu "Tin liên quan" cho trang báo bằng thẻ đúng vai trò, chứa một danh sách liên kết.
✅ Hoàn thành khi: Có <aside> với heading "Tin liên quan" và một <ul> các liên kết a tới bài khác.
- 6
Chạy checklist
Rà trang báo hoàn chỉnh theo checklist trong bài và sửa mọi điểm chưa đạt.
✅ Hoàn thành khi: Đạt: article bọc bài; header có h1+tác giả+time(datetime); section có h2; aside cho tin liên quan; breadcrumb nav+ol; meta đủ.