Cách tạo bảng trong HTML
Bảng (table) là một phần tử <table> gồm các hàng (<tr>), và mỗi hàng gồm các ô: <th> cho ô tiêu đề và <td> cho ô dữ liệu.
Bản thân bảng không có viền; quy tắc CSS duy nhất kia thêm viền để bạn nhìn thấy các ô. Các cột hình thành từ các ô: ô đầu tiên của mỗi hàng là cột một, ô thứ hai là cột hai, cứ thế tiếp tục. Mỗi hàng nên có cùng số ô. Xóa một <td> thì hàng đó kết thúc sớm, để lại một khoảng trống.
Ô <th> mặc định in đậm và căn giữa. Đó chỉ là vẻ ngoài; điều quan trọng là chúng là nhãn, và đó là nội dung của phần tiếp theo.
Các phần tử của bảng
| Phần tử | Là gì |
|---|---|
<table> | Bảng |
<caption> | Tiêu đề của bảng, phần tử con đầu tiên của <table> |
<thead> | Nhóm các hàng tiêu đề |
<tbody> | Nhóm các hàng thân bảng (một bảng có thể có nhiều nhóm) |
<tfoot> | Nhóm các hàng chân bảng, như hàng tổng |
<tr> | Một hàng |
<th> | Một ô tiêu đề |
<td> | Một ô dữ liệu |
<colgroup>, <col> | Các cột, để định dạng cả một cột (chiều rộng, nền) |
Viền được trình bày ở viền bảng trong HTML, còn ô trải qua nhiều cột hoặc nhiều hàng ở colspan và rowspan.
Ô tiêu đề, scope và caption
Một bảng có tiêu đề ở hàng trên cùng và dọc cạnh bên cần cho biết mỗi tiêu đề chỉ về hướng nào. scope="col" gắn nhãn cho cột bên dưới, scope="row" gắn nhãn cho hàng bên cạnh. <caption> cho bảng một tiêu đề hiển thị:
Với mã này, trình đọc màn hình khi tới ô 14:00 có thể đọc "Saturday, Closes, 14:00", nên con số không bao giờ bị đọc trơ trọi. Với bảng đơn giản chỉ có một hàng tiêu đề, trình duyệt thường tự suy ra tiêu đề mà không cần scope, nhưng viết thêm chẳng tốn gì và loại bỏ được việc phải đoán.
Caption cũng là thứ trình đọc màn hình đọc lên khi tới bảng. Hãy ưu tiên caption hơn một tiêu đề đặt phía trên bảng, vốn không gắn kết gì với bảng.
thead, tbody và tfoot
Ba nhóm này chia các hàng thành phần đầu, phần thân và phần chân. Phần chân là chỗ đặt hàng tổng:
Hai chi tiết giúp các con số dễ đọc: text-align: end căn thẳng dấu thập phân (mọi giá đều có hai chữ số thập phân), và font-variant-numeric: tabular-nums cho mọi chữ số cùng độ rộng.
Nếu bạn viết <tr> trực tiếp bên trong <table>, như trong ví dụ đầu tiên, trình duyệt vẫn tự thêm <tbody> bao quanh các hàng. Đó là lý do một selector CSS như table > tr không bao giờ khớp với gì: trên trang, các hàng nằm bên trong tbody. Hãy dùng table tr, hoặc tự viết <tbody>.
Định dạng bảng: hàng xen màu, hover và chiều rộng
:nth-child tô màu xen kẽ các hàng, :hover làm nổi hàng đang ở dưới con trỏ chuột, và width: 100% kéo bảng rộng hết khối chứa:
text-align: start căn chữ tiêu đề thẳng với dữ liệu bên dưới; nếu không, th sẽ căn giữa. Dùng start thay vì left giữ cho cách căn đúng với các ngôn ngữ viết từ phải sang trái.
Bảng responsive cuộn được
Bảng không thể co nhỏ hơn chiều rộng nội dung của nó. Trên điện thoại, một bảng rộng sẽ đẩy cả trang lệch sang ngang. Thay vào đó, hãy bọc bảng trong một khối chứa cuộn được:
Ở đây khối chứa bị giới hạn 300 pixel để đóng vai màn hình điện thoại; hãy cuộn nó sang ngang. tabindex="0" cho người dùng bàn phím focus vào khối chứa và cuộn nó bằng phím mũi tên, còn role="region" cùng aria-label đặt tên cho điểm dừng đó.
Bảng dành cho dữ liệu
Hãy dùng bảng khi nội dung thật sự có hàng và cột: bảng giá, lịch, so sánh, kết quả. Đừng dùng bảng để đặt các thứ cạnh nhau trên trang. Bảng dàn bố cục làm trình đọc màn hình bối rối, vì nó đọc ra những hàng và cột chẳng có nghĩa gì, và không thể thích ứng với màn hình nhỏ. Bố cục là việc của CSS flexbox và grid.
Lỗi thường gặp
- Các hàng có số ô khác nhau. Hàng ngắn kết thúc sớm và các cột không còn thẳng hàng.
- Dùng
<td>có chữ đậm làm tiêu đề. Hãy dùng<th>để tiêu đề là nhãn thật sự. - Các thuộc tính lỗi thời
border,cellpadding,cellspacing,bgcolorvàalign. Hãy dùng CSS. - Đặt nội dung trực tiếp trong
<tr>hoặc<table>, bên ngoài mọi ô. Trình duyệt đưa nội dung đó ra khỏi bảng, thường là lên phía trên. - Một tiêu đề phía trên bảng thay vì
<caption>. table > trtrong CSS. Trình duyệt đã chèn thêm<tbody>; hãy viếttable trhoặctbody tr.
Câu hỏi thường gặp
Làm sao tạo bảng trong HTML?
Bọc bảng trong <table>, viết một <tr> cho mỗi hàng, và đặt các ô bên trong: <th> cho ô tiêu đề và <td> cho ô dữ liệu. Mỗi hàng nên có cùng số ô, trừ khi có ô trải qua nhiều cột.
th và td khác nhau thế nào?
<th> là ô tiêu đề, dùng để gắn nhãn cho một cột hoặc một hàng, còn <td> là ô dữ liệu. Trình duyệt hiển thị <th> in đậm và căn giữa, và trình đọc màn hình đọc tiêu đề tương ứng trước mỗi ô dữ liệu để các con số có nghĩa.
thead, tbody và tfoot dùng để làm gì?
Chúng nhóm các hàng thành phần đầu, phần thân và phần chân (hàng tổng) của bảng. Chúng làm rõ cấu trúc cho công nghệ hỗ trợ, cho CSS thứ để nhắm tới, và khi in một bảng dài, trình duyệt có thể lặp lại <thead> trên mỗi trang.
Vì sao bảng HTML không có viền?
Bảng mặc định không có viền. Hãy thêm viền bằng CSS: table { border-collapse: collapse; } th, td { border: 1px solid #ccc; }. Thuộc tính cũ border="1" đã lỗi thời.
Làm sao để bảng HTML responsive?
Đặt bảng trong một khối chứa có overflow-x: auto. Trên màn hình hẹp, bảng sẽ cuộn ngang bên trong khối chứa thay vì làm cả trang rộng ra.