Menu

Thẻ HTML: thẻ mở, thẻ đóng, thẻ rỗng và lồng thẻ

Thẻ HTML đánh dấu nội dung để trình duyệt biết từng phần là gì: tiêu đề, đoạn văn, liên kết, hình ảnh. Tìm hiểu cách thẻ và phần tử hoạt động, thẻ nào không có thẻ đóng, cách lồng thẻ và những thẻ bạn sẽ dùng nhiều nhất.

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.

Thẻ HTML là gì

Thẻ HTML là một cái tên đặt trong dấu ngoặc nhọn, dùng để đánh dấu một phần nội dung. Hầu hết các thẻ đi theo cặp: một thẻ mở như <p> và một thẻ đóng có dấu gạch chéo như </p>. Mọi thứ nằm giữa chúng là nội dung, và cả khối đó gọi là một phần tử (element).

Đổi <h1> thành <h2> (cả thẻ mở lẫn thẻ đóng) và tiêu đề sẽ nhỏ đi. Chính tên thẻ cho trình duyệt biết nội dung đó là gì.

Cấu tạo: thẻ, thuộc tính và phần tử

<a href="/docs/html/links" class="nav">Links</a>
Thành phầnTrong ví dụ
Thẻ mở<a href="/docs/html/links" class="nav">
Tên thẻa
Thuộc tínhhref="/docs/html/links" và class="nav"
Nội dungLinks
Thẻ đóng</a>
Phần tửtất cả những phần trên gộp lại

Thuộc tính luôn nằm trong thẻ mở, không bao giờ nằm trong thẻ đóng. Xem chi tiết ở trang thuộc tính.

Tên thẻ không phân biệt chữ hoa chữ thường: <P> và <p> là một. Hãy viết bằng chữ thường.

Thẻ rỗng: không có thẻ đóng

Một số phần tử không thể chứa gì bên trong, nên chúng chỉ có thẻ mở. Chúng được gọi là phần tử rỗng (void element), nhiều người còn gọi là thẻ tự đóng:

Danh sách đầy đủ: area, base, br, col, embed, hr, img, input, link, meta, source, track, wbr.

Bạn có thể viết chúng thành <br /> với dấu gạch chéo. Trong HTML, dấu gạch chéo này không có tác dụng gì; nó được cho phép để code theo kiểu XHTML vẫn chạy được. Dấu gạch chéo trên một thẻ thường, như <div />, cũng bị bỏ qua, nghĩa là div đó vẫn đang mở.

Lồng thẻ

Phần tử có thể nằm bên trong phần tử khác. Quy tắc là: đóng thẻ theo thứ tự ngược với lúc mở. Thẻ mở sau cùng phải được đóng đầu tiên.

<p>This is <strong>very <em>important</em></strong>.</p>   <!-- correct -->
<p>This is <strong>very <em>important</strong></em>.</p>   <!-- wrong -->

Trình duyệt không từ chối code lồng sai. Nó tự sửa, và cách sửa không phải lúc nào cũng đúng ý bạn. Ví dụ này đưa hai đoạn code lồng sai cho bộ phân tích của trình duyệt và in ra cấu trúc mà nó thực sự dựng nên:

Có hai lần sửa xảy ra. Cặp <b> và <i> chồng lên nhau bị tách thành thêm phần tử. Còn <p> không thể chứa <div>, nên trình duyệt đóng đoạn văn trước div và biến thẻ </p> bị thừa thành một đoạn văn mới, rỗng. Khi CSS hay JavaScript chạy khác thường, lồng thẻ sai là một trong những thứ đầu tiên cần kiểm tra.

Phần tử block và inline

Hầu hết các thẻ thuộc một trong hai nhóm hiển thị. Phần tử block (div, p, h1 đến h6, ul, section) bắt đầu trên một dòng mới và chiếm toàn bộ chiều rộng. Phần tử inline (span, a, strong, em, code) nằm trong một dòng chữ và chỉ rộng bằng nội dung của nó.

Các khung màu xanh trải dài hết trang; các khung màu hổ phách chỉ bao quanh phần chữ. CSS có thể thay đổi điều này bằng thuộc tính display, nhưng mỗi thẻ đều bắt đầu với giá trị mặc định của nó. Xem div và span để biết về hai phần tử chứa chung chung này.

Các thẻ HTML thường dùng nhất

