CSS Grid là hệ thống layout mạnh mẽ nhất của CSS hiện nay, cho phép xây dựng giao diện theo hàng và cột một cách trực quan. Nếu Flexbox phù hợp cho việc sắp xếp nội dung theo một chiều, thì Grid được thiết kế để xây dựng các layout hai chiều phức tạp như dashboard, landing page, admin panel và các giao diện responsive hiện đại.
CSS Grid (Grid Layout) là một module layout giúp chia giao diện thành các hàng (rows) và cột (columns).
Có thể hình dung Grid giống như bảng Excel:
+-----+-----+-----+
| A | B | C |
+-----+-----+-----+
| D | E | F |
+-----+-----+-----+
Mỗi ô trong bảng có thể chứa nội dung độc lập.
Quy tắc phổ biến hiện nay:
Khi khai báo:
.container {
display: grid;
}
Phần tử đó trở thành Grid Container.
Các phần tử con trực tiếp sẽ trở thành Grid Items.
<div class="container">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>
Thuộc tính quan trọng nhất trong Grid.
Dùng để định nghĩa số lượng cột.
.container {
display: grid;
grid-template-columns: 200px 200px 200px;
}
Kết quả:
+------+------+
| 1 | 2 |
+------+------+
| 3 |
+------+
fr (fraction) là đơn vị đặc biệt của Grid dùng để chia phần không gian còn lại.
.container {
grid-template-columns: 1fr 1fr 1fr;
}
Kết quả:
+---------+---------+---------+
| 1 | 2 | 3 |
+---------+---------+---------+
.container {
grid-template-columns: 1fr 2fr 1fr;
}
Cột thứ 2 rộng gấp đôi hai cột còn lại.
+-----+-----------+-----+
| 1 | 2 | 3 |
+-----+-----------+-----+
Giúp viết ngắn gọn hơn.
grid-template-columns: repeat(4, 1fr);
Tương đương:
grid-template-columns:
1fr 1fr 1fr 1fr;
.container {
display: grid;
grid-template-columns:
repeat(5, 1fr);
grid-template-rows:
repeat(3, 100px);
gap: 10px;
}
Kết quả:
+---+---+---+---+---+
| 1 | 2 | 3 | 4 | 5 |
+---+---+---+---+---+
| 6 | 7 | 8 | 9 |10 |
+---+---+---+---+---+
|11 |12 |13 |14 |15 |
+---+---+---+---+---+
Tạo khoảng cách giữa các ô.
.container {
gap: 20px;
}
Có thể tách riêng:
row-gap: 10px;
column-gap: 20px;
Định nghĩa chiều cao các hàng.
.container {
grid-template-rows:
100px
200px
300px;
}
Căn item theo chiều ngang trong từng ô.
.container {
justify-items: center;
}
Giá trị:
Căn item theo chiều dọc trong từng ô.
.container {
align-items: center;
}
Viết tắt của:
justify-items: center;
align-items: center;
Ví dụ:
.container {
place-items: center;
}
Cho phép item chiếm nhiều cột.
<div class="item big">1</div>
.big {
grid-column: span 2;
}
Kết quả:
+-----------+-----------+
| 1 |
+-----------+-----------+
Cho phép item chiếm nhiều hàng.
.big {
grid-row: span 2;
}
Đặt tên vùng cho item.
.header {
grid-area: header;
}
Xây dựng layout theo tên vùng.
.container {
display: grid;
grid-template-areas:
"header header"
"sidebar content"
"footer footer";
}
Kết quả:
+---------------------+
| HEADER |
+---------+-----------+
| SIDEBAR | CONTENT |
+---------+-----------+
| FOOTER |
+---------------------+
Cho phép xác định kích thước tối thiểu và tối đa.
grid-template-columns:
repeat(3, minmax(200px, 1fr));
Ý nghĩa:
Một trong những tính năng mạnh nhất của Grid.
.cards {
display: grid;
grid-template-columns:
repeat(
auto-fit,
minmax(250px, 1fr)
);
gap: 20px;
}
Grid sẽ tự động tính số lượng cột phù hợp theo kích thước màn hình.
1 2 3 4
1 2
3 4
1
2
3
4
Không cần media query vẫn responsive tốt.
<div class="dashboard">
<aside class="sidebar">
Sidebar
</aside>
<main class="content">
Content
</main>
</div>
.dashboard {
display: grid;
grid-template-columns:
250px 1fr;
height: 100vh;
}
Kết quả:
+---------+------------------+
| Sidebar | Content |
+---------+------------------+
| Loại | Thuộc tính | Mục đích |
|---|---|---|
| Container | display: grid | Bật Grid |
| Container | grid-template-columns | Định nghĩa cột |
| Container | grid-template-rows | Định nghĩa hàng |
| Container | gap | Khoảng cách giữa các ô |
| Container | repeat() | Viết gọn số lượng cột/hàng |
| Container | minmax() | Kích thước tối thiểu/tối đa |
| Container | auto-fit | Responsive tự động |
| Item | grid-column | Chiếm nhiều cột |
| Item | grid-row | Chiếm nhiều hàng |
| Item | grid-area | Đặt tên vùng |
Nếu Flexbox là công cụ để sắp xếp nội dung theo một chiều, thì CSS Grid là công cụ mạnh nhất để xây dựng toàn bộ layout của ứng dụng web hiện đại.