การดู : 433

25/04/2026 02:47น.

EP 2: Utility-First คืออะไร? เข้าใจระบบคลาสของ Tailwind แบบเซียน

EP 2: Utility-First คืออะไร? เข้าใจระบบคลาสของ Tailwind แบบเซียน

#Utility-First CSS

#Tailwind CSS

#ระบบคลาส Tailwind

#Tailwind CSS Classes

หลังจาก EP 1 ที่เราได้รู้จักกับ Tailwind CSS และเข้าใจว่าทำไมมันถึงได้รับความนิยม วันนี้เราจะมาลงลึกถึงหัวใจสำคัญของ Tailwind CSS ที่ทำให้มันแตกต่างจาก CSS Framework อื่นๆ นั่นคือ "Utility-First"

คุณเคยสงสัยไหมว่าทำไม Tailwind CSS ถึงใช้แนวคิด Utility-First? มันดีกว่าการเขียน CSS แบบเดิมยังไง? และที่สำคัญ - เราจะจำคลาสเยอะขนาดนี้ได้ยังไง?

วันนี้เราจะมาตอบคำถามเหล่านี้กัน พร้อมกับเทคนิคการจำคลาสแบบเซียน และเคล็ดลับที่จะทำให้คุณเขียน Tailwind CSS ได้อย่างมืออาชีพ!

 

Utility-First คืออะไร? ทำไมถึงเป็นจุดเปลี่ยนของ CSS

หลักการพื้นฐานของ Utility-First

Utility-First เป็นแนวคิดการออกแบบ CSS ที่ใช้คลาสขนาดเล็กที่มีหน้าที่เฉพาะเจาะจง (Single-purpose) มาประกอบกันเพื่อสร้างการออกแบบที่ซับซ้อน

แทนที่จะเขียนแบบนี้:

/* แบบเดิม (Component-First) */
.hero-section {
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  padding: 4rem 2rem;
  text-align: center;
  color: white;
}

.hero-title {
  font-size: 3rem;
  font-weight: bold;
  margin-bottom: 1rem;
  line-height: 1.2;
}

.hero-button {
  background-color: #ffffff;
  color: #667eea;
  padding: 0.75rem 2rem;
  border-radius: 0.5rem;
  border: none;
  font-weight: 600;
  transition: all 0.3s ease;
}

.hero-button:hover {
  background-color: #f1f5f9;
  transform: translateY(-2px);
}

เราจะเขียนแบบนี้:

<!-- แบบใหม่ (Utility-First) -->
<section class="bg-gradient-to-br from-indigo-500 to-purple-600 py-16 px-8 text-center text-white">
  <h1 class="text-5xl font-bold mb-4 leading-tight">
    ยินดีต้อนรับสู่อนาคต
  </h1>
  <button class="bg-white text-indigo-500 px-8 py-3 rounded-lg font-semibold hover:bg-gray-100 hover:-translate-y-0.5 transition-all duration-300">
    เริ่มต้นเลย
  </button>
</section>

ทำไม Utility-First ถึงแตกต่าง?

1. ความรวดเร็วในการพัฒนา

  • ไม่ต้องคิดชื่อคลาส
  • ไม่ต้องสลับไฟล์ไปมา
  • เปลี่ยนแปลงได้ทันที

2. ความยืดหยุ่น

  • สร้างการออกแบบได้ไม่จำกัด
  • ไม่ติดอยู่กับ Component ที่กำหนดไว้
  • ปรับแต่งได้ในระดับรายละเอียด

3. ความสอดคล้อง

  • ใช้ Design System ที่สม่ำเสมอ
  • ระบบสีและขนาดที่เป็นมาตรฐาน
  • ลดความผิดพลาดในการออกแบบ

ลองดูตัวอย่างการสร้างการ์ดที่ซับซ้อน:

<div class="max-w-sm mx-auto bg-white rounded-xl shadow-lg overflow-hidden md:max-w-2xl">
  <div class="md:flex">
    <div class="md:shrink-0">
      <img class="h-48 w-full object-cover md:h-full md:w-48" src="/img/building.jpg" alt="Modern building architecture">
    </div>
    <div class="p-8">
      <div class="uppercase tracking-wide text-sm text-indigo-500 font-semibold">Company retreat</div>
      <a href="#" class="block mt-1 text-lg leading-tight font-medium text-black hover:underline">Incredible accommodation for your team</a>
      <p class="mt-2 text-slate-500">Looking to take your team away on a retreat to enjoy awesome food and take in some sunshine? We have a list of places to do just that.</p>
    </div>
  </div>
</div>

 

ระบบการจัดหมวดหมู่คลาสใน Tailwind CSS

1. Layout Classes - จัดการโครงสร้าง

Container และ Display

<!-- Container -->
<div class="container mx-auto">กำหนดความกว้างสูงสุดและจัดกึ่งกลาง</div>

