Bài 14. CSS Grid chi tiết

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ế.

60 phútTrung cấp
Bạn sẽ học được
  • 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
Thuật ngữ cần biết
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>
Kết quả hiển thị

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>
Kết quả hiển thị

Đổ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>
Kết quả hiển thị

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; }
Mẹo hay

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.

Lưu ý

Đặ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.

Thực hành
  1. Dựng bố cục blog: header, nav, nội dung, sidebar, footer bằng areas.
  2. Tạo lưới ảnh 3 cột, ảnh đầu chiếm 2×2.
  3. Làm lưới khóa học tự co giãn bằng auto-fit/minmax.
  4. Chuyển bố cục sang 1 cột khi màn hình dưới 600px.
Tóm tắt bài học
  • 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.