Developer Tools

เคล็ดลับและเทคนิค Tailwind CSS เพื่อพัฒนา UI ได้เร็วขึ้น

เทคนิคเชิงปฏิบัติสำหรับการใช้ Tailwind CSS ให้ได้ประโยชน์สูงสุด ตั้งแต่รูปแบบ Responsive Design ไปจนถึง Dark Mode, Custom Theme และการแยก Component

7 นาทีในการอ่าน

Designer working on UI components

Tailwind CSS ได้เปลี่ยนวิธีที่นักพัฒนาเขียน Style ไปอย่างสิ้นเชิง แทนที่จะต้องสลับไปมาระหว่างไฟล์ HTML กับ CSS และคิดชื่อ Class ขึ้นมาเอง คุณสามารถประกอบ Utility Class ต่างๆ ได้โดยตรงใน Markup เลย ผลลัพธ์ที่ได้คือการ Iterate ที่รวดเร็วขึ้น ไม่มี CSS ที่ไม่ได้ใช้งานใน Production และได้ Design System ที่สม่ำเสมอ — ถ้าคุณรู้จักรูปแบบที่ถูกต้อง

แนวคิด Utility-First

ก่อนจะเข้าสู่เทคนิคต่างๆ ควรเข้าใจปรัชญาหลักก่อน: แต่ละ Class ทำหน้าที่เพียงอย่างเดียว แทนที่จะเขียนแบบนี้:

.card {
  background-color: white;
  border-radius: 8px;
  padding: 16px 24px;
  box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}

คุณเขียนแบบนี้แทน:

<div class="bg-white rounded-lg px-6 py-4 shadow-sm">

Style อยู่ติดกับโครงสร้างเลย ไม่ต้องสลับบริบท ไม่ต้องเสียเวลาถกเรื่องชื่อ Class

Responsive Design: Breakpoint แบบ Mobile-First

Tailwind ใช้แนวทาง Mobile-First โดย Utility ที่ไม่มี Prefix จะใช้กับทุกขนาดหน้าจอ ส่วน Utility ที่มี Prefix จะ Override ที่ Breakpoint นั้นและขนาดที่ใหญ่กว่าขึ้นไป:

<!-- เต็มความกว้างบนมือถือ, ครึ่งหนึ่งบน medium, หนึ่งในสามบน large -->
<div class="w-full md:w-1/2 lg:w-1/3">

<!-- เรียงแนวตั้งบนมือถือ, แนวนอนบน medium ขึ้นไป -->
<div class="flex flex-col md:flex-row gap-4">

<!-- ซ่อนบนมือถือ, แสดงบน large ขึ้นไป -->
<aside class="hidden lg:block">

Breakpoint เริ่มต้น:

Prefix Min-width
sm: 640px
md: 768px
lg: 1024px
xl: 1280px
2xl: 1536px

Dark Mode

เปิดใช้งาน Dark Mode ใน tailwind.config.ts:

export default {
  darkMode: "class", // หรือ "media"
  // ...
}

เมื่อใช้โหมด "class" ให้เพิ่ม Class dark ที่ <html> เมื่อผู้ใช้สลับเป็น Dark Mode ส่วนโหมด "media" จะทำตามการตั้งค่าระบบปฏิบัติการโดยอัตโนมัติ

<div class="bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100">
  <h1 class="text-2xl font-bold">Hello World</h1>
  <p class="text-gray-600 dark:text-gray-400">Supporting text</p>
</div>

การแยก Component ด้วย @apply

เมื่อ Pattern เดิมซ้ำๆ กัน ให้แยกออกมา — แต่ใช้ให้พอดี:

/* globals.css */
@layer components {
  .btn-primary {
    @apply inline-flex items-center px-4 py-2 rounded-md
           bg-blue-600 text-white font-medium text-sm
           hover:bg-blue-700 focus:outline-none focus:ring-2
           focus:ring-blue-500 focus:ring-offset-2
           transition-colors duration-150;
  }
}

ใช้ @apply เฉพาะกับ UI Component ที่คุณนำกลับมาใช้ซ้ำในหลายที่ สำหรับ Style ที่ใช้ครั้งเดียว ให้คง Utility ไว้แบบ Inline ดีกว่า การใช้ @apply มากเกินไปจะสร้างปัญหาแบบเดิมที่ Tailwind ออกแบบมาเพื่อแก้ไข

Custom Design Token

กำหนด Design System ของคุณใน tailwind.config.ts:

export default {
  theme: {
    extend: {
      colors: {
        brand: {
          50:  "#eff6ff",
          500: "#3b82f6",
          900: "#1e3a8a",
        },
      },
      fontFamily: {
        sans: ["Inter", "system-ui", "sans-serif"],
        mono: ["JetBrains Mono", "monospace"],
      },
      spacing: {
        18: "4.5rem",
        88: "22rem",
      },
      borderRadius: {
        "4xl": "2rem",
      },
    },
  },
}

ตอนนี้คุณสามารถใช้ text-brand-500, font-mono, mt-18 ฯลฯ ได้เลย — พร้อม IntelliSense ครบถ้วนใน VS Code

การแปลง CSS เดิมเป็น Tailwind

