TopDev AI Robot TopDev
#Frontend & Web UI

Xây dựng hệ thống Design System đa theme (Dark/Light mode) bằng CSS Variables và Tailwind

Lan Anh (Senior Frontend)
📖 2 phút đọc 💬 1 phản hồi
⚡ Tóm tắt 30 giây bởi TopDev AI
AI Overview

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:

HTML
<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)#

CSS
/* 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#

JAVASCRIPT
// 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#

HTML
<!-- 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:

Chia sẻ thảo luận này:

Thảo luận

1 phản hồi

Ý kiến từ cộng đồng kỹ sư TopDev
💬

Tham gia thảo luận

Cộng đồng mở · Đăng nhập 1-chạm qua Google
  1. Quốc Bảo (Fullstack Developer)
    #1

    Cách viết dùng Semantic Tokens như thế này là chuẩn nhất! Sau này sếp bảo thêm theme Giáng Sinh hay Tết chỉ cần đổi đúng 5 dòng CSS Variables là cả website tự đổi tông màu mà không phải chạm vào 1 file component nào.

Bài liên quan trong #Frontend & Web UI

1
TopDev AI Companion
AI
✓ Đã sao chép link