<!-- Display -->
<div class="block">display: block</div>
<div class="inline-block">display: inline-block</div>
<div class="inline">display: inline</div>
<div class="flex">display: flex</div>
<div class="grid">display: grid</div>
<div class="hidden">display: none</div>

Flexbox System

<!-- Flex Direction -->
<div class="flex flex-row">แนวนอน (default)</div>
<div class="flex flex-col">แนวตั้ง</div>
<div class="flex flex-row-reverse">แนวนอนกลับด้าน</div>

<!-- Justify Content -->
<div class="flex justify-start">จัดชิดซ้าย</div>
<div class="flex justify-center">จัดกึ่งกลาง</div>
<div class="flex justify-between">กระจายห่าง</div>
<div class="flex justify-around">กระจายรอบ</div>

<!-- Align Items -->
<div class="flex items-start">จัดชิดบน</div>
<div class="flex items-center">จัดกึ่งกลางแนวตั้ง</div>
<div class="flex items-end">จัดชิดล่าง</div>

Grid System

<!-- Grid Template Columns -->
<div class="grid grid-cols-1">1 คอลัมน์</div>
<div class="grid grid-cols-2">2 คอลัมน์</div>
<div class="grid grid-cols-3">3 คอลัมน์</div>
<div class="grid grid-cols-12">12 คอลัมน์</div>

<!-- Grid Gap -->
<div class="grid grid-cols-3 gap-4">ช่องว่าง 1rem</div>
<div class="grid grid-cols-3 gap-x-4 gap-y-2">ช่องว่างแยกแนวนอน-ตั้ง</div>

<!-- Grid Span -->
<div class="col-span-2">ขยายครอบ 2 คอลัมน์</div>
<div class="row-span-3">ขยายครอบ 3 แถว</div>

2. Spacing Classes - จัดการระยะห่าง

Padding และ Margin System

<!-- Padding (p = padding) -->
<div class="p-4">padding: 1rem (ทุกด้าน)</div>
<div class="px-4">padding: 0 1rem (ซ้าย-ขวา)</div>
<div class="py-4">padding: 1rem 0 (บน-ล่าง)</div>
<div class="pt-4">padding-top: 1rem</div>
<div class="pr-4">padding-right: 1rem</div>
<div class="pb-4">padding-bottom: 1rem</div>
<div class="pl-4">padding-left: 1rem</div>

<!-- Margin (m = margin) -->
<div class="m-4">margin: 1rem (ทุกด้าน)</div>
<div class="mx-auto">margin: 0 auto (จัดกึ่งกลาง)</div>
<div class="my-8">margin: 2rem 0 (บน-ล่าง)</div>
<div class="mt-4">margin-top: 1rem</div>
<div class="-mt-4">margin-top: -1rem (ค่าติดลบ)</div>

ระบบขนาดมาตรฐาน

0 = 0px
0.5 = 0.125rem (2px)
1 = 0.25rem (4px)
1.5 = 0.375rem (6px)
2 = 0.5rem (8px)
2.5 = 0.625rem (10px)
3 = 0.75rem (12px)
3.5 = 0.875rem (14px)
4 = 1rem (16px)
5 = 1.25rem (20px)
6 = 1.5rem (24px)
7 = 1.75rem (28px)
8 = 2rem (32px)
9 = 2.25rem (36px)
10 = 2.5rem (40px)
11 = 2.75rem (44px)
12 = 3rem (48px)
14 = 3.5rem (56px)
16 = 4rem (64px)
20 = 5rem (80px)
24 = 6rem (96px)
28 = 7rem (112px)
32 = 8rem (128px)
36 = 9rem (144px)
40 = 10rem (160px)
44 = 11rem (176px)
48 = 12rem (192px)
52 = 13rem (208px)
56 = 14rem (224px)
60 = 15rem (240px)
64 = 16rem (256px)
72 = 18rem (288px)
80 = 20rem (320px)
96 = 24rem (384px)

3. Color System - ระบบสี

ประเภทสีหลัก

<!-- Background Colors -->
<div class="bg-red-500">พื้นหลังสีแดง</div>
<div class="bg-blue-600">พื้นหลังสีน้ำเงิน</div>
<div class="bg-green-400">พื้นหลังสีเขียว</div>

<!-- Text Colors -->
<p class="text-gray-800">ข้อความสีเทาเข้ม</p>
<p class="text-indigo-500">ข้อความสีม่วงน้ำเงิน</p>

<!-- Border Colors -->
<div class="border border-red-300">เส้นขอบสีแดงอ่อน</div>

ระดับความเข้มของสี

<!-- สีเทา (Gray) -->
<div class="bg-gray-50">สีเทาอ่อนมาก</div>
<div class="bg-gray-100">สีเทาอ่อน</div>
<div class="bg-gray-200">สีเทาอ่อนปานกลาง</div>
<div class="bg-gray-300">สีเทาปานกลาง</div>
<div class="bg-gray-400">สีเทาปานกลางเข้ม</div>
<div class="bg-gray-500">สีเทาเข้ม</div>
<div class="bg-gray-600">สีเทาเข้มมาก</div>
<div class="bg-gray-700">สีเทาเข้มมากพิเศษ</div>
<div class="bg-gray-800">สีเทาเข้มที่สุด</div>
<div class="bg-gray-900">สีเทาดำ</div>

