Bài hôm nay sẽ giúp bạn bước vào vùng đất mà nhiều dev Tailwind “thích thú” nhưng cũng không khỏi thắc mắc lúc ban đầu: làm sao để không phải viết đi viết lại cùng một đống class dài dằng dặc?
Câu trả lời nằm ở: @apply và component CSS.
Bạn đã quen với việc viết class trực tiếp trong HTML như sau:
<button class="bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700 transition">
Gửi
</button>
Nhưng nếu có 5 nút giống hệt như vậy, bạn sẽ phải lặp lại đoạn class này… 5 lần.
Thế là bạn nghĩ ngay: “Giá mà mình có thể gộp mấy cái này lại thành một class btn và dùng thôi…”
Tin vui là: Tailwind cho phép bạn làm điều đó thông qua @apply.
Bài học hôm nay sẽ giúp bạn:
- Hiểu cách dùng
@applytrong CSS để tạo class tùy chỉnh - Tổ chức component trong file riêng
- Cách dùng
@layervà phân tách logic rõ ràng
@apply – gộp nhiều utility class vào một class
Khi dùng Tailwind với công cụ build (như PostCSS hoặc Vite), bạn có thể viết CSS như sau:
/* styles.css */
.btn {
@apply bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700 transition;
}
.btn-outline {
@apply border border-blue-600 text-blue-600 bg-white hover:bg-blue-50;
}
Sau đó, bạn dùng trong HTML như bình thường:
<button class="btn">Nút thường</button>
<button class="btn-outline">Nút viền</button>
Tailwind sẽ biên dịch class btn thành toàn bộ style tương ứng với class gốc.
Dùng với @layer components để rõ ràng hơn
Tailwind có 3 layer mặc định:
base– reset CSS, mặc định toàn cụccomponents– class tùy chỉnh dạng componentutilities– class tiện ích (như bạn dùng mỗi ngày)
Khi thêm component, bạn nên viết trong block @layer components:
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer components {
.btn {
@apply bg-indigo-600 text-white py-2 px-4 rounded transition hover:bg-indigo-700;
}
.card {
@apply bg-white shadow-md rounded p-6;
}
.badge {
@apply inline-block text-sm px-2 py-1 bg-yellow-100 text-yellow-800 rounded-full;
}
}
Đây là cách tổ chức sạch sẽ và tương thích với Tailwind.
Khi nào nên dùng @apply?
Nên dùng:
- Với class dùng lại nhiều lần (nút, thẻ card, badge…)
- Khi cần tổ chức style gọn gàng trong file riêng
- Khi kết hợp với component framework (React, Vue…)
Không nên dùng:
- Với các class logic/phức tạp (
hover:bg-...,md:grid-cols-3) lồng nhau quá nhiều - Khi không có công cụ build hỗ trợ PostCSS
Gợi ý cách tổ chức component trong dự án
Bạn có thể tách file components.css hoặc styles.css riêng, và import trong file main:
// tailwind.config.js
content: ["./src/**/*.{html,js}"],
// trong src/styles.css
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer components {
.btn-primary {
@apply bg-emerald-600 text-white px-4 py-2 rounded hover:bg-emerald-700;
}
.alert-success {
@apply bg-green-100 text-green-800 border border-green-200 px-4 py-2 rounded;
}
}
Cứ thế, bạn xây dựng thư viện component riêng bằng chính Tailwind.
So sánh với CSS truyền thống
| Mục đích | CSS thuần | Tailwind với @apply |
|---|---|---|
| Gộp class nút | .btn { ... } | .btn { @apply bg-*, text-* } |
| Component badge | .badge { background:... } | .badge { @apply bg-*, rounded } |
| Quản lý style logic | CSS Module / BEM / SCSS | Tailwind + @layer components |
Tổng kết kiến thức
| Kỹ thuật | Mô tả |
|---|---|
@apply | Gộp nhiều utility class thành 1 class tùy chỉnh |
@layer | Tổ chức các class theo nhóm (components, base) |
| component | Class tái sử dụng như btn, card, badge |
| Khi dùng | Khi cần tối ưu, tái sử dụng, tổ chức rõ ràng |
Tóm tắt bài học
- Tailwind không chỉ là hệ thống tiện ích – nó có thể trở thành framework component nếu bạn biết dùng
@apply. - Bạn có thể tạo các class riêng cho nút, thẻ, badge, v.v., vừa gọn gàng vừa dễ bảo trì.
- Khi dự án lớn lên, việc tách style ra
@layer componentslà chiến lược rất thông minh.
Bài tiếp theo
Bây giờ bạn đã có class tái sử dụng, theme riêng, màu sắc thương hiệu…
Câu hỏi tiếp theo là: khi dự án phình to, tổ chức file, cấu trúc Tailwind sao cho gọn?
Trong bài 28, bạn sẽ học:
- Cách tổ chức folder, style, component trong dự án lớn
- Cách làm việc nhóm với Tailwind
- Một vài gợi ý cấu trúc thực tế từ cộng đồng
Hẹn bạn trong bài 28: Cách tổ chức Tailwind trong dự án lớn – giữ code sạch, dễ mở rộng và làm nhóm hiệu quả.
Đây là lúc bạn bắt đầu “think like a team”!

Thảo luận