display làm gì
Mỗi phần tử có một giá trị display quyết định cách nó được bố trí. Ba giá trị bạn gặp đầu tiên là block, inline và inline-block. Dưới đây là ba hộp giống hệt nhau, cùng width, height, padding và margin, chỉ khác display:
block | inline | inline-block | |
|---|---|---|---|
| Bắt đầu trên dòng mới | Có | Không | Không |
| Chiều rộng mặc định | Chiếm hết phần tử chứa | Vừa nội dung | Vừa nội dung |
width và height | Có tác dụng | Bị bỏ qua | Có tác dụng |
| Margin theo chiều dọc | Có tác dụng | Bị bỏ qua | Có tác dụng |
| Padding theo chiều dọc | Đẩy nội dung | Được vẽ, nhưng không đẩy các dòng ra xa nhau | Đẩy nội dung |
| Phần tử điển hình | div, p, h1, ul, section | span, a, strong, em | button, input, img (phần tử thay thế hoạt động như vậy) |
Trong khung xem trước, hộp block nằm riêng một dòng với chiều rộng 120px. Hộp inline bỏ qua width và height, chỉ bao quanh từ của nó, còn padding dọc và viền của nó lòi ra phía trên và phía dưới dòng mà không làm dòng cao thêm. Hộp inline-block nằm trong dòng chữ nhưng giữ nguyên kích thước đầy đủ.
display: block
Phần tử block chiếm toàn bộ chiều rộng còn trống và đẩy mọi thứ phía sau xuống dòng mới. Biến một liên kết thành block là cách làm cho cả một hàng bấm được:
.menu a {
display: block; /* the full row is the link */
padding: 10px 16px;
}
Chiều rộng của block đặt được, và khi đã có chiều rộng thì margin: 0 auto sẽ căn giữa nó, như trang căn giữa div trình bày.
display: inline-block
inline-block là lựa chọn ở giữa: nó chảy trong dòng như một từ, nhưng bạn đặt được kích thước cho nó. Nó hữu ích cho nhãn, nút và biểu tượng nằm trong dòng chữ:
Nhiều hộp inline-block trên một hàng sẽ có một khoảng hở nhỏ giữa chúng do khoảng trắng trong HTML. Với các hàng hộp, display: flex trên phần tử cha là công cụ tốt hơn.
display: none và visibility: hidden
Cả hai đều làm phần tử vô hình. Khác biệt nằm ở chỗ nó có giữ lại chỗ của mình hay không:
display: none | visibility: hidden | opacity: 0 | |
|---|---|---|---|
| Chiếm chỗ | Không | Có | Có |
| Bấm được | Không | Không | Có |
| Được trình đọc màn hình đọc | Không | Không | Có |
| Tạo hiệu ứng chuyển động mượt được | Không | Không | Có |
Thuộc tính HTML hidden làm điều tương tự display: none thông qua stylesheet của trình duyệt, nghĩa là bất kỳ quy tắc CSS nào đặt display cho phần tử (ví dụ .card { display: flex; }) đều ghi đè nó và phần tử lại hiện ra. Thêm [hidden] { display: none !important; } nếu bạn gặp phải chuyện này.
Để ẩn một thứ về mặt hiển thị nhưng vẫn giữ cho trình đọc màn hình (ví dụ nhãn cho một nút chỉ có biểu tượng), hãy dùng một class "visually hidden" thay cho display: none.
display: flex và display: grid
Hai giá trị này biến một phần tử thành container bố cục cho các phần tử con của nó:
display: flexxếp các phần tử con thành một hàng hoặc một cột, có thể điều khiển căn chỉnh và khoảng cách. Xem flexbox.display: gridđặt các phần tử con theo hàng và cột cùng lúc.
Bản thân container vẫn là một block. inline-flex và inline-grid làm điều tương tự với các phần tử con nhưng cho container chảy inline, giống inline-block.
Các giá trị khác
| Giá trị | Tác dụng |
|---|---|
flow-root | Một block chứa trọn các float bên trong và ngăn margin của phần tử con tràn ra ngoài; cách "clearfix" hiện đại |
contents | Hộp của chính phần tử biến mất và các phần tử con hoạt động như con của phần tử cha của nó. Tránh dùng cho nút, danh sách và bảng: một số trình duyệt làm mất ý nghĩa của phần tử đối với trình đọc màn hình |
list-item | Một block có dấu đầu dòng, mặc định của li |
table, table-row, table-cell | Bố cục kiểu bảng trên các phần tử không phải bảng |
inline-flex, inline-grid | Một container flex hoặc grid nằm inline |
Lỗi thường gặp
- Đặt
widthhoặcheightchospanhoặca. Phần tử inline bỏ qua chúng. Hãy dùnginline-blockhoặcblock. - Margin theo chiều dọc trên phần tử inline. Cũng bị bỏ qua. Cách sửa tương tự.
- Dùng
display: noneđể ẩn chữ dành cho trình đọc màn hình. Nó ẩn luôn cả với trình đọc màn hình. - Mong phần tử con hiện ra bên trong phần tử cha
display: none. Không có gì bên trong phần tử cha bị ẩn được hiển thị. - Một quy tắc
displayghi đè thuộc tínhhidden. Quy tắc CSS thắng. - Tạo hiệu ứng chuyển động cho
display. Đặtdisplay: noneẩn phần tử ngay lập tức, không mờ dần; hãy tạo hiệu ứng choopacityrồi chuyểndisplay(hoặcvisibility) ở cuối.
Câu hỏi thường gặp
block, inline và inline-block khác nhau thế nào?
Phần tử block bắt đầu trên một dòng mới và chiếm hết chiều rộng còn trống. Phần tử inline chảy trong dòng chữ và bỏ qua width, height cùng margin theo chiều dọc. inline-block chảy trong dòng chữ như inline nhưng nhận width, height, padding và margin như một block.
display: none làm gì?
Nó gỡ hoàn toàn phần tử khỏi trang: không chiếm chỗ, không được hiển thị, và bị ẩn khỏi trình đọc màn hình. Các phần tử con bị ẩn theo và không thể hiện ra bằng giá trị display riêng của chúng.
display: none và visibility: hidden khác nhau thế nào?
display: none gỡ cả phần tử lẫn chỗ của nó. visibility: hidden làm phần tử vô hình nhưng giữ lại chỗ của nó trong bố cục, nên không có gì bị xê dịch.
Mặc định div là block hay inline?
Block. div, p, các thẻ tiêu đề, ul, section và form mặc định là block; span, a, strong, em, img, input và button là inline hoặc inline-block.
Vì sao giữa các phần tử inline-block lại có khoảng hở?
Khoảng trắng giữa các thẻ trong HTML được hiển thị thành một dấu cách, giống như giữa các từ. Thay vào đó, hãy dùng display: flex với gap trên phần tử cha, hoặc xóa khoảng trắng.