กำลัง Migrate Codebase เก่าอยู่ใช่ไหม? ใช้ Tailwind Converter ของเรา เพียงวาง CSS แล้วรับ Utility Class ของ Tailwind ที่เทียบเท่าได้ทันที

/* Input CSS */
.hero {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 2rem 4rem;
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  border-radius: 1rem;
}

flex items-center justify-between px-16 py-8 bg-gradient-to-br from-indigo-500 to-purple-600 rounded-2xl

Arbitrary Value

ต้องการค่าที่ไม่อยู่ใน Scale เริ่มต้น? ใช้วงเล็บเหลี่ยมได้เลย:

<!-- ค่า Pixel แบบแม่นยำ -->
<div class="w-[327px] mt-[13px]">

<!-- สีแบบกำหนดเอง -->
<div class="bg-[#1a2332] text-[#e8f4f8]">

<!-- CSS Variable แบบกำหนดเอง -->
<div class="text-[var(--brand-color)]">

<!-- Grid แบบซับซ้อน -->
<div class="grid grid-cols-[1fr_2fr_1fr]">

ใช้สิ่งเหล่านี้ให้พอเหมาะ — ถ้าคุณใช้ Arbitrary Value เดิมซ้ำกันหลายที่ ให้เพิ่มลงใน Config แทน

State Variant

Tailwind มาพร้อม State Variant ทุกแบบที่คุณต้องการ:

<!-- Hover, focus, active -->
<button class="bg-blue-600 hover:bg-blue-700 active:bg-blue-800 focus:ring-2">

<!-- สถานะของ Form -->
<input class="border-gray-300 focus:border-blue-500 disabled:opacity-50 disabled:cursor-not-allowed">

<!-- Group hover (Parent ควบคุม Child) -->
<div class="group">
  <h3 class="text-gray-900 group-hover:text-blue-600">Title</h3>
  <p class="hidden group-hover:block">ซ่อนอยู่จนกว่า Parent จะถูก Hover</p>
</div>

<!-- Peer (สถานะของ Sibling) -->
<input type="checkbox" class="peer">
<label class="hidden peer-checked:block">ถูกเลือกแล้ว!</label>

Performance: การตัด Style ที่ไม่ได้ใช้

JIT (Just-In-Time) Compiler ของ Tailwind จะสแกนไฟล์ Template ของคุณและสร้างเฉพาะ CSS Class ที่คุณใช้งานจริงเท่านั้น โดย Bundle ใน Production โดยทั่วไปจะมี CSS แค่ 5–15 KB

ตรวจสอบให้แน่ใจว่า Path ใน content ของ tailwind.config.ts ครอบคลุมไฟล์ Template ทั้งหมด:

export default {
  content: [
    "./app/**/*.{js,ts,jsx,tsx,mdx}",
    "./components/**/*.{js,ts,jsx,tsx}",
    "./content/**/*.mdx",
  ],
  // ...
}

ถ้าคุณสร้างชื่อ Class แบบ Dynamic (เช่น `bg-${color}-500`) Tailwind จะตรวจจับไม่ได้ ให้ใช้ Safelist หรือ String Class แบบเต็มแทน:

// ❌ Dynamic — Tailwind ตรวจจับ "bg-red-500" ไม่ได้
const cls = `bg-${color}-500`;

// ✅ String Class แบบเต็ม — ตรวจจับได้
const colorMap = { red: "bg-red-500", blue: "bg-blue-500" };

Typography Plugin

Plugin @tailwindcss/typography เพิ่ม Class prose ที่จัด Style เนื้อหา HTML ตามอำเภอใจให้สวยงาม — เหมาะมากสำหรับ Blog Post, Documentation และผลลัพธ์จาก Markdown:

<article class="prose prose-lg dark:prose-invert max-w-none">
  <!-- วาง HTML ที่ Render จาก Markdown ของคุณที่นี่ -->
</article>

ครอบคลุม Heading, List, Blockquote, Code Block, Table และอื่นๆ ด้วยค่าเริ่มต้นที่เหมาะสม

Checklist สำหรับ Quick Win

  • ใช้ gap-* บน Flex/Grid Container แทนการใช้ Margin บน Child
  • space-x-* และ space-y-* สำหรับเพิ่มช่องว่างระหว่าง Sibling Element
  • divide-* สำหรับ Border ระหว่าง Child โดยไม่ต้องเพิ่ม Markup เพิ่มเติม
  • ring-* สำหรับ Focus Ring (ดีกว่า outline-* สำหรับ Style แบบกำหนดเอง)
  • truncate สำหรับ Overflow แบบบรรทัดเดียวพร้อม Ellipsis
  • line-clamp-3 สำหรับการตัดข้อความแบบหลายบรรทัด (ต้องใช้ Typography Plugin)
  • sr-only เพื่อซ่อน Accessibility Label ทางสายตา

Tailwind ให้ผลตอบแทนกับการลงทุนเสมอ ยิ่งคุณคุ้นเคยกับคำศัพท์ Utility มากเท่าไหร่ คุณก็จะ Ship UI ที่สวยงามและสม่ำเสมอได้เร็วขึ้นเท่านั้น