2021-12-20 22:10:28
实现一个支持暗黑模式的主题系统,需结合CSS自定义属性、媒体查询和JavaScript交互,核心步骤如下:
1. 使用CSS自定义属性定义主题变量通过CSS变量集中管理亮色/暗色主题的颜色、边框等样式,便于统一切换:
/* 默认亮色主题 */:root { --bg-color: #ffffff; --text-color: #333333; --border-color: #dddddd;}/* 暗色主题变量 */[data-theme="dark"] { --bg-color: #1a1a1a; --text-color: #f0f0f0; --border-color: #444444;}应用变量到元素:
body { background-color: var(--bg-color); color: var(--text-color); transition: background-color 0.3s ease, color 0.3s ease; /* 平滑过渡效果 */}.card { border: 1px solid var(--border-color);}利用prefers-color-scheme媒体查询,使网页默认跟随操作系统主题设置:
/* 系统暗色模式生效时覆盖默认变量 */@media (prefers-color-scheme: dark) { :root { --bg-color: #1a1a1a; --text-color: #f0f0f0; }}JavaScript动态检测(可选):
// 页面加载时根据系统偏好设置初始主题if (window.matchMedia('(prefers-color-scheme: dark)').matches) { document.documentElement.setAttribute('data-theme', 'dark');} else { document.documentElement.setAttribute('data-theme', 'light');}3. 提供手动切换按钮添加一个开关按钮,允许用户主动切换主题:
通过localStorage记住用户上次选择的主题,避免每次刷新重置:
// 页面加载时读取保存的主题const savedTheme = localStorage.getItem('theme');if (savedTheme) { document.documentElement.setAttribute('data-theme', savedTheme);} else { // 无保存记录时使用系统偏好 const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; document.documentElement.setAttribute('data-theme', prefersDark ? 'dark' : 'light');}5. 完整实现流程此方案兼顾自动化与个性化,适用于大多数现代网页应用。