Xây dựng hệ thống Design System đa theme (Dark/Light mode) bằng CSS Variables và Tailwind
Bẫy mã nguồn khi làm Dark Mode kiểu "Hard-coded" Nhiều lập trình viên khi làm Dark Mode bằng Tailwind thường rải rác class dark: ở khắp mọi nơi trong mã nguồn: Cách viết này khiến code component bị p…
☰ Mục lục bài viết (5 phần) Mở / Đóng mục lục
Bẫy mã nguồn khi làm Dark Mode kiểu "Hard-coded"#
Nhiều lập trình viên khi làm Dark Mode bằng Tailwind thường rải rác class dark: ở khắp mọi nơi trong mã nguồn:
<div class="bg-white dark:bg-gray-900 text-gray-800 dark:text-gray-100 border-gray-200 dark:border-gray-800">
Cách viết này khiến code component bị phình to gấp đôi, khó đọc và biến việc thay đổi bảng màu hoặc bổ sung thêm Theme thứ 3 (như Blue Theme, High Contrast) thành nhiệm vụ bất khả thi.
Giải pháp chuyên nghiệp của các Design System hàng đầu (như Radix UI, Shadcn UI) là sử dụng Semantic CSS Variables.
1. Định nghĩa bảng màu trừu tượng (Semantic Color Tokens)#
/* Trong file global.css */
:root {
--background: 0 0% 100%; /* Trắng tinh */
--foreground: 240 10% 3.9%; /* Chữ đen */
--primary: 24.6 95% 53.1%; /* Cam TopDev */
--card: 0 0% 100%;
--border: 240 5.9% 90%;
}
.dark {
--background: 240 10% 3.9%; /* Nền đen */
--foreground: 0 0% 98%; /* Chữ trắng sáng */
--primary: 24.6 95% 53.1%;
--card: 240 10% 6%;
--border: 240 3.7% 15.9%;
}
2. Kết nối với Tailwind CSS#
// tailwind.config.js
module.exports = {
darkMode: 'class',
theme: {
extend: {
colors: {
background: 'hsl(var(--background) / <alpha-value>)',
foreground: 'hsl(var(--foreground) / <alpha-value>)',
primary: 'hsl(var(--primary) / <alpha-value>)',
card: 'hsl(var(--card) / <alpha-value>)',
}
}
}
}
Component giờ đây sạch sẽ tuyệt đối#
<!-- Không cần viết bất kỳ class dark: nào nữa! -->
<div class="bg-card text-foreground border-border rounded-xl p-6 shadow-sm">
<h2 class="text-primary font-bold">Tiêu đề bài viết</h2>
</div>
Khi chuyển đổi giữa Dark và Light mode, chỉ cần bật/tắt class .dark ở thẻ <html>, toàn bộ component sẽ tự động đổi màu mượt mà!
Góc thảo luận#
Hệ thống UI của công ty bạn đang quản lý bảng màu Design Tokens bằng công cụ gì? Figma Tokens, Style Dictionary hay CSS Variables thuần?
Xem thêm nội dung liên quan:
Thảo luận
1 phản hồi
Tham gia thảo luận
Bài liên quan trong #Frontend & Web UI
-
Xây dựng Voice AI Agent thời gian thực với WebRTC và Whisper Live: Độ trễ dưới 500ms
Lan Anh (Senior Frontend) · 💬 1 -
Tối ưu SEO cho Website Client-Side Rendering: Dynamic Rendering vs Static Export
Lan Anh (Senior Frontend) · 💬 1 -
Debug Memory Leak trong Single Page Application bằng Chrome DevTools Memory Profiler
Lan Anh (Senior Frontend) · 💬 1 -
Viết Component Accessible (a11y) chuẩn WAI-ARIA: Giúp website thân thiện với mọi đối tượng
Lan Anh (Senior Frontend) · 💬 1 -
Deep-dive React 19 Actions và useActionState: Đơn giản hóa quản lý Form không cần thư viện ngoài
Lan Anh (Senior Frontend) · 💬 1