<!-- สีฟ้า (Blue) -->
<div class="bg-blue-50">สีฟ้าอ่อนมาก</div>
<div class="bg-blue-100">สีฟ้าอ่อน</div>
<div class="bg-blue-500">สีฟ้ามาตรฐาน</div>
<div class="bg-blue-900">สีฟ้าเข้มที่สุด</div>

สีพิเศษและ Gradient

<!-- สีขาว-ดำ -->
<div class="bg-white">พื้นหลังสีขาว</div>
<div class="bg-black">พื้นหลังสีดำ</div>
<div class="bg-transparent">พื้นหลังโปร่งใส</div>

<!-- Gradient -->
<div class="bg-gradient-to-r from-purple-500 to-pink-500">Gradient ซ้าย-ขวา</div>
<div class="bg-gradient-to-br from-green-400 to-blue-600">Gradient มุมล่างขวา</div>
<div class="bg-gradient-to-t from-yellow-400 via-red-500 to-pink-500">Gradient 3 สี</div>

4. Typography Classes - จัดการข้อความ

ขนาดและน้ำหนักตัวอักษร

<!-- Font Size -->
<p class="text-xs">12px - ข้อความเล็กที่สุด</p>
<p class="text-sm">14px - ข้อความเล็ก</p>
<p class="text-base">16px - ข้อความปกติ (default)</p>
<p class="text-lg">18px - ข้อความใหญ่</p>
<p class="text-xl">20px - ข้อความใหญ่มาก</p>
<p class="text-2xl">24px - หัวข้อเล็ก</p>
<p class="text-3xl">30px - หัวข้อกลาง</p>
<p class="text-4xl">36px - หัวข้อใหญ่</p>
<p class="text-5xl">48px - หัวข้อใหญ่มาก</p>
<p class="text-6xl">60px - หัวข้อยักษ์</p>

<!-- Font Weight -->
<p class="font-thin">100 - บางมาก</p>
<p class="font-light">300 - บาง</p>
<p class="font-normal">400 - ปกติ</p>
<p class="font-medium">500 - กลาง</p>
<p class="font-semibold">600 - หนา</p>
<p class="font-bold">700 - หนามาก</p>
<p class="font-black">900 - หนาที่สุด</p>

การจัดตำแหน่งและระยะห่าง

<!-- Text Alignment -->
<p class="text-left">จัดชิดซ้าย</p>
<p class="text-center">จัดกึ่งกลาง</p>
<p class="text-right">จัดชิดขวา</p>
<p class="text-justify">จัดเต็มแถว</p>

<!-- Line Height -->
<p class="leading-tight">ระยะห่างบรรทัดแน่น</p>
<p class="leading-normal">ระยะห่างบรรทัดปกติ</p>
<p class="leading-loose">ระยะห่างบรรทัดหลวม</p>

<!-- Letter Spacing -->
<p class="tracking-tight">ระยะห่างตัวอักษรแน่น</p>
<p class="tracking-normal">ระยะห่างตัวอักษรปกติ</p>
<p class="tracking-wide">ระยะห่างตัวอักษรกว้าง</p>

การตกแต่งข้อความ

<!-- Text Decoration -->
<p class="underline">ขีดเส้นใต้</p>
<p class="line-through">ขีดฆ่า</p>
<p class="no-underline">ไม่มีขีดเส้นใต้</p>

<!-- Text Transform -->
<p class="uppercase">ตัวพิมพ์ใหญ่ทั้งหมด</p>
<p class="lowercase">ตัวพิมพ์เล็กทั้งหมด</p>
<p class="capitalize">ตัวแรกของแต่ละคำพิมพ์ใหญ่</p>

<!-- Text Style -->
<p class="italic">ตัวเอียง</p>
<p class="not-italic">ไม่เอียง</p>

5. Border และ Radius Classes

เส้นขอบ (Border)

<!-- Border Width -->
<div class="border">เส้นขอบ 1px ทุกด้าน</div>
<div class="border-2">เส้นขอบ 2px ทุกด้าน</div>
<div class="border-4">เส้นขอบ 4px ทุกด้าน</div>
<div class="border-t">เส้นขอบด้านบนเท่านั้น</div>
<div class="border-r">เส้นขอบด้านขวาเท่านั้น</div>
<div class="border-b">เส้นขอบด้านล่างเท่านั้น</div>
<div class="border-l">เส้นขอบด้านซ้ายเท่านั้น</div>

<!-- Border Style -->
<div class="border border-solid">เส้นทึบ</div>
<div class="border border-dashed">เส้นประ</div>
<div class="border border-dotted">เส้นจุด</div>
<div class="border-none">ไม่มีเส้นขอบ</div>

