Bài này hoàn thiện kỹ năng Tailwind: chế độ tối theo hệ điều hành hoặc nút bấm, tạo lớp tiện ích riêng bằng @utility, variant riêng bằng @custom-variant, dùng @apply đúng chỗ, và các plugin chính thức như typography, forms.
- Dùng dark: theo hệ điều hành và theo class
- Tạo lớp tiện ích riêng với @utility
- Dùng @apply có chừng mực, @layer components
- Cài plugin @tailwindcss/typography, @tailwindcss/forms
Một số khái niệm
Mặc định dark: theo prefers-color-scheme của hệ điều hành. Muốn bật tắt bằng nút, khai báo lại variant: @custom-variant dark (&:where(.dark, .dark *)); rồi thêm/bỏ class dark trên thẻ html.
Chế độ tối bằng nút
<style type="text/tailwindcss">@custom-variant dark (&:where(.dark, .dark *));</style>
<div id="ui" class="rounded-2xl bg-white p-5 text-slate-800 ring-1 ring-slate-200 dark:bg-slate-900 dark:text-slate-100 dark:ring-slate-700">
<div class="flex items-center justify-between"><b>Giao diện</b>
<button class="rounded-lg bg-slate-100 px-3 py-1 text-sm dark:bg-slate-700" onclick="document.getElementById('ui').classList.toggle('dark')">Đổi sáng/tối</button></div>
<p class="mt-2 text-sm text-slate-500 dark:text-slate-400">Mỗi lớp màu có cặp dark: tương ứng.</p>
<span class="mt-3 inline-block rounded-full bg-green-100 px-2 py-1 text-xs text-green-800 dark:bg-green-900 dark:text-green-200">Tailwind v4</span>
</div>@utility, @custom-variant, @apply
@import "tailwindcss";
/* Lớp tiện ích riêng: dùng được với mọi variant (hover:, md:...) */
@utility an-thanh-cuon {
scrollbar-width: none;
&::-webkit-scrollbar { display: none; }
}
@utility container-doc {
margin-inline: auto;
max-width: 72ch;
padding-inline: 1rem;
}
/* Variant riêng */
@custom-variant da-chon (&[aria-selected="true"]);
/* <li class="da-chon:bg-green-100"> */
/* @apply: gom lớp cho HTML không kiểm soát được (nội dung CMS, markdown) */
@layer components {
.noi-dung-bai a { @apply text-green-700 underline underline-offset-2 hover:text-green-900; }
}Chỉ dùng @apply khi không thể gắn lớp trực tiếp (nội dung sinh từ CMS, thư viện bên thứ ba). Lạm dụng @apply biến Tailwind trở lại thành CSS truyền thống và mất lợi ích utility-first.
Plugin chính thức
npm install -D @tailwindcss/typography @tailwindcss/forms@import "tailwindcss";
@plugin "@tailwindcss/typography";
@plugin "@tailwindcss/forms";<article class="prose prose-slate max-w-none prose-a:text-green-700">
<h3>Lớp prose định dạng nội dung bài viết</h3>
<p>Plugin <a href="#">typography</a> tự định dạng tiêu đề, đoạn văn, <code>code</code>, danh sách, trích dẫn cho nội dung từ Markdown hoặc CMS.</p>
<ul><li>Không cần thêm lớp cho từng thẻ</li><li>Có biến thể prose-lg, dark:prose-invert</li></ul>
</article>Ví dụ trên chạy bằng CDN nên không có plugin typography; trong dự án thật sau khi cài plugin, đoạn văn sẽ được định dạng đẹp tự động.
Với nội dung bài viết từ Joomla/WordPress/Markdown, bọc bằng <article class="prose dark:prose-invert"> là xong phần định dạng.
Không trộn hai cơ chế dark (theo hệ điều hành và theo class) mà không khai báo @custom-variant; kết quả sẽ khó đoán.
- Làm nút chuyển sáng/tối lưu lựa chọn vào localStorage.
- Tạo @utility container-doc cho trang bài viết.
- Định dạng nội dung bài viết bằng plugin typography.
- Dùng plugin forms để chuẩn hóa ô nhập trên mọi trình duyệt.
- dark: mặc định theo hệ điều hành; @custom-variant để theo class.
- @utility tạo lớp riêng; @custom-variant tạo variant riêng.
- @apply chỉ cho HTML không kiểm soát được.
- @plugin typography (prose), forms.