CSS Grid chia trang thành lưới hàng và cột, lý tưởng cho bố cục tổng thể và lưới thẻ.
- Tạo lưới bằng grid-template-columns
- Dùng đơn vị fr, repeat, minmax, auto-fit
- Đặt tên vùng bằng grid-template-areas
- Chọn Flexbox hay Grid
- Grid container
- Phần tử có
display:grid. - fr
- Phần chia của không gian còn trống:
1fr 2fr. - Vùng (area)
- Tên gọi cho một khu vực của lưới.
- Track
- Một hàng hoặc một cột của lưới.
Khái niệm và lý thuyết
Grid chia không gian thành lưới gồm các đường kẻ, rãnh (track) là hàng hoặc cột giữa hai đường, ô là giao của một hàng và một cột, và vùng là tập các ô. Khác Flexbox, Grid định nghĩa khung từ container trước rồi mới đặt item vào, nên rất mạnh cho bố cục tổng thể.
Đơn vị fr là phần chia của không gian còn lại: 1fr 2fr chia 1/3 và 2/3. Hàm repeat(auto-fit, minmax(240px, 1fr)) tạo số cột tự động theo chiều rộng, mỗi cột tối thiểu 240px, đây là kỹ thuật bố cục đáp ứng không cần media query.
| Tiêu chí | Flexbox | Grid |
|---|---|---|
| Chiều | Một chiều | Hai chiều |
| Kích thước quyết định bởi | Nội dung | Lưới định nghĩa trước |
| Dùng cho | Thành phần nhỏ | Khung trang, lưới thẻ |
Hai công cụ bổ sung nhau và thường lồng vào nhau: Grid dựng khung trang, Flexbox căn chỉnh nội dung bên trong từng ô.
Lưới cơ bản
.luoi {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
gap: 20px;
}
/* ba cột, cột giữa rộng gấp đôi */Lưới tự đáp ứng, không cần media query
.the-luoi {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 24px;
}Mỗi cột rộng tối thiểu 240px; khi màn hình hẹp, số cột tự giảm.
Bố cục trang bằng vùng có tên
.trang {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-areas:
"dau dau"
"ben chinh"
"chan chan";
min-height: 100vh;
}
header { grid-area: dau; }
aside { grid-area: ben; }
main { grid-area: chinh; }
footer { grid-area: chan; }
@media (max-width: 700px) {
.trang { grid-template-columns: 1fr;
grid-template-areas: "dau" "chinh" "ben" "chan"; }
}Flexbox hay Grid?
| Tình huống | Chọn |
|---|---|
| Hàng nút, thanh menu, căn giữa | Flexbox |
| Lưới thẻ nhiều hàng nhiều cột | Grid |
| Bố cục tổng thể trang | Grid |
| Nội dung quyết định kích thước | Flexbox |
| Kích thước theo lưới định trước | Grid |
Hai kỹ thuật dùng kết hợp: Grid cho khung, Flexbox cho phần tử bên trong.
Ảnh có kích thước khác nhau nhưng muốn đều nhau:
.anh-luoi { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 8px; }
.anh-luoi img { width: 100%; aspect-ratio: 4/3; object-fit: cover; }Mở DevTools, bật biểu tượng "grid" cạnh phần tử để thấy đường kẻ lưới.
auto-fit và auto-fill khác nhau khi còn dư chỗ: auto-fit kéo giãn cột còn lại, auto-fill giữ ô trống.
- Làm bố cục trang 4 vùng như ví dụ.
- Làm lưới 6 thẻ tự đáp ứng.
- Thử đổi vị trí vùng cho giao diện điện thoại.
- Grid cho bố cục hai chiều.
repeat(auto-fit, minmax())cho lưới tự đáp ứng.grid-template-areaslàm bố cục dễ đọc.