CSS Grid là hệ thống bố cục hai chiều mạnh nhất của CSS: chia trang thành hàng và cột, đặt phần tử vào vùng tùy ý, làm lưới tự co giãn không cần media query. Bài này đi từ khái niệm đến các mẫu bố cục thực tế.
- Tạo lưới với grid-template-columns/rows, fr, repeat
- Đặt item theo đường lưới và span
- Đặt tên vùng bằng grid-template-areas
- Làm lưới tự co giãn với auto-fit, minmax; biết subgrid
- Grid line
- Đường kẻ chia lưới, đánh số từ 1.
- Track
- Một hàng hoặc một cột.
- fr
- Một phần không gian còn lại.
- Grid area
- Vùng chữ nhật gồm nhiều ô.
Một số khái niệm
Flexbox phù hợp sắp xếp theo một hướng dựa vào nội dung; Grid phù hợp khi cần kiểm soát cả hàng lẫn cột, bố cục định trước. Thực tế hay kết hợp: Grid cho khung trang, Flexbox cho thành phần bên trong.
.luoi {
display: grid;
grid-template-columns: 200px 1fr 1fr; /* 3 cột: cố định + 2 phần bằng nhau */
grid-template-rows: auto 1fr auto;
gap: 16px;
}
.item { grid-column: 1 / 3; grid-row: 2; } /* từ đường 1 đến 3: chiếm 2 cột */
.rong { grid-column: span 2; } /* chiếm 2 cột từ vị trí hiện tại */
.het-hang { grid-column: 1 / -1; } /* từ đầu đến cuối */Lưới cơ bản và span
<style>
.g { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; }
.g div { background: #1565c0; color: #fff; padding: 12px; border-radius: 6px; text-align: center; font-size: 13px; }
.a { grid-column: span 2; background: #e65100 !important; }
.b { grid-row: span 2; background: #2e7d32 !important; }
.c { grid-column: 1 / -1; background: #6a1b9a !important; }
</style>
<div class="g"><div class="a">span 2 cột</div><div class="b">span 2 hàng</div><div>3</div><div>4</div><div>5</div><div>6</div><div class="c">1 / -1 toàn hàng</div></div>Bố cục trang với grid-template-areas
<style>
.trang { display: grid; gap: 8px; min-height: 230px;
grid-template-columns: 160px 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas: "dau dau" "ben chinh" "chan chan"; }
.trang > * { padding: 10px; border-radius: 6px; color: #fff; }
header { grid-area: dau; background: #1b5e20; } aside { grid-area: ben; background: #43a047; }
main { grid-area: chinh; background: #a5d6a7; color: #1b5e20 !important; } footer { grid-area: chan; background: #2e7d32; }
@media (max-width: 500px) { .trang { grid-template-columns: 1fr; grid-template-areas: "dau" "chinh" "ben" "chan"; } }
</style>
<div class="trang"><header>header</header><aside>aside</aside><main>main</main><footer>footer</footer></div>Đổi bố cục trên điện thoại chỉ bằng cách viết lại grid-template-areas trong media query, không cần sửa HTML.
Lưới tự co giãn: auto-fit + minmax
<style>
.the-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 10px; }
.the-grid div { background: #fff3e0; border: 1px solid #ffcc80; border-radius: 8px; padding: 14px; text-align: center; }
</style>
<div class="the-grid"><div>Python</div><div>JavaScript</div><div>PHP</div><div>SQL</div><div>CSS</div><div>Flutter</div></div>Dòng repeat(auto-fit, minmax(140px, 1fr)) tự tính số cột theo chiều rộng: mỗi cột tối thiểu 140px, phần dư chia đều. Đây là cách làm lưới sản phẩm responsive phổ biến nhất. auto-fill giữ lại cột trống, auto-fit giãn các cột hiện có.
Căn chỉnh và subgrid
.luoi { justify-items: center; align-items: start; } /* căn nội dung trong ô */
.luoi { justify-content: center; } /* căn cả lưới trong khung */
.item { justify-self: end; align-self: center; } /* căn riêng item */
.luoi { grid-auto-flow: dense; } /* lấp chỗ trống */
/* subgrid: con dùng chung đường lưới của cha để tiêu đề, nội dung, nút các thẻ thẳng hàng */
.the { display: grid; grid-row: span 3; grid-template-rows: subgrid; }Bật Grid overlay trong DevTools (biểu tượng “grid” cạnh phần tử) để thấy đường kẻ, số thứ tự và tên vùng.
Đặt item theo số đường lưới cứng (grid-column: 3/5) dễ vỡ khi đổi số cột trên điện thoại; ưu tiên grid-template-areas hoặc span.
- Dựng bố cục blog: header, nav, nội dung, sidebar, footer bằng areas.
- Tạo lưới ảnh 3 cột, ảnh đầu chiếm 2×2.
- Làm lưới khóa học tự co giãn bằng auto-fit/minmax.
- Chuyển bố cục sang 1 cột khi màn hình dưới 600px.
- display: grid + grid-template-columns/rows + gap.
- fr, repeat(), minmax(), auto-fit để co giãn.
- grid-column/row, span, 1 / -1 để đặt item.
- grid-template-areas đặt tên vùng; subgrid căn thẳng hàng.