มุมโค้ง (Border Radius)

<!-- Rounded Corners -->
<div class="rounded-none">ไม่มีมุมโค้ง</div>
<div class="rounded-sm">มุมโค้งเล็ก (2px)</div>
<div class="rounded">มุมโค้งปกติ (4px)</div>
<div class="rounded-md">มุมโค้งกลาง (6px)</div>
<div class="rounded-lg">มุมโค้งใหญ่ (8px)</div>
<div class="rounded-xl">มุมโค้งใหญ่มาก (12px)</div>
<div class="rounded-full">มุมโค้งเต็ม (วงกลม)</div>

<!-- Specific Corners -->
<div class="rounded-t-lg">มุมโค้งด้านบน</div>
<div class="rounded-r-lg">มุมโค้งด้านขวา</div>
<div class="rounded-tl-lg">มุมโค้งบนซ้าย</div>
<div class="rounded-tr-lg">มุมโค้งบนขวา</div>

 

เทคนิคการจำคลาสแบบเซียน

1. จำตามรูปแบบ (Pattern Recognition)

รูปแบบการตั้งชื่อ

[property]-[direction]-[size]
[property]-[color]-[shade]
[breakpoint]:[property]-[value]

ตัวอย่าง:

  • mt-4 = margin-top: 1rem
  • px-6 = padding-left: 1.5rem, padding-right: 1.5rem
  • bg-blue-500 = background-color: #3b82f6
  • md:text-lg = @media (min-width: 768px) { font-size: 1.125rem }

2. กลุ่มคลาสที่ใช้บ่อย

Layout Combo

<!-- กึ่งกลางทั้งหมด -->
<div class="flex items-center justify-center">

<!-- การ์ดพื้นฐาน -->
<div class="bg-white rounded-lg shadow-md p-6">

<!-- Container responsive -->
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">

<!-- Grid responsive -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">

Typography Combo

<!-- หัวข้อหลัก -->
<h1 class="text-3xl md:text-4xl font-bold text-gray-900">

<!-- ข้อความรอง -->
<p class="text-lg text-gray-600 leading-relaxed">

<!-- ปุ่ม -->
<button class="bg-blue-500 hover:bg-blue-600 text-white font-medium px-6 py-3 rounded-lg transition-colors">

3. เทคนิค Mnemonics (การจำด้วยสัญลักษณ์)

ทิศทาง (Direction)

  • t = Top (บน)
  • r = Right (ขวา)
  • b = Bottom (ล่าง)
  • l = Left (ซ้าย)
  • x = X-axis (ซ้าย-ขวา)
  • y = Y-axis (บน-ล่าง)

ขนาด (Size)

  • 0 = ไม่มี
  • 1-3 = เล็ก
  • 4-6 = กลาง
  • 8-12 = ใหญ่
  • 16+ = ใหญ่มาก

4. สร้างระบบจำของตัวเอง

การจัดกลุ่มตามหน้าที่

/* ใช้ @apply เพื่อสร้างคลาสกลุ่ม */
@layer components {
  .layout-center { 
    @apply flex items-center justify-center; 
  }
  
  .layout-container { 
    @apply max-w-7xl mx-auto px-4 sm:px-6 lg:px-8; 
  }
  
  .text-heading { 
    @apply text-3xl font-bold text-gray-900; 
  }
  
  .text-body { 
    @apply text-base text-gray-600 leading-relaxed; 
  }
  
  .btn-primary { 
    @apply bg-blue-500 hover:bg-blue-600 text-white font-medium px-6 py-3 rounded-lg transition-colors; 
  }
  
  .card-basic { 
    @apply bg-white rounded-lg shadow-md p-6; 
  }
}

 

Responsive Design ด้วย Breakpoint System

ระบบ Breakpoint ใน Tailwind

<!-- Default (Mobile First) -->
<div class="text-sm">ขนาดเล็กในทุกขนาดหน้าจอ</div>

<!-- sm: >= 640px -->
<div class="text-sm sm:text-base">เล็กในมือถือ, ปกติในแท็บเล็ต</div>

<!-- md: >= 768px -->
<div class="text-sm md:text-lg">เล็กในมือถือ, ใหญ่ในแท็บเล็ต</div>

<!-- lg: >= 1024px -->
<div class="text-sm lg:text-xl">เล็กในมือถือ, ใหญ่มากใน Desktop</div>

<!-- xl: >= 1280px -->
<div class="text-sm xl:text-2xl">เล็กในมือถือ, ใหญ่มากใน Desktop ใหญ่</div>

<!-- 2xl: >= 1536px -->
<div class="text-sm 2xl:text-3xl">เล็กในมือถือ, ยักษ์มากใน Desktop ยักษ์</div>

ตัวอย่างการใช้งานจริง

Navigation Responsive

