Menu

CSS display: block, inline, inline-block, none và flex

Thuộc tính display quyết định cách một phần tử tham gia vào bố cục. Tìm hiểu block, inline và inline-block qua các hộp đặt cạnh nhau có đo kích thước, display none khác visibility hidden thế nào, và vị trí của flex, grid, flow-root và contents.

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.

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:

blockinlineinline-block
Bắt đầu trên dòng mớiCóKhôngKhông
Chiều rộng mặc địnhChiếm hết phần tử chứaVừa nội dungVừa nội dung
width và heightCó tác dụngBị bỏ quaCó tác dụng
Margin theo chiều dọcCó tác dụngBị bỏ quaCó 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ìnhdiv, p, h1, ul, sectionspan, a, strong, embutton, 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: nonevisibility: hiddenopacity: 0
Chiếm chỗKhôngCóCó
Bấm đượcKhôngKhôngCó
Được trình đọc màn hình đọcKhôngKhôngCó
Tạo hiệu ứng chuyển động mượt đượcKhôngKhôngCó

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: flex xế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-rootMộ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
contentsHộ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-itemMột block có dấu đầu dòng, mặc định của li
table, table-row, table-cellBố cục kiểu bảng trên các phần tử không phải bảng
inline-flex, inline-gridMột container flex hoặc grid nằm inline

Lỗi thường gặp

  • Đặt width hoặc height cho span hoặc a. Phần tử inline bỏ qua chúng. Hãy dùng inline-block hoặc block.
  • 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 display ghi đè thuộc tính hidden. Quy tắc CSS thắng.
  • Tạo hiệu ứng chuyển động cho display. Đặt display: none ẩn phần tử ngay lập tức, không mờ dần; hãy tạo hiệu ứng cho opacity rồi chuyển display (hoặc visibility) ở 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.

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