Skip to content

前端暗黑主题修改

实现方法有5种:1、浏览器自动匹配 2、手动切换 3、根据时间自动切换 4、样式的filter方法 5、添加data-theme属性

浏览器自动匹配

浏览器自动匹配是通过CSS的@media查询来实现的。当用户设备的系统设置为暗黑模式时,浏览器会自动应用相应的CSS样式。例如:

css
@media (prefers-color-scheme: dark) {
  //暗黑模式
  body {
    background-color: #fff;
    color: red;
  }
}
@media (prefers-color-scheme: light) {
  body {
    background-color: #000;
    color: #ccc;
  }
}

这种方式需要在:root中添加

css
color-scheme: light dark;

手动切换

实现方案为在:root中定义样式变量并初始值,并声明dark样式类,改变样式变量,body中引用这些变量。

css
:root {
  --bg-color: #ffffff;
  --text-color: #333333;
  --border-color: #e5e7eb;
}
.dark {
  --bg-color: #1a1a1a;
  --text-color: #f5f5f5;
  --border-color: #374151;
}
body {
  background-color: var(--bg-color);
  color: var(--text-color);
  transition:
    background-color 0.3s,
    color 0.3s; /* 平滑过渡 */
}

在JavaScript事件中动态改变html元素的样式。

javascript
function setTheme(theme?: 'light' | 'dark' | 'auto') {
  if (theme) localStorage.setItem('theme', theme)
  const targetTheme = theme || localStorage.getItem('theme') || 'auto'
  const isDark =
    targetTheme === 'dark' ||
    (targetTheme === 'auto' && colorSchemeQuery.matches)
  if (theme == 'dark') {
    document.documentElement.classList.add('dark')
  } else {
    else document.documentElement.classList.remove('dark')
  }

}

根据时间自动切换

根据时间自动切换是通过JavaScript来实现的。当用户设备的系统设置为暗黑模式时,JavaScript会根据当前时间来修改CSS的color-scheme属性。例如:

javascript
const now = new Date()
const hour = now.getHours()

if (hour < 6 || hour > 18) {
  document.documentElement.style.colorScheme = 'light'
} else {
  document.documentElement.style.colorScheme = 'dark'
}

当然在:root中添加color-scheme。

浏览器检测是否是dark模式

javascript
const colorSchemeQuery = window.matchMedia('(prefers-color-scheme: dark)')
console.log('colorSchemeQuery:', colorSchemeQuery.matches)

colorSchemeQuery为true时,表示系统是深色模式。如果要检测显示模式的切换,可以为colorSchemeQuery注册change事件。

javascript
colorSchemeQuery.addEventListener('change', () => {
  //其他逻辑
})``

样式的filter方法

javascript
document.documentElement.style.filter = 'invert(100%)'

去掉filter即去掉暗黑模式。

添加data-theme属性

在html元素中添加data-theme属性可以方便地切换主题。例如:

css
:root {
  --bg-color: #ffffff;
  --text-color: #333333;
  --border-color: #e5e7eb;
}
[data-theme='dark'] {
  --bg-color: #1a1a1a;
  --text-color: #f5f5f5;
  color-scheme: dark;
}
body {
  background-color: var(--bg-color);
  color: var(--text-color);
  transition:
    background-color 0.3s,
    color 0.3s; /* 平滑过渡 */
}
javascript
document.documentElement.setAttribute('data-theme', 'dark')

陕ICP备15010740号