ThẻCông dụng
<html>, <head>, <body>Khung sườn của tài liệu
<title>, <meta>, <link>Thông tin trang trong phần head
<h1> đến <h6>Tiêu đề
<p>Đoạn văn
<a>Liên kết
<img>Hình ảnh
<ul>, <ol>, <li>Danh sách
<strong>, <em>Chữ quan trọng và chữ nhấn mạnh
<br>, <hr>Xuống dòng, đường phân cách chủ đề
<div>, <span>Phần tử chứa chung dạng block và inline
<table>, <tr>, <th>, <td>Bảng
<form>, <input>, <label>, <button>Form
<header>, <nav>, <main>, <footer>, <section>, <article>Cấu trúc trang có ngữ nghĩa

Muốn có một danh sách gọn trong một trang để in ra, xem cheat sheet HTML.

Thẻ không tồn tại

Nếu bạn gõ một thẻ mà trình duyệt không biết, nó không báo lỗi. Nó tạo một phần tử không xác định, hiển thị nội dung và coi phần tử đó là inline:

Một thẻ không xác định không mang ý nghĩa gì với công cụ tìm kiếm hay trình đọc màn hình, vì vậy hãy ưu tiên dùng thẻ có thật. Nếu bạn tự xây component bằng JavaScript, hãy đặt tên có dấu gạch nối (user-badge): tên có dấu gạch nối được dành riêng cho phần tử tùy chỉnh và không bao giờ trùng với thẻ HTML sau này.

Lỗi thường gặp

  • Quên thẻ đóng. Thiếu </a> hay </strong> sẽ biến phần còn lại của trang thành liên kết hoặc chữ đậm. Trình duyệt tự đóng một số thẻ cho bạn (</p>, </li>), nhưng không đóng các thẻ này.
  • Đóng một thẻ rỗng. </br> và </img> không hợp lệ. Trình duyệt thậm chí đọc </br> thành một thẻ mở <br>, nên <br></br> cho ra hai lần xuống dòng.
  • Thẻ chồng lên nhau. Đóng theo thứ tự ngược: <b><i>x</i></b>, không bao giờ <b><i>x</b></i>.
  • Đặt phần tử block trong đoạn văn. Một <div>, danh sách hay tiêu đề nằm trong <p> sẽ kết thúc đoạn văn sớm. Hãy dùng <div> làm phần tử bao ngoài.
  • Chọn thẻ vì vẻ ngoài. Dùng <h2> vì đó là tiêu đề, không phải vì nó to. Cỡ chữ và độ đậm thuộc về CSS.

Câu hỏi thường gặp

Thẻ HTML và phần tử HTML khác nhau thế nào?

Thẻ là phần đánh dấu bạn gõ, như <p> hay </p>. Phần tử là toàn bộ thứ trình duyệt tạo ra từ đó: thẻ mở, các thuộc tính, nội dung và thẻ đóng. <p>Hi</p> gồm hai thẻ tạo thành một phần tử p.

Những thẻ HTML nào không cần thẻ đóng?

Phần tử rỗng (void element) không thể chứa nội dung nên không có thẻ đóng: <br>, <hr>, <img>, <input>, <meta>, <link>, <source>, <track>, <wbr>, <area>, <base>, <col> và <embed>.

Nên viết <br> hay <br />?

Cả hai đều là HTML hợp lệ. Dấu gạch chéo ở cuối được phép dùng với phần tử rỗng và trình duyệt bỏ qua nó. Với thẻ không rỗng như <div />, dấu gạch chéo cũng bị bỏ qua, nên div vẫn mở cho đến khi gặp </div>.

Thẻ HTML có phân biệt chữ hoa chữ thường không?

Không. <P> và <p> tạo ra cùng một phần tử, và mọi cách trộn chữ hoa chữ thường cũng vậy. Chữ thường là phong cách chuẩn và là thứ hầu hết công cụ định dạng xuất ra.

HTML có bao nhiêu thẻ?

Chuẩn HTML hiện nay định nghĩa hơn 100 phần tử, nhưng các trang web hằng ngày chỉ dùng khoảng 20 đến 30 trong số đó: tiêu đề, đoạn văn, liên kết, hình ảnh, danh sách, div, span, form và các thẻ bố cục ngữ nghĩa.

Điều gì xảy ra nếu dùng một thẻ không tồn tại?

Trình duyệt vẫn tạo một phần tử cho nó, hiển thị nội dung bên trong và coi nó là phần tử inline không mang ý nghĩa đặc biệt. Phần tử tùy chỉnh (custom element) được phép nếu tên có dấu gạch nối, như <user-card>.

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