<nav class="bg-white shadow-lg">
  <div class="max-w-7xl mx-auto px-4">
    <div class="flex justify-between items-center py-4">
      <!-- Logo -->
      <div class="flex items-center">
        <img class="h-8 w-auto" src="/logo.svg" alt="Logo">
      </div>
      
      <!-- Desktop Menu -->
      <div class="hidden md:flex space-x-8">
        <a href="#" class="text-gray-600 hover:text-gray-900">Home</a>
        <a href="#" class="text-gray-600 hover:text-gray-900">About</a>
        <a href="#" class="text-gray-600 hover:text-gray-900">Contact</a>
      </div>
      
      <!-- Mobile Menu Button -->
      <div class="md:hidden">
        <button class="text-gray-600 hover:text-gray-900 focus:outline-none">
          <svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
          </svg>
        </button>
      </div>
    </div>
  </div>
</nav>

Hero Section Responsive

<section class="bg-gradient-to-r from-blue-600 to-purple-600 text-white">
  <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12 sm:py-16 lg:py-24">
    <div class="text-center">
      <h1 class="text-3xl sm:text-4xl md:text-5xl lg:text-6xl font-bold mb-4 sm:mb-6">
        สร้างเว็บไซต์สุดเจ๋ง
      </h1>
      <p class="text-lg sm:text-xl md:text-2xl mb-6 sm:mb-8 max-w-3xl mx-auto">
        ด้วย Tailwind CSS Framework ที่ทำให้การพัฒนาเว็บไซต์เร็วขึ้น 10 เท่า
      </p>
      <div class="flex flex-col sm:flex-row gap-4 justify-center">
        <button class="bg-white text-blue-600 px-6 sm:px-8 py-3 rounded-lg font-medium hover:bg-gray-100 transition-colors">
          เริ่มต้นฟรี
        </button>
        <button class="border-2 border-white text-white px-6 sm:px-8 py-3 rounded-lg font-medium hover:bg-white hover:text-blue-600 transition-colors">
          ดูตัวอย่าง
        </button>
      </div>
    </div>
  </div>
</section>

 

State Variants - จัดการสถานะต่างๆ

Hover, Focus, และ Active States

<!-- Hover Effects -->
<button class="bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded">
  Hover เปลี่ยนสี
</button>

<div class="transform hover:scale-105 transition-transform">
  Hover ขยายขนาด
</div>

<a href="#" class="text-blue-500 hover:text-blue-700 hover:underline">
  Hover เปลี่ยนสีและขีดเส้นใต้
</a>

<!-- Focus Effects -->
<input class="border border-gray-300 focus:border-blue-500 focus:ring-2 focus:ring-blue-200 px-3 py-2 rounded" 
       type="text" placeholder="Focus เปลี่ยนสี">

<button class="bg-green-500 focus:bg-green-600 focus:outline-none focus:ring-4 focus:ring-green-200 text-white px-4 py-2 rounded">
  Focus Button
</button>

<!-- Active Effects -->
<button class="bg-red-500 active:bg-red-700 text-white px-4 py-2 rounded">
  Active เปลี่ยนสี
</button>

<!-- Group Hover (เอฟเฟ็กต์เมื่อ hover parent) -->
<div class="group bg-white p-6 rounded-lg hover:bg-gray-50">
  <h3 class="text-gray-900 group-hover:text-blue-600">หัวข้อ</h3>
  <p class="text-gray-600 group-hover:text-gray-700">รายละเอียด</p>
</div>

Responsive States

<!-- Responsive Hover (hover เฉพาะใน desktop) -->
<button class="bg-blue-500 md:hover:bg-blue-600 text-white px-4 py-2 rounded">
  Hover เฉพาะ Desktop
</button>

<!-- Combined Responsive + State -->
<div class="text-sm md:text-base hover:text-lg md:hover:text-xl">
  ขนาดเปลี่ยนตาม breakpoint และ hover
</div>

Dark Mode Support

⚠️ หมายเหตุ: Dark Mode ต้องเปิดใช้งานใน tailwind.config.js ก่อน:

// tailwind.config.js
module.exports = {
  darkMode: 'class', // หรือ 'media'
  // ... config อื่นๆ
}
<!-- ธีมมืด-สว่าง -->
<div class="bg-white dark:bg-gray-800 text-gray-900 dark:text-white p-6">
  <h2 class="text-xl font-bold">หัวข้อ</h2>
  <p class="text-gray-600 dark:text-gray-300">เนื้อหาที่รองรับ Dark Mode</p>
</div>

<!-- ปุ่มสำหรับ Dark Mode -->
<button class="bg-gray-200 dark:bg-gray-700 text-gray-800 dark:text-gray-200 hover:bg-gray-300 dark:hover:bg-gray-600 px-4 py-2 rounded">
  ปุ่ม Dark Mode
</button>

 

Animation และ Transition Classes

Transition Effects

<!-- Transition พื้นฐาน -->
<div class="transition-colors duration-300 bg-blue-500 hover:bg-blue-600">
  เปลี่ยนสีอย่างนุ่มนวล
