Thuộc tính display
display kiểm soát cách một phần tử chiếm không gian và xếp hàng với các phần tử khác.
| Giá trị | Ứng xử |
|---|---|
block |
Chiếm cả chiều rộng dòng, bắt đầu dòng mới, tuân đầy đủ box model |
inline |
Rộng vừa nội dung, không bắt đầu dòng mới, width/height không có tác dụng, margin trên-dưới bị bỏ qua |
inline-block |
Cùng dòng như inline, nhưng tuân đầy đủ width/height/margin/padding |
none |
Phần tử bị xoá khỏi luồng — không chiếm không gian |
flex |
Container Flexbox |
grid |
Container Grid |
/* Chuyển <span> thành block */
span.badge { display: inline-block; padding: 2px 8px; border-radius: 12px; }
/* Ẩn phần tử */
.modal { display: none; }
.modal.open { display: flex; }
display: none vs visibility: hidden
| Chiếm không gian? | Có thể tương tác? | |
|---|---|---|
display: none |
Không | Không |
visibility: hidden |
Có | Không |
/* Giữ chỗ nhưng ẩn đi */
.placeholder { visibility: hidden; }
overflow
Kiểm soát nội dung tràn ra ngoài box.
| Giá trị | Hành vi |
|---|---|
visible (mặc định) |
Nội dung tràn hiện bình thường |
hidden |
Cắt bỏ phần tràn |
auto |
Cuộn khi cần, không cuộn khi không cần |
scroll |
Luôn hiện thanh cuộn |
clip |
Cắt bỏ, không tạo scrolling context |
.card { overflow: hidden; } /* Cắt ảnh tràn */
.sidebar { overflow-y: auto; } /* Cuộn dọc khi cần */
Cắt văn bản với ellipsis
.truncate {
white-space: nowrap; /* Không xuống dòng */
overflow: hidden; /* Ẩn phần tràn */
text-overflow: ellipsis; /* Hiện "..." */
max-width: 200px;
}
z-index cơ bản
z-index kiểm soát thứ tự xếp chồng khi các phần tử overlap. Chỉ có tác dụng với phần tử có position khác static.
.overlay { position: fixed; z-index: 100; }
.modal { position: fixed; z-index: 200; }
.tooltip { position: absolute; z-index: 300; }
Giá trị
z-indexlớn hơn → phần tử hiển thị phía trên.
Demo: Block vs inline vs inline-block
<h3>Block elements</h3>
<div class="show-block">div block</div>
<div class="show-block">div block second</div>
<h3>Inline elements</h3>
<span class="show-inline">span 1</span>
<span class="show-inline">span 2 width/height ignored</span>
<span class="show-inline">span 3</span>
<h3>Inline-block elements</h3>
<span class="show-inline-block">inline-block 1</span>
<span class="show-inline-block">inline-block 2</span>
<span class="show-inline-block">inline-block 3</span>
<h3>display: none vs visibility: hidden</h3>
<p>Trước: <span class="show-none">Tôi bị display:none</span> Sau.</p>
<p>Trước: <span class="show-hidden">Tôi bị visibility:hidden</span> Sau.</p>
body { font-family: sans-serif; padding: 1rem; }
h3 { font-size: 1rem; color: #555; margin: 1rem 0 .4rem; }
.show-block {
display: block;
background: #cce5ff; border: 1px solid #4472c4;
padding: 8px 12px; margin-bottom: 4px;
width: 200px; /* có tác dụng với block */
}
.show-inline {
display: inline;
background: #d4edda; border: 1px solid #28a745;
padding: 8px 12px;
width: 200px; /* KHÔNG có tác dụng với inline */
height: 60px; /* KHÔNG có tác dụng với inline */
}
.show-inline-block {
display: inline-block;
background: #fff3cd; border: 1px solid #e09a00;
padding: 8px 12px;
width: 120px; /* Có tác dụng */
height: 50px; /* Có tác dụng */
vertical-align: middle;
}
.show-none { display: none; }
.show-hidden { visibility: hidden; }
Demo: overflow và text-overflow ellipsis
<h3>overflow: hidden / auto / scroll</h3>
<div class="boxes-row">
<div>
<p>overflow: visible</p>
<div class="ov ov-visible">Nội dung dài quá chiều rộng của box này sẽ tràn ra ngoài.</div>
</div>
<div>
<p>overflow: hidden</p>
<div class="ov ov-hidden">Nội dung dài quá chiều rộng của box này sẽ bị ẩn đi.</div>
</div>
<div>
<p>overflow: auto</p>
<div class="ov ov-auto">Nội dung dài quá chiều rộng của box này sẽ có thanh cuộn.</div>
</div>
</div>
<h3>text-overflow: ellipsis</h3>
<ul class="trunc-list">
<li class="truncate">Đây là tiêu đề bài viết rất rất rất rất dài không vừa một dòng</li>
<li class="truncate">Một tiêu đề khác cũng rất dài, sẽ bị cắt bằng dấu ba chấm (...)</li>
<li class="truncate">Tên file: very-long-filename-that-does-not-fit-in-column.pdf</li>
</ul>
body { font-family: sans-serif; padding: 1rem; }
h3 { font-size: 1rem; color: #555; margin: 1rem 0 .4rem; }
.boxes-row { display: flex; flex-wrap: wrap; gap: 16px; }
.boxes-row > div { max-width: 160px; }
.boxes-row p { font-size: .8rem; color: #555; margin: 0 0 4px; }
.ov {
width: 140px; height: 60px;
background: #f0f4ff; border: 1px solid #b0c4ff;
padding: 6px; font-size: .85rem;
border-radius: 4px;
}
.ov-visible { overflow: visible; }
.ov-hidden { overflow: hidden; }
.ov-auto { overflow: auto; }
.trunc-list { list-style: none; padding: 0; margin: 0; }
.truncate {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 320px;
padding: 6px 10px;
border-bottom: 1px solid #eee;
font-size: .9rem;
}
.truncate:hover {
background: #f8f8f8;
}
Bình luận