Hướng Dẫn Thiết Kế Web Dark Mode: Triển Khai và Thực Hành Tốt Nhất
Dark mode đã chuyển từ tính năng thích hợp thành kỳ vọng chính thống. Người dùng ngày càng mong đợi các trang web và ứng dụng tôn trọng tùy chọn giao diện của họ, cho dù họ thích light mode, dark mode hay tự động chuyển đổi dựa trên thời gian trong ngày. Hướng dẫn này bao gồm mọi thứ bạn cần để triển khai dark mode chuyên nghiệp, dễ tiếp cận, hoạt động trên tất cả các thiết bị.
Dark Mode Là Gì?
Dark mode (còn gọi là chủ đề tối hoặc chế độ ban đêm) là giao diện màu sắc sử dụng nền tối với văn bản sáng. Nó đảo ngược bảng màu sáng truyền thống để giảm phát xạ ánh sáng từ màn hình. Ngoài sở thích thẩm mỹ đơn thuần, dark mode còn có những lợi ích thực tế cho người dùng và nhà phát triển.
Dark mode giảm mỏi mắt trong môi trường ánh sáng yếu, tiết kiệm pin trên màn hình OLED (pixel đen thực sự tắt), và có thể giúp người dùng có một số khiếm khuyết thị giác nhất định. Nhiều người dùng chỉ đơn giản thấy nó trông đẹp hơn và bớt gây phân tâm hơn.
Lợi Ích Của Dark Mode
Đối với nhà phát triển, dark mode thể hiện sự chú ý đến trải nghiệm người dùng và khả năng tiếp cận. Nó cũng có thể làm nổi bật các yếu tố thiết kế bằng cách tạo ra độ tương phản cao hơn cho nội dung quan trọng và giảm sự lộn xộn thị giác.
Tại Sao Dark Mode Quan Trọng
Cách đơn giản nhất để triển khai dark mode là sử dụng media query prefers-color-scheme của CSS. Media query này phát hiện cài đặt chủ đề ở cấp hệ điều hành và tự động áp dụng style phù hợp.
| Thành Phần | Light Mode | Dark Mode |
|---|---|---|
| Nền trang | #FFFFFF | #121212 |
| Không dùng đen thuần | Nền thẻ | #FFFFFF |
| #1E1E1E | Nổi nhẹ trên nền | Văn bản chính |
| #1a1a1a | #E0E0E0 | Độ tương phản cao |
Lợi Ích Cho Người Dùng
Sử dụng biến CSS tùy chỉnh (custom properties) là cách hiệu quả nhất để quản lý chủ đề. Định nghĩa tất cả màu sắc dưới dạng biến trong :root, sau đó ghi đè chúng trong media query dark mode. Cách tiếp cận này tập trung hóa việc quản lý màu sắc và làm cho việc bảo trì trở nên đơn giản.
- Sử dụng biến CSS cho tất cả màu sắc để tập trung hóa việc quản lý chủ đề.
- Thiết kế dark mode trước: Bắt đầu với nền tối và thêm các yếu tố sáng hơn, đảm bảo phân cấp thị giác phù hợp.
- Kiểm tra độ tương phản trong cả hai chủ đề bằng công cụ kiểm tra WCAG.
Lợi Ích Cho Nhà Phát Triển
Đối với các trang web hiện có không thể thiết kế lại hoàn toàn, CSS filter: invert() cung cấp một giải pháp dark mode nhanh chóng. Tuy nhiên, nó đảo tất cả màu sắc bao gồm hình ảnh, vì vậy hãy sử dụng nó một cách có chọn lọc và đảo ngược lại hình ảnh để giữ màu gốc của chúng.
Triển Khai Dark Mode CSS
Đối với các trang web cần người dùng chọn thủ công giữa light và dark mode, JavaScript cung cấp các toggle tương tác. Cách tiếp cận này cũng cho phép lưu trữ tùy chọn của người dùng.
prefers-color-scheme
:root {
--bg: #f8fafc;
--bg-card: #ffffff;
--text: #1e293b;
--text-muted: #64748b;
--primary: #3b82f6;
--border: #e2e8f0;
}
@media (prefers-color-scheme: dark) {
:root {
--bg: #0f172a;
--bg-card: #1e293b;
--text: #e2e8f0;
--text-muted: #94a3b8;
--primary: #60a5fa;
--border: #334155;
}
}
body {
background: var(--bg);
color: var(--text);
}Biến CSS Tùy Chỉnh
Lưu trữ tùy chọn chủ đề của người dùng trong localStorage để nó tồn tại qua các phiên. Điều này tôn trọng lựa chọn của người dùng và ngăn chặn việc đặt lại về mặc định khi họ điều hướng hoặc quay lại.
function toggleTheme() {
const current = document.documentElement.dataset.theme;
const next = current === 'dark' ? 'light' : 'dark';
document.documentElement.dataset.theme = next;
localStorage.setItem('theme', next);
}
// On page load
const saved = localStorage.getItem('theme');
if (saved) {
document.documentElement.dataset.theme = saved;
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
document.documentElement.dataset.theme = 'dark';
} kiểm tra localStorage trước khi trang hiển thị.[data-theme="dark"] {
--bg: #0f172a;
--bg-card: #1e293b;
--text: #e2e8f0;
}Tôn Trọng Tùy Chọn Hệ Thống
Chọn màu dark mode đòi hỏi suy nghĩ cẩn thận. Không chỉ đơn giản là đảo ngược màu sắc — màu dark mode hiệu quả duy trì phân cấp thị giác, khả năng đọc và nhận diện thương hiệu trong khi giảm mỏi mắt.
- Cung cấp toggle thủ công bên cạnh phát hiện tự động.
- Lưu trữ tùy chọn người dùng trong localStorage.
- Ngăn chặn flash nội dung không đúng chủ đề bằng inline script.
- Xử lý ảnh và media: Giảm độ sáng hoặc cung cấp phiên bản dark mode.
Chuyển Đổi Chủ Đề Bằng JavaScript
Sử dụng màu xám đậm (#121212 hoặc #1a1a1a) thay vì đen thuần khiết (#000000) cho nền. Màu đen thuần khiết tạo ra độ tương phản quá mức với văn bản trắng, gây mỏi mắt. Màu tối với một chút sắc thái tạo ra trải nghiệm đọc thoải mái hơn.
[data-theme="dark"] img {
filter: brightness(0.9);
}
[data-theme="dark"] .logo-dark {
display: inline-block;
}
[data-theme="dark"] .logo-light {
display: none;
}Các Mẫu Màu Dark Mode
Màu sắc thương hiệu cần điều chỉnh cho dark mode. Màu sắc bão hòa trông rực rỡ trên nền sáng có thể trông quá gay gắt trên nền tối. Sử dụng phiên bản khử bão hòa hoặc sáng hơn của màu thương hiệu cho dark mode.
- Kiểm tra trên thiết bị thực tế trong cả môi trường sáng và tối.
- Test with screen readers: Ensure that theme toggles are accessible and announce their state.
- Respect prefers-reduced-motion: Disable or reduce animations for users who prefer reduced motion.
- Provide sufficient focus indicators: Focus rings must be visible in both themes. Use a contrasting outline color.
Các Lỗi Dark Mode Thường Gặp
- Using pure black backgrounds: Creates excessive contrast and halation. Use dark grays instead.
- Forgetting to adjust shadows: Dark shadows on dark backgrounds are invisible. Use lighter surface colors for elevation.
- Ignoring images: Bright images on dark backgrounds create visual dissonance. Apply brightness filters or provide dark variants.
- Hard-coding colors: Makes theme switching impossible. Always use CSS custom properties.
- Not persisting user preference: If the theme resets on navigation, users will be frustrated. Store preferences in localStorage.
- Flash of unstyled content (FOUC): Use an inline script before CSS to set the theme before the page renders.
Đổ bóng hoạt động khác nhau trong dark mode. Thay vì đổ bóng tối, sử dụng đổ bóng sáng hoặc viền để tạo độ sâu. Box-shadow với màu sáng thay vì tối tạo ra hiệu ứng nổi tinh tế.
Kiểm Tra Độ Tương PhảnDark Mode và Khả Năng Tiếp Cận
Chiến Lược Đảo Màu
Hình ảnh có nền trắng có thể trông chói mắt trong dark mode. Giảm độ sáng của hình ảnh bằng CSS filter: brightness(0.8) hoặc sử dụng hình ảnh dark mode riêng biệt. Logo thường cần phiên bản dark mode.
Toggle Thủ Công
Đảm bảo văn bản duy trì độ tương phản WCAG AA ít nhất 4.5:1 trong dark mode. Văn bản màu xám nhạt trên nền tối thường không đạt yêu cầu. Kiểm tra tất cả các kết hợp màu bằng công cụ kiểm tra độ tương phản.
Lưu Trữ Tùy Chọn
Màu đen thuần khiết (#000) tạo ra độ tương phản khắc nghiệt làm tăng mỏi mắt. Sử dụng màu xám rất đậm với một chút sắc thái thay thế. Material Design khuyến nghị #121212 làm màu nền dark mode.
Tránh Flash Nội Dung
Không đảo hình ảnh khi sử dụng bộ lọc CSS cho dark mode. Hình ảnh có màu sắc sẽ trông không tự nhiên khi bị đảo. Áp dụng filter: invert() cho văn bản và nền nhưng đảo ngược lại cho hình ảnh.
Màu Nền và Màu Chữ
Focus indicator phải vẫn nhìn thấy được trong dark mode. Vòng focus mặc định của trình duyệt có thể không đủ tương phản trên nền tối. Thiết kế focus indicator tùy chỉnh hoạt động trong cả hai chủ đề.