Skip to content

Flexbox & Grid

Flexbox และ Grid คือ 2 เครื่องมือหลักสำหรับจัด layout:

Use Caseเลือกใช้
จัดเรียง 1 แถว/1 คอลัมน์Flexbox
จัดเรียง 2 มิติ (rows + columns)Grid
Component layout (buttons, navbar)Flexbox
Page layout (sidebar + content)Grid

Rule of thumb: เริ่มจาก Flexbox → ถ้าซับซ้อนค่อยเปลี่ยนเป็น Grid


<div class="flex justify-between items-center gap-4">
<div>Item 1</div>
<div>Item 2</div>
</div>
ClassEffect
flex-rowเรียงแนวนอน (default)
flex-colเรียงแนวตั้ง
flex-row-reverseเรียงแนวนอนกลับด้าน
ClassEffect
justify-startชิดซ้าย
justify-centerกึ่งกลาง
justify-endชิดขวา
justify-betweenกระจายเท่ากัน
justify-aroundกระจาย + padding
ClassEffect
items-startชิดบน
items-centerกึ่งกลาง
items-endชิดล่าง
items-stretchยืดเต็มความสูง
<!-- Wrap เมื่อไม่พอ -->
<div class="flex flex-wrap gap-4">...</div>
<!-- Item ยืดได้ -->
<div class="flex-grow">ยืดเต็มที่เหลือ</div>
<div class="flex-shrink-0">ไม่หดตัว</div>
<div class="flex-1">flex: 1 1 0%</div>

<div class="grid grid-cols-3 gap-4">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
ClassEffect
grid-cols-11 column
grid-cols-22 columns
grid-cols-33 columns
grid-cols-1212 columns
grid-cols-noneไม่กำหนด
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
<!-- 1 col บนมือถือ, 2 col tablet, 4 col desktop -->
</div>
<div class="grid grid-cols-4 gap-4">
<div class="col-span-2">กว้าง 2 columns</div>
<div class="col-span-1">กว้าง 1 column</div>
<div class="col-span-1">กว้าง 1 column</div>
</div>
ClassEffect
gap-0ไม่มีระยะห่าง
gap-41rem ทุกทิศ
gap-x-41rem แนวนอน
gap-y-20.5rem แนวตั้ง

<nav class="flex items-center justify-between p-4 bg-white shadow">
<a href="/" class="font-bold text-xl">Logo</a>
<div class="hidden md:flex gap-6">
<a href="#" class="hover:text-blue-500">Home</a>
<a href="#" class="hover:text-blue-500">About</a>
<a href="#" class="hover:text-blue-500">Contact</a>
</div>
<button class="md:hidden">Menu</button>
</nav>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
<div class="bg-white p-6 rounded-lg shadow">Card 1</div>
<div class="bg-white p-6 rounded-lg shadow">Card 2</div>
<div class="bg-white p-6 rounded-lg shadow">Card 3</div>
</div>

Do ✅Don’t ❌
ใช้ gap-* กับ flex/gridใช้ margin บน children
ใช้ flex-1 สำหรับยืดเติมที่เหลือHard-code width
ใช้ responsive grid sm:grid-cols-2ใช้ fixed columns ทุก viewport
ใช้ items-center สำหรับ vertical centerใช้ padding แทน

  1. Flex vs Grid: ถ้าจัดแค่แถวเดียวใช้ flex, ถ้าหลายแถวใช้ grid
  2. Center anything: flex items-center justify-center = center ทั้ง x และ y
  3. flex-1 vs flex-grow: flex-1 = grow + basis:0, flex-grow = grow only
  4. Grid auto-fill: grid-cols-[repeat(auto-fill,minmax(200px,1fr))] = responsive โดยอัตโนมัติ