</div>

<div class="transition-all duration-500 transform hover:scale-110 hover:rotate-3">
  เปลี่ยนทุกอย่าง + หมุน + ขยาย
</div>

<!-- Transition เฉพาะ Property -->
<div class="transition-opacity duration-300 opacity-50 hover:opacity-100">
  เปลี่ยนความโปร่งใส
</div>

<div class="transition-transform duration-200 hover:-translate-y-1">
  เลื่อนขึ้น
</div>

Animation Classes

<!-- Animation พื้นฐาน -->
<div class="animate-spin w-8 h-8 border-4 border-blue-500 border-t-transparent rounded-full">
  หมุนไม่หยุด
</div>

<div class="animate-pulse bg-gray-200 h-4 rounded">
  กระพริบ
</div>

<div class="animate-bounce">
  เด้งๆ
</div>

<!-- Custom Animation ด้วย arbitrary values (JIT Mode) -->
<div class="animate-[fadeIn_0.5s_ease-in-out]">
  Fade In Animation (ต้องกำหนด @keyframes fadeIn เอง)
</div>

Transform Classes

<!-- Scale (ขยาย-ย่อ) -->
<div class="transform scale-50">ย่อเหลือ 50%</div>
<div class="transform scale-110 hover:scale-125">ขยาย 110% และ hover ขยาย 125%</div>

<!-- Rotate (หมุน) -->
<div class="transform rotate-45">หมุน 45 องศา</div>
<div class="transform hover:rotate-180 transition-transform">หมุนเมื่อ hover</div>

<!-- Translate (เลื่อน) -->
<div class="transform translate-x-4">เลื่อนขวา 1rem</div>
<div class="transform -translate-y-2">เลื่อนขึ้น 0.5rem</div>
<div class="transform hover:translate-x-2 hover:-translate-y-1 transition-transform">
  เลื่อนขวาและขึ้นเมื่อ hover
</div>

<!-- Skew (เอียง) -->
<div class="transform skew-x-12">เอียงแนวนอน</div>
<div class="transform skew-y-6">เอียงแนวตั้ง</div>

 

เทคนิคการใช้งานขั้นสูง

1. JIT Mode และ Arbitrary Values

ใช้ค่าที่กำหนดเอง (JIT Mode เปิดอยู่ตามค่าเริ่มต้น)

<!-- ขนาดและระยะห่างที่กำหนดเอง -->
<div class="w-[350px]">ความกว้าง 350px</div>
<div class="h-[calc(100vh-64px)]">ความสูงคำนวณจาก viewport</div>
<div class="mt-[18px]">margin-top 18px</div>

<!-- สีที่กำหนดเอง -->
<div class="bg-[#bada55]">สีพื้นหลังที่กำหนดเอง</div>
<div class="text-[rgb(123,45,67)]">สีข้อความ RGB</div>

<!-- ขนาดตัวอักษรที่กำหนดเอง -->
<div class="text-[22px]">ขนาดตัวอักษร 22px</div>
<div class="text-[1.375rem]">ขนาดตัวอักษร 1.375rem</div>

<!-- Grid columns ที่กำหนดเอง -->
<div class="grid-cols-[1fr_2fr_1fr]">Grid 3 คอลัมน์ แบบ fraction</div>

⚠️ คำเตือน: Arbitrary values จะทำงานได้เฉพาะเมื่อ JIT Mode เปิดใช้งาน

2. การใช้ CSS Variables

<!-- ต้องมี CSS Variables กำหนดไว้ก่อน -->
<style>
:root {
  --primary-color: #3b82f6;
  --secondary-color: #64748b;
}
</style>

<div class="bg-[var(--primary-color)]">ใช้ CSS Variable</div>
<div class="text-[var(--secondary-color)]">ข้อความใช้ CSS Variable</div>

3. การใช้ Pseudo-elements และ Pseudo-selectors

<!-- First และ Last Child -->
<ul>
  <li class="first:mt-0 last:mb-0 mt-4 mb-4">รายการที่ 1</li>
  <li class="first:mt-0 last:mb-0 mt-4 mb-4">รายการที่ 2</li>
  <li class="first:mt-0 last:mb-0 mt-4 mb-4">รายการที่ 3</li>
</ul>

<!-- Odd และ Even -->
<table class="w-full">
  <tbody>
    <tr class="odd:bg-gray-50 even:bg-white">
      <td class="px-4 py-2">แถวคี่จะมีพื้นหลังสีเทา</td>
    </tr>
    <tr class="odd:bg-gray-50 even:bg-white">
      <td class="px-4 py-2">แถวคู่จะมีพื้นหลังสีขาว</td>
    </tr>
  </tbody>
</table>

<!-- Disabled State -->
<button class="bg-blue-500 text-white px-4 py-2 rounded disabled:bg-gray-300 disabled:cursor-not-allowed disabled:opacity-50" 
        disabled>
  Disabled Button
</button>

