Bài toán cần giải quyết
Ta có box A và box B có chiều cao co giãn theo chiều cao dữ liệu từng box, nếu dữ liệu trong box A nhiều hơn box B thì chiều cao của 2 box sẽ khác nhau. Cấu trúc HTML của hai box thường là div thì không có mối liên hệ giữa hai div, nên không thể làm cho chiều cao của box này có liên hệ đến chiều cao của box kia để tự động điều chỉnh chiều cao cho bằng nhau.<div id="news"> <div class="sport-news">John Brewin watched a Mesut Ozil-inspired Germany book a second round date with old rivals England.</div> <div class="hot-news">Julia Gillard has become Australia's first female prime minister after Kevin Rudd stood aside at the last minute in Canberra Thursday morning before a leadership ballot.</div> </div>
Bài viết giả định người đọc hiểu rõ lý do tại sao không nên dùng table để làm cấu trúc 2 box A và B, mà chỉ có thể dùng div.
class="sport-news"
) còn box B sẽ là box tin nóng (class="hot-news"
). Chúng ta thấy nội dung của chúng khác nhau và điều này sẽ dẫn tới chiều cao của chúng cũng sẽ khác nhau. Đoạn CSS sau là để thêm màu sắc cho từng box để thấy rõ sự khác biệt của chiều cao 2 box.div#news .sport-news { background: #ff0; float: left; padding: 10px; width: 180px; } div#news .hot-news { background: #f00; float: left; padding: 10px; width: 180px; }
Kết quả:

Hướng giải quyết: Box hiển thị như table (display: table)
display:table
.display: table
để biến box thành một table
, display: table-row
để biến box thành một tr
, và display: table-cell
để biến box thành một td
.Đối với thẻ (
table
), trên cùng một hàng (tr
), thì các ô (td
) sẽ có chiều cao giống nhau. Như vậy cấu trúc HTML của chúng ta sẽ sửa lại theo hướng mà theo đó, chúng ta phải có cả table, tr và td.<div id="news" class="table clearfix"> <div class="table-row"> <div class="sport-news table-cell">John Brewin watched a Mesut Ozil-inspired Germany book a second round date with old rivals England.</div> <div class="hot-news table-cell">Julia Gillard has become Australia's first female prime minister after Kevin Rudd stood aside at the last minute in Canberra Thursday morning before a leadership ballot.</div> </div> </div>
Trong bài viết thì box là nói về hiển thị vật lý (mắt thấy) của hai box A và B trong ví dụ, còn div là thẻ HTML được dùng để tạo ra hiển thị vật lý đó, vì vậy ý nghĩa của box và div được dùng tùy theo ngữ cảnh để hiểu, không mang ý nghĩa tương đồng và có ý nghĩa khác nhau trong ngữ cảnh khác nhau.
Chú thích:
- Chúng ta thêm 1 div bao ngoài cho 2 box, để “xem” nó như là 1
tr
. - Chúng ta thêm
class="table"
vào div news: Như vậy div news sẽ là table. - Chúng ta thêm
class="table-row"
vào div bao ngoài cho 2 box (div mà ta mới thêm vào): Như vậy div này sẽ là row. - Chúng ta thêm
class="table-cell"
vào 2 div sport-news và hot-news: Như vậy 2 div này sẽ là 2 cell nằm trên cùng một row.
display: table-cell
div#news .sport-news { background: #ff0; padding: 10px; width: 180px; } div#news .hot-news { background: #f00; padding: 10px; width: 180px; }Tiếp đến, chúng ta thêm 3 class vào source CSS để apply các thuộc tính của table và các box của chúng ta:
.table { display: table; } .table-row { display: table-row; } .table-cell { display: table-cell; }
Kết quả:
Source Code đầy đủ:
<div id="news" class="table clearfix"> <div class="table-row"> <div class="sport-news table-cell">John Brewin watched a Mesut Ozil-inspired Germany book a second round date with old rivals England.</div> <div class="hot-news table-cell">Julia Gillard has become Australia's first female prime minister after Kevin Rudd stood aside at the last minute in Canberra Thursday morning before a leadership ballot.</div> </div> </div>
div#news .sport-news { background: #ff0; padding: 10px; width: 180px; } div#news .hot-news { background: #f00; padding: 10px; width: 180px; } .table { display: table; } .table-row { display: table-row; } .table-cell { display: table-cell; }