Flex vs Grid chọn nhanh | Cheat sheet layout CSS 30 giây【2026】
Cheat sheet nhanh: một trục → Flex; hàng + cột phải thẳng cùng lúc → Grid. Nav / chip / nút → Flex. Shell trang / gallery / form cột → Grid. Pattern ổn định: Grid làm khung, Flex làm ruột. Cần grid-template nhanh → CSS Grid generator (chạy trên trình duyệt, copy CSS).
Bạn đang mở file CSS, cursor nhấp nháy trên display: … — không cần đọc lại bài so sánh 3000 chữ. Cần quyết định trong nửa phút. Bài này là cheat sheet chọn Flex vs Grid: litmus 3 câu, bảng tình huống, snippet tối thiểu, và 5 lỗi DevTools hay gặp. Nếu muốn phân tích sâu theo màn hình nav/dashboard, đọc thêm Grid vs Flexbox theo use-case.
Ai giữ bookmark bài này
- Sinh viên / fresher cần câu trả lời một dòng trước khi hỏi mentor
- Freelancer Việt Nam review layout trên điện thoại khách (4G, Chrome Android)
- Dev outsourcing nhận Figma rồi phải chọn
flexhaygridtrong 5 phút standup
Litmus 30 giây (in ra dán cạnh màn hình)
- Có đang căn theo cả hàng lẫn cột không?
Có → Grid. Chỉ một hàng hoặc một cột → Flex. - Một item cao hơn có làm lệch cả “hệ lưới” không?
Có (card gallery, form label thẳng cột) → Grid. Không (chip wrap, nhóm nút) → Flex. - Bạn có đặt tên vùng trên giấy không? (
header/aside/main)
Có → nghiênggrid-template-areas. Không → thử Flex trước.
| Tình huống | Chọn | Gợi ý 1 dòng |
|---|---|---|
| Navbar logo + link + CTA | Flex | flex; gap; justify-content: space-between |
| Chip / tag wrap | Flex | flex-wrap: wrap; gap: .5rem |
| Icon + label trong nút | Flex | align-items: center; gap: .5rem |
| Shell: header / sidebar / main | Grid | grid-template-areas hoặc 2 cột fr |
| Gallery card cao đều theo hàng | Grid | auto-fit + minmax(...) |
| Form label | input thẳng cột | Grid | grid-template-columns: max-content 1fr |
| Footer nút trong card | Flex | margin-top: auto + flex hàng nút |
| Dashboard widget 12 cột | Grid | repeat(12, 1fr) + span |
Snippet tối thiểu (copy rồi sửa)
A — Nav Flex (mặc định đúng 90% trường hợp)
.nav {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
}
.nav__links {
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
}
Đổi flex-direction: column trên mobile — align-items / justify-content đổi vai trò theo main axis. Đây là chỗ fresher hay “bị lệch giữa” mà không hiểu vì sao.
B — Gallery Grid
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 1.25rem;
}
Một dòng minmax thay cả media query 3 breakpoint cho nhiều landing. Muốn chỉnh số cột / fr / gap trực quan trước khi dán vào repo:
🏁 Tạo CSS Grid ngay tại đây
Hoặc mở đầy đủ công cụ CSS Grid: chọn số hàng, cột, track (1fr / auto / minmax), gap → copy CSS. Không upload stylesheet lên server lạ — phù hợp code client NDA.
C — Shell trang + Flex ruột
.page {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"side head"
"side main"
"side foot";
min-height: 100dvh;
}
.side { grid-area: side; }
.head {
grid-area: head;
display: flex;
align-items: center;
justify-content: space-between;
}
Grid đặt vùng, Flex căn nội dung — đây là pattern bảo trì tốt hơn “toàn trang một display: flex rồi wrapper 6 lớp”.
Bảng thuộc tính “hay nhầm”
| Nhu cầu | Flex | Grid |
|---|---|---|
| Hướng chính | flex-direction | grid-auto-flow (ít đụng hơn) |
| Khoảng cách | gap | gap / row-gap / column-gap |
| Co giãn item | flex: 1 / grow / shrink | fr, minmax, span |
| Căn giữa 1 item | margin: auto hoặc place trên container | place-items / place-self |
| Đặt tên vùng | Không có sẵn | grid-template-areas |
| Số cột tự động | flex-wrap (không tạo track chung) | auto-fit / auto-fill |
5 lỗi hay gặp (và cách đọc DevTools)
width: 100%trên flex child → overflow ngang. Thửmin-width: 0trên item co được.- Grid item không co vì nội dung dài (URL, bảng). Cùng mẹo:
minmax(0, 1fr)thay vì1frthuần. margin: autotrên Grid đẩy item theo cách khác Flex — kiểm tra overlay Grid trước khi “fix bằng magic number”.- Dùng Flex cho gallery rồi
align-items: stretchkỳ vọng cột thẳng — chiều cao hàng Flex không tạo track chung như Grid. - Quên
gap, dùng margin âm — khó responsive; hiện đại dùnggaptrên cả Flex và Grid.
Checklist 60 giây trước khi merge:
- Overlay Flex/Grid đã bật, axis đúng hướng?
- Mobile: wrap / areas đổi chưa vỡ?
- Có
min-width: 0/minmax(0, 1fr)nơi text dài? - Không còn float để layout chính?
Case nhanh: landing freelance vs admin outsourcing
Landing portfolio (1 người): hero + hàng CTA + lưới project. CTA hàng → Flex. Lưới project → Grid auto-fit. Toàn bộ xong trong một buổi — không cần 12-column framework.
Admin báo cáo (team outsource): sidebar cố định + main widget. Shell → Grid areas. Mỗi widget header (title + filter + export) → Flex. Reviewer chỉ cần nhìn areas để biết vùng nào đổi breakpoint.
Khi nào mở tool thay vì gõ tay
- Quên cú pháp
repeat()/minmax()/ thứ tựgrid-template - Muốn thử 3–4 phương án cột trước khi commit
- Hướng dẫn intern: chỉnh form trên CSS Grid rồi copy — nhanh hơn giải thích abstract trên whiteboard
Tool không thay tư duy litmus ở trên. Nó chỉ rút ngắn bước viết grid-template-*.