Dark Mode Và Typography Hiện Đại: Thiết Kế UI/UX Trend 2026

7 tháng trước · 12 phút đọc
Tại sao Dark Mode và Typography lại là cặp đôi hoàn hảo năm 2026?
Ribbit 🐸 - Mình vừa làm lại trang blog cá nhân, thêm dark mode và custom fonts. Tỷ lệ người dùng bật dark mode tăng từ 0% lên 63% chỉ sau 1 tuần. Không phải magic - đây là trend đang làm mưa làm gió ở Việt Nam.
2026 không còn là thời "chữ đen nền trắng" nữa. Người dùng Việt Nam ngày càng quen với việc chủ động chọn giao diện phù hợp với môi trường của mình - sáng khi làm việc ban ngày, tối khi đọc trước khi ngủ. Kết hợp với typography hiện đại (kiểu chữ được chọn lọc kỹ), bạn tạo ra trải nghiệm đọc chuyên nghiệp mà vẫn tôn trọng sở thích cá nhân.
Bài này mình sẽ chia sẻ cách xây dựng theme switcher bằng CSS variables, tích hợp Google Fonts với Tailwind CSS, và responsive design thực tế. Bạn sẽ có một hệ thống UI/UX linh hoạt, dễ maintain, và quan trọng nhất - người dùng Việt thích.
Minh họa sự chuyển đổi giữa light mode và dark mode với typography tối ưu
Điều đặc biệt của năm 2026 là người dùng không chỉ muốn dark mode - họ muốn chuyển đổi mượt mà, không giật lag, và giao diện phải đẹp ở cả hai chế độ. Typography đóng vai trò then chốt: font chữ sai có thể khiến dark mode trở nên khó đọc, gây mỏi mắt. Ngược lại, font đúng kết hợp contrast hợp lý sẽ tăng thời gian đọc lên 40-50%.
CSS Variables: Nền tảng cho theme switcher linh hoạt
Muốn chuyển đổi dark/light mode mượt mà, bạn cần CSS variables (custom properties). Đây là cách tiếp cận hiện đại nhất, thay vì viết riêng 2 bộ CSS hoặc dùng class overrides rối rắm.
Khởi tạo color palette với CSS variables
Đầu tiên, định nghĩa bảng màu cho cả hai chế độ:
Cấu trúc CSS variables cho light mode và dark mode, dễ dàng maintain và mở rộng
Lưu ý màu sắc cho dark mode: đừng dùng #000000 thuần đen. Người Việt đọc nhiều text, màu quá tối gây mỏi mắt. Mình dùng #0f0f23 (xanh đen nhẹ) cho background và #e0e0e0 (xám sáng) cho text - contrast vừa đủ, đọc thoải mái.
Toggle theme bằng JavaScript
Việc chuyển đổi theme chỉ cần thay đổi attribute data-theme:
Điểm mấu chốt: luôn lưu lựa chọn của người dùng vào localStorage. Không gì khó chịu hơn việc mỗi lần refresh lại phải chọn dark mode lại từ đầu.
Tích hợp với Tailwind CSS
Nếu dùng Tailwind, bạn config để hỗ trợ class-based theming:
Sau đó dùng như sau:
Cách này giúp bạn vừa có sức mạnh của Tailwind utility classes, vừa linh hoạt của CSS variables.
Typography hiện đại: Chọn và tối ưu Google Fonts
Xong phần dark mode rồi, giờ sang thứ quyết định 60% trải nghiệm đọc: typography.
Chọn font phù hợp với người dùng Việt
Không phải font nào cũng hiển thị tốt tiếng Việt. Mình đã test 30+ fonts trên Google Fonts, đây là 3 bộ chạy ngon nhất:
1. Inter (sans-serif): Hiện đại, dễ đọc, hỗ trợ Vietnamese tốt. Dùng cho body text.
2. Merriweather (serif): Sang trọng, phù hợp heading hoặc blog nội dung dài.
3. JetBrains Mono (monospace): Dành cho code blocks, rõ ràng, phân biệt ký tự tốt.
So sánh 3 font family phổ biến với tiếng Việt: Inter, Merriweather, JetBrains Mono
Lưu ý tham số display=swap: giúp text hiển thị ngay bằng system font, sau đó swap sang custom font khi load xong - tránh flash of invisible text (FOIT).
Thiết lập type scale với CSS variables
Thay vì hard-code font-size, dùng type scale linh hoạt:
Type scale theo tỷ lệ Major Third (1.25) tạo sự hài hòa giữa các cấp độ chữ. Người đọc Việt Nam thích body text khoảng 16-18px - nhỏ hơn mỏi mắt, to hơn như dạy trẻ con.
Tối ưu typography cho dark mode
Chữ trên nền tối cần adjust nhẹ:
Lý do: trên nền tối, chữ sáng có hiện tượng "bleeding" (tràn sáng), font weight quá đậm sẽ khó đọc. Giảm nhẹ weight và tăng letter-spacing giúp text thoáng hơn.
Responsive design thực tế: Từ mobile đến desktop
Phần này hơi sâu, bám chặt lá sen nhé - mình sẽ chỉ cách làm typography và dark mode responsive đúng chuẩn 2026.
Mobile-first approach
Người Việt 78% truy cập web từ mobile (theo We Are Social 2025). Thiết kế từ màn hình nhỏ trước, sau đó scale lên:
Responsive breakpoints với font size và spacing thay đổi theo màn hình
Tailwind responsive utilities
Kết hợp với Tailwind, bạn viết markup ngắn gọn hơn nhiều:
Lưu ý thứ tự breakpoints: sm: (640px) -> md: (768px) -> lg: (1024px) -> xl: (1280px). Tailwind mobile-first, nên class không prefix áp dụng cho mobile, class có prefix ghi đè lên khi màn hình đủ lớn.
Dark mode switcher button responsive
Button toggle theme cũng cần responsive:
Button fixed ở góc dưới phải, kích thước tăng nhẹ trên desktop. Class dark:hidden và dark:block tự động đổi icon khi theme thay đổi.
Performance: Tối ưu font loading
Với người dùng Việt Nam, connection không phải lúc nào cũng nhanh. font-display: swap đảm bảo text hiển thị ngay, không để trống trong khi chờ custom font.
Ví dụ thực tế: Blog cá nhân hoàn chỉnh
Mình ghép tất cả lại thành một ví dụ hoàn chỉnh - blog cá nhân responsive với dark mode và typography pro.
HTML structure
Demo blog hoàn chỉnh với dark mode toggle, responsive layout, và typography tối ưu
Điểm nổi bật của ví dụ này:
- CSS variables cho tất cả màu sắc - dễ maintain, thêm theme mới chỉ cần 10 dòng CSS
- Sticky header với theme toggle luôn accessible
- Responsive spacing: padding/margin tăng dần từ mobile -> desktop
- Typography scale hợp lý: mobile 16px base, desktop 18-20px
- Lưu preference vào localStorage - người dùng không phải chọn lại mỗi lần vào
- Fallback sang system preference nếu chưa có lựa chọn
Test trên các thiết bị thực tế
Mình test trên iPhone SE (375px), iPad Mini (768px), và MacBook Pro 14" (1512px). Kết quả:
- Mobile: Text 16px, padding 1rem, h1 ~31px - đọc thoải mái không cần zoom
- Tablet: Text 17px, padding 2rem, h1 ~39px - tận dụng không gian rộng hơn
- Desktop: Text 18px, max-width 1200px centered, h1 56px - professional, không quá to
Điểm mấu chốt: test với nội dung tiếng Việt thật. Tiếng Việt có dấu, chiếm không gian dọc nhiều hơn Latin, nên line-height cần rộng hơn 0.1-0.2.
Tips cho developer Việt Nam: Những điều nên và không nên
Nên làm:
1. Luôn test với tiếng Việt có dấu
Font "đẹp" trên chữ Latin có thể xấu hoặc lỗi với tiếng Việt. Test với câu: "Công nghệ AI đang thay đổi cách chúng ta thiết kế giao diện người dùng hiện đại." - đủ các dấu phổ biến.
2. Respect system preference
Nhiều người Việt dùng dark mode system-wide (iOS, Android). Fallback sang prefers-color-scheme giúp trang web tự động match với preference đó.
3. Contrast ratio đúng chuẩn WCAG
Dùng tool như WebAIM Contrast Checker để đảm bảo:
- Body text: tối thiểu 4.5:1
- Large text (18px+): tối thiểu 3:1
Màu #e0e0e0 trên #0f0f23 cho ratio ~12:1 - an toàn cho mọi người đọc.
4. Animation tinh tế
Chuyển đổi theme mượt với transition, nhưng respect prefers-reduced-motion:
Checklist tối ưu dark mode và typography cho người dùng Việt Nam
Không nên làm:
1. Đừng dùng pure black (#000000)
Nền đen thuần gây mỏi mắt nhanh, đặc biệt với OLED screens. Dùng #0f0f23 (xanh đen nhẹ) hoặc #1a1a1a (xám đen).
2. Đừng quên states (hover, focus, active)
Accessibility quan trọng - người dùng keyboard cần thấy rõ focus state.
3. Đừng hard-code màu sắc
Thay vì color: #1a1a1a, dùng color: var(--text-primary). Khi thêm theme mới (high contrast, sepia...), bạn chỉ sửa variables, không động vào component styles.
4. Đừng làm quá phức tạp
Có developer làm dark mode với 5-6 levels (dark, darker, darkest...). Người Việt thích đơn giản: 2 options (light/dark) là đủ. Muốn thêm thì auto (system preference) - tối đa 3 options.
Performance tips
Cách này đảm bảo theme được set TRƯỚC khi browser render, tránh flash of incorrect theme (FOIT).
