blog.dopana

Back

Flexbox và Grid là hai công cụ layout mạnh nhất trong CSS hiện đại. Biết khi nào dùng cái nào là chìa khóa.

Flexbox vs Grid — Khi Nào Dùng Gì?#

FlexboxGrid
Bố cục 1 chiều (row hoặc column)Bố cục 2 chiều (row và column)
Content-first — kích thước theo nội dungLayout-first — chia lưới trước, đặt content sau
Navigation, card hàng ngang, centerTrang chính, dashboard, gallery

Flexbox — Linh Hoạt Một Chiều#

Container#

.container {
  display: flex;
  flex-direction: row;        /* mặc định: row | column */
  justify-content: center;    /* main axis */
  align-items: center;        /* cross axis */
  gap: 16px;                  /* khoảng cách giữa các item */
}
css

Items#

.item {
  flex-grow: 1;     /* item có thể giãn */
  flex-shrink: 0;   /* item không co lại */
  flex-basis: 200px; /* kích thước cơ sở */
}

/* shorthand */
.item {
  flex: 1 0 200px;
}
css

Ví Dụ Thực Tế#

Header với nav trái-phải:

header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 16px 24px;
}
css

Card grid responsive (không cần media query):

.card-container {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
}

.card {
  flex: 1 1 300px; /* tối thiểu 300px, giãn đều nếu còn chỗ */
}
css

CSS Grid — Mạnh Mẽ Hai Chiều#

Container#

.grid {
  display: grid;
  grid-template-columns: 1fr 2fr 1fr;
  grid-template-rows: auto 1fr auto;
  gap: 24px;
}
css

Grid Template Areas — Trực Quan Nhất#

Auto-fit / Auto-fill — Responsive Không Media Query#

.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  gap: 16px;
}
css

auto-fill: tạo cột trống nếu thừa chỗ. auto-fit: co cột về 0, content giãn đầy.

Grid Item — Placement#

.featured {
  grid-column: span 2;  /* chiếm 2 cột */
  grid-row: span 2;     /* chiếm 2 hàng */
}

/* Hoặc dùng line numbers */
.featured {
  grid-column: 1 / 3;
  grid-row: 1 / 3;
}
css

Holy Grail Layout — Flexbox + Grid#

<body>
  <header>Header</header>
  <div class="main">
    <nav>Sidebar</nav>
    <main>Content</main>
    <aside>Aside</aside>
  </div>
  <footer>Footer</footer>
</body>
html

Center — Tuyệt Chiêu#

Mẹo Hay#

body {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}

main {
  flex: 1;
}
css

Equal Height Columns#

/* Flexbox mặc định đã equal height (align-items: stretch) */
.flex-container {
  display: flex;
}

/* Grid cũng vậy */
.grid-container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
}
css

Kết Luận#

  • Flexbox cho component nhỏ, layout 1 chiều
  • Grid cho layout trang, layout 2 chiều
  • Kết hợp cả hai cho kết quả tốt nhất
  • gap thay margin — sạch hơn, dễ kiểm soát
  • minmax() + auto-fill = responsive không cần media query

Bỏ float, bỏ table layout. Flexbox và Grid là tất cả những gì bạn cần.

Tài liệu tham khảo#