<!-- Before และ After (ต้องใช้ content) -->
<div class="before:content-['→'] before:mr-2 after:content-['←'] after:ml-2">
  ข้อความมีเครื่องหมายก่อนหลัง
</div>

 

ข้อผิดพลาดที่ควรหลีกเลี่ยง

1. การใช้คลาสซ้ำซ้อน

<!-- ❌ ผิด: ใช้คลาสที่ซ้ำกัน -->
<div class="p-4 px-6 py-2">
  <!-- px-6 และ py-2 จะ override p-4 -->
  <!-- ผลลัพธ์: padding: 0.5rem 1.5rem (ไม่ใช่ 1rem ทั้งหมด) -->
</div>

<!-- ✅ ถูก: ใช้คลาสที่เฉพาะเจาะจง -->
<div class="px-6 py-2">
  <!-- ใช้เฉพาะ px และ py ตามที่ต้องการ -->
</div>

2. ไม่เข้าใจลำดับความสำคัญของคลาส

<!-- ❌ ปัญหา: คลาสหลังจะ override คลาสแรก -->
<div class="text-red-500 text-blue-500">
  <!-- จะเป็นสีน้ำเงิน เพราะ text-blue-500 มาทีหลัง -->
</div>

<!-- ✅ แก้ไข: ใช้คลาสเดียว -->
<div class="text-blue-500">
  <!-- ชัดเจนว่าเป็นสีน้ำเงิน -->
</div>

<!-- ✅ หรือใช้ important (หลีกเลี่ยงถ้าไม่จำเป็น) -->
<div class="!text-red-500 text-blue-500">
  <!-- จะเป็นสีแดง เพราะมี !important -->
</div>

3. การลืมใช้ Responsive Classes

<!-- ❌ ไม่ responsive -->
<div class="grid grid-cols-4 gap-4">
  <!-- 4 คอลัมน์ในทุกขนาดหน้าจอ (เกินไปสำหรับมือถือ) -->
</div>

<!-- ✅ Responsive -->
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
  <!-- 1 คอลัมน์ในมือถือ, 2 ในแท็บเล็ต, 4 ใน desktop -->
</div>

4. การไม่ใช้ Transition

<!-- ❌ เปลี่ยนแปลงแบบกะทันหัน -->
<button class="bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded">
  Button แบบกะทันหัน
</button>

<!-- ✅ เปลี่ยนแปลงแบบนุ่มนวล -->
<button class="bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded transition-colors duration-200">
  Button แบบนุ่มนวล
</button>

 

เครื่องมือช่วยเหลือและ Resources

1. Browser Extensions

Tailwind CSS DevTools

  • ตรวจสอบคลาสที่ใช้
  • แสดงค่า CSS ที่แท้จริง
  • Debug Responsive breakpoints

2. VS Code Extensions

Tailwind CSS IntelliSense

// settings.json
{
  "tailwindCSS.includeLanguages": {
    "html": "html",
    "javascript": "javascript",
    "vue": "vue",
    "react": "javascriptreact",
    "typescript": "typescript"
  },
  "tailwindCSS.classAttributes": [
    "class",
    "className",
    "classList",
    "ngClass"
  ],
  "editor.quickSuggestions": {
    "strings": true
  }
}

Headwind (Class Sorter)

  • จัดเรียงคลาสให้เป็นระเบียบ
  • ทำให้โค้ดอ่านง่ายขึ้น
  • ใช้ลำดับมาตรฐานของ Tailwind

3. Online Tools

Tailwind CSS Playground

Tailwind UI Components

  • https://tailwindui.com
  • ตัวอย่าง Component สำเร็จรูป
  • เรียนรู้จากโค้ดคุณภาพสูง

Official Documentation

 

โปรเจ็กต์ปฏิบัติ: สร้าง Feature Card

มาลองสร้าง Component ที่ครอบคลุมการใช้งานหลายๆ เทคนิค:

<!DOCTYPE html>
<html lang="th">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Feature Card Example</title>
    <script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-50 p-8">

