blog.dopana

Back

Tailwind CSS thay đổi cách viết CSS. Utility classes thay vì custom CSS — nhanh hơn, nhất quán hơn, dễ maintain hơn.

Utility-First#

Thay vì: đặt tên class → mở file CSS → viết rules

<!-- ❌ Cách cũ -->
<div class="card">
  <h2 class="card-title">Hello</h2>
</div>
html
.card { background: white; border-radius: 8px; padding: 16px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
.card-title { font-size: 1.25rem; font-weight: 600; color: #1a1a1a; }
css

Với Tailwind — dùng class trực tiếp trong HTML:

<!-- ✅ Tailwind -->
<div class="bg-white rounded-lg p-4 shadow-sm">
  <h2 class="text-xl font-semibold text-gray-900">Hello</h2>
</div>
html

Responsive Design#

<!-- Mobile-first: mặc định cho mobile, sm: cho tablet, lg: cho desktop -->
<div class="
  grid
  grid-cols-1
  sm:grid-cols-2
  lg:grid-cols-3
  xl:grid-cols-4
  gap-4
">
html

Breakpoints mặc định:

sm: 640px   → @media (min-width: 640px)
md: 768px
lg: 1024px
xl: 1280px
2xl: 1536px
css

Dark Mode#

<div class="bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100">
  <h1 class="text-2xl font-bold">Content</h1>
</div>
html

Config tailwind.config.ts:

export default {
  darkMode: 'class', // Dùng class toggle — không theo system
  // hoặc
  darkMode: 'media', // Theo system preference
};
typescript

Custom Theme#

Components — Tái Sử Dụng#

Với React/Astro — tách thành component:

Layout Ví Dụ#

Optimization — Purge CSS#

Tailwind tự động loại bỏ CSS không dùng trong production:

export default {
  content: [
    './src/**/*.{astro,tsx,html}',
    './node_modules/my-library/**/*.tsx', // Include cả library
  ],
};
typescript

Kết quả: file CSS thường < 10KB sau khi gzip.

Với Astro#

VS Code Extensions#

  • Tailwind CSS IntelliSense — autocomplete, hover preview
  • Tailwind Fold — fold long class lists
  • Headwind — sắp xếp class theo order

Tips#

<!-- arbitrary value — khi cần giá trị đặc biệt -->
<div class="w-[calc(100%-2rem)] top-[37px]">
  
<!-- ! cho important -->
<div class="!text-blue-600">

<!-- group hover -->
<div class="group cursor-pointer">
  <h3 class="group-hover:text-blue-600">Title</h3>
  <p class="opacity-0 group-hover:opacity-100 transition">Hidden content</p>
</div>

<!-- peer — dựa vào sibling state -->
<input class="peer" type="checkbox" />
<label class="peer-checked:text-blue-600">Check me</label>
html

Kết Luận#

Tailwind CSS xoá bỏ việc đặt tên class, chuyển context switch giữa HTML và CSS. Nhanh hơn, nhất quán hơn. Học 20 class đầu khó — nhưng sau đó là tự nhiên. Kết hợp với component framework (React, Astro) cho kết quả tuyệt vời.

Tài liệu tham khảo#