CSS Grid vs Flexbox
ระบบ layout 1 มิติ เหมาะสำหรับจัดวางในแถวหรือคอลัมน์ — เลือกใช้ให้ถูกเครื่องมือ ได้โค้ดที่สั้นกว่าและ maintain ง่ายกว่า
ทำความเข้าใจความแตกต่าง
// Flexbox — จัดวาง 1 มิติ (แถว หรือ คอลัมน์)
// Grid — จัดวาง 2 มิติ (แถว และ คอลัมน์ พร้อมกัน)
Flexbox: [item][item][item] → แนวนอน
[item] ↓ แนวตั้ง
Grid: [item][item][item]
[item][item][item] ← ควบคุมได้ทั้ง 2 แกน
เลือกใช้อะไรดี?
Flexbox จัดวางใน 1 แนว เช่น Navbar, Button group, Card row
Grid จัดวาง layout ใหญ่ เช่น Page layout, Gallery, Dashboard
ใช้คู่กัน Grid จัดโครงสร้างหน้า Flexbox จัดของข้างใน
Flexbox — พื้นฐานที่ต้องรู้
.container {
display: flex;
/* ทิศทางหลัก */
flex-direction: row; /* → แนวนอน (default) */
flex-direction: column; /* ↓ แนวตั้ง */
/* จัดวางแกนหลัก */
justify-content: flex-start; /* ชิดซ้าย */
justify-content: center; /* กึ่งกลาง */
justify-content: space-between; /* กระจาย */
/* จัดวางแกนรอง */
align-items: stretch; /* ยืดเต็มความสูง (default) */
align-items: center; /* กึ่งกลางแนวตั้ง */
gap: 16px; /* ระยะห่างระหว่าง item */
}
ตัวอย่าง Flexbox — Navbar
/* ✓ Flexbox เหมาะมากสำหรับ Navbar */
.navbar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 1.5rem;
height: 60px;
}
.nav-links {
display: flex;
gap: 1.5rem;
}
CSS Grid — พื้นฐานที่ต้องรู้
.container {
display: grid;
/* กำหนดคอลัมน์ */
grid-template-columns: 1fr 1fr 1fr; /* 3 คอลัมน์เท่ากัน */
grid-template-columns: 240px 1fr; /* sidebar + content */
grid-template-columns: repeat(3, 1fr); /* เขียนสั้นกว่า */
/* กำหนดแถว */
grid-template-rows: auto 1fr auto; /* header, content, footer */
gap: 24px; /* ระยะห่างทั้ง row และ column */
row-gap: 16px; /* ระยะห่างเฉพาะแถว */
column-gap: 24px; /* ระยะห่างเฉพาะคอลัมน์ */
}
ตัวอย่าง Grid — Page Layout
/* ✓ Grid เหมาะมากสำหรับ Page Layout */
.page {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: 60px 1fr 80px;
grid-template-areas:
"sidebar header"
"sidebar main"
"sidebar footer";
min-height: 100vh;
}
.sidebar { grid-area: sidebar; }
.header { grid-area: header; }
.main { grid-area: main; }
.footer { grid-area: footer; }
ตัวอย่าง Grid — Responsive Card Gallery
/* auto-fit + minmax = responsive โดยไม่ต้องใช้ media query */
.gallery {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 20px;
}
/* item ที่อยากให้กว้าง 2 คอลัมน์ */
.card-featured {
grid-column: span 2;
}
เปรียบเทียบ Use Case
1. Navbar / Header bar
Flexbox — จัดของในแนวนอน ปรับ justify-content ได้ง่าย
2. Card grid / Gallery
Grid — repeat(auto-fit, minmax()) ทำ responsive ได้ในบรรทัดเดียว
3. Button group / Tag list
Flexbox — wrap item ได้ตามธรรมชาติด้วย flex-wrap: wrap
4. Page layout (sidebar + content)
Grid — grid-template-areas ทำให้โค้ดอ่านง่ายและแก้ไขง่าย
5. Centering element
ทั้งคู่ — display: flex/grid + place-items: center
Shortcut ที่ใช้บ่อย
/* จัดกึ่งกลางทั้งแนวนอนและแนวตั้ง */
.center-flex {
display: flex;
align-items: center;
justify-content: center;
}
.center-grid {
display: grid;
place-items: center;
}
/* Responsive โดยไม่มี media query */
.responsive-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1rem;
}