<div class="max-w-md mx-auto">
  <!-- Feature Card -->
  <div class="group bg-white rounded-2xl shadow-lg hover:shadow-xl transition-all duration-300 overflow-hidden border border-gray-100">
    
    <!-- Header Image -->
    <div class="relative h-48 bg-gradient-to-br from-blue-500 to-purple-600 overflow-hidden">
      <div class="absolute inset-0 bg-black bg-opacity-20 group-hover:bg-opacity-10 transition-all duration-300"></div>
      <div class="relative h-full flex items-center justify-center">
        <div class="w-16 h-16 bg-white bg-opacity-20 rounded-2xl flex items-center justify-center group-hover:scale-110 transition-transform duration-300">
          <svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z" />
          </svg>
        </div>
      </div>
    </div>

    <!-- Content -->
    <div class="p-6">
      <div class="flex items-center justify-between mb-3">
        <span class="inline-block bg-blue-100 text-blue-800 text-xs font-semibold px-2.5 py-0.5 rounded-full">
          เทคโนโลยี
        </span>
        <span class="text-sm text-gray-500">2 นาทีในการอ่าน</span>
      </div>

      <h3 class="text-xl font-bold text-gray-900 mb-2 group-hover:text-blue-600 transition-colors duration-200">
        ประสิทธิภาพสูงสุด
      </h3>

      <p class="text-gray-600 text-sm leading-relaxed mb-4">
        เพิ่มความเร็วและประสิทธิภาพของเว็บไซต์ด้วยเทคนิคที่ทันสมัย รองรับการใช้งานบนทุกอุปกรณ์
      </p>

      <!-- Stats -->
      <div class="flex items-center justify-between mb-4 p-3 bg-gray-50 rounded-lg">
        <div class="text-center">
          <div class="text-lg font-bold text-gray-900">99%</div>
          <div class="text-xs text-gray-500">Uptime</div>
        </div>
        <div class="text-center">
          <div class="text-lg font-bold text-gray-900">< 1s</div>
          <div class="text-xs text-gray-500">Loading</div>
        </div>
        <div class="text-center">
          <div class="text-lg font-bold text-gray-900">A+</div>
          <div class="text-xs text-gray-500">Security</div>
        </div>
      </div>

      <!-- Action Buttons -->
      <div class="flex gap-2">
        <button class="flex-1 bg-blue-500 hover:bg-blue-600 text-white font-medium py-2 px-4 rounded-lg transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2">
          เรียนรู้เพิ่ม
        </button>
        <button class="p-2 text-gray-400 hover:text-gray-600 hover:bg-gray-100 rounded-lg transition-all duration-200">
          <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" />
          </svg>
        </button>
      </div>
    </div>

    <!-- Footer -->
    <div class="px-6 py-3 bg-gray-50 border-t border-gray-100">
      <div class="flex items-center justify-between">
        <div class="flex items-center space-x-2">
          <div class="w-6 h-6 bg-blue-500 rounded-full flex items-center justify-center">
            <span class="text-xs font-bold text-white">T</span>
          </div>
          <span class="text-sm text-gray-600">โดย Team Tailwind</span>
        </div>
        <span class="text-xs text-gray-400">อัพเดทเมื่อ 2 ชม. ที่แล้ว</span>
      </div>
    </div>
  </div>
</div>

</body>
</html>

 


 

สรุป

ใน EP 2 นี้ เราได้เรียนรู้เกี่ยวกับหัวใจสำคัญของ Tailwind CSS ที่ทำให้มันแตกต่างจาก CSS Framework อื่นๆ:

สิ่งสำคัญที่เราได้เรียนรู้:

  • Utility-First คือการใช้คลาสเล็กๆ หลายคลาสมาประกอบกัน แทนการเขียน CSS แยกไฟล์
  • ระบบการจัดหมวดหมู่คลาส ที่ครอบคลุม Layout, Spacing, Colors, Typography, และอื่นๆ
  • เทคนิคการจำคลาสแบบเซียน ด้วยการจำ Pattern และสร้างระบบของตัวเอง
  • Responsive Design ที่ใช้งานง่ายด้วย Breakpoint System
  • State Variants สำหรับ Hover, Focus, และสถานะต่างๆ
  • Animation และ Transition ที่ทำให้เว็บไซต์มีชีวิตชีวา
  • JIT Mode และการใช้ Arbitrary Values สำหรับความยืดหยุ่น

จุดสำคัญที่ต้องจำ:

  1. Mobile-First: เริ่มจากมือถือแล้วขยายไป Desktop
  2. คลาสหลังชนะ: เมื่อมีคลาสที่ conflict กัน คลาสที่มาทีหลังจะชนะ
  3. ใช้ Transition: ทำให้การเปลี่ยนแปลงนุ่มนวล
  4. JIT Mode: ใช้ arbitrary values ได้แบบไม่จำกัด
  5. Dark Mode: ต้องเปิดใช้งานใน config ก่อน

EP 3 เรื่อง "เล่นสีและฟอนต์ให้เก่ง: เทคนิคสร้าง Design System ด้วย Tailwind" เราจะมาเรียนรู้เทคนิคการใช้สีและ Typography อย่างมืออาชีพ การสร้าง Design System ที่สม่ำเสมอ และการปรับแต่ง Tailwind ให้เข้ากับแบรนด์ของเรา

พร้อมที่จะก้าวสู่การเป็นมือโปร Tailwind CSS แล้วใช่ไหม? ติดตาม Superdev School เพื่อไม่พลาดเทคนิคเด็ดๆ ในตอนต่อไป!

มาสร้างเว็บไซต์สวยๆ ด้วย Tailwind CSS กันเถอะ! 🚀

อ่านบทความ Series อื่นๆ

🔵 Facebook: Superdev School  (Superdev)

📸 Instagram: superdevschool

🎬 TikTok: superdevschool

🌐 Website: www.superdev.school