L&Z's blog L&Z's blog
主页
  • HTML
  • CSS
  • JS
  • TS
  • Vue
  • Node
  • Markdown
  • Yaml
  • HTML
  • CSS
  • JS
  • TS
  • Vue
  • Node
  • 小程序
  • 博客
  • 工作
  • VSCode
  • Browser
  • Npm
  • Git
  • GitHub
  • 友链
  • 收藏
  • 足迹
  • 记录
  • 抽奖
  • 错 or 对
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)

L&Z

主页
  • HTML
  • CSS
  • JS
  • TS
  • Vue
  • Node
  • Markdown
  • Yaml
  • HTML
  • CSS
  • JS
  • TS
  • Vue
  • Node
  • 小程序
  • 博客
  • 工作
  • VSCode
  • Browser
  • Npm
  • Git
  • GitHub
  • 友链
  • 收藏
  • 足迹
  • 记录
  • 抽奖
  • 错 or 对
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)
  • CSS

    • 常用css
    • 图片未加载前自动撑开元素高度
    • 水平垂直居中的几种方式
    • 如何根据系统主题自动响应CSS深色模式
      • CSS 深色模式 (Dark Mode)
      • 添加深色模式自动响应
      • JS判断深色模式
    • 使用hover和attr()定制悬浮提示
    • CSS给table的tbody添加滚动条
    • CSS3之animation动画
  • JS

  • Vue

  • Node

  • 小程序

  • 博客搭建

  • 工作

  • 笔记
  • CSS
lz
2022-03-31
目录
CSS 深色模式 (Dark Mode)
添加深色模式自动响应
JS判断深色模式

如何根据系统主题自动响应CSS深色模式

# CSS 深色模式 (Dark Mode)

在:root根元素中定义变量来设置主题的颜色。我建议你也这样做,因为这样会使这个过程容易得多。我定义的变量如下:

:root {
  --bg: #fff;
  --textColor: #004050;
  --borderColor: rgba(0,0,0,.15);
}
1
2
3
4
5

:root 这个 CSS 伪类匹配文档树的根元素。对于 HTML 来说,:root 表示 <html>元素,除了优先级更高之外,与 html 选择器相同。

如果希望在样式表中使用这些变量,可以这样做

body {
  color: var(--bg);
}
1
2
3

这样,如果你想改变你的主题颜色,所需要做的就是修改你定义的变量,所有使用这个变量的样式都会被更新。

现在我们需要定义一组新的变量,这些变量将在调用CSS深色模式时使用。对我来说,深色模式的变量是这样的:

/* 定义深色模式的颜色 */
:root {
  --bg: rgb(30,30,34);
  --textColor: rgb(150,150,154);
  --borderColor: #2C2C3A;
}
1
2
3
4
5
6

# 添加深色模式自动响应

现在我们定义了两组变量。剩下要做的一件事就是将prefers-color-scheme媒体查询添加到我们的深色模式变量中。

使用您的深色模式变量并在外层添加@media查询

/* 根据系统的深色模式响应深色变量 */
@media (prefers-color-scheme: dark) {
  :root {
    --bg: rgb(30,30,34);
    --textColor: rgb(150,150,154);
    --borderColor: #2C2C3A;
  }
}
1
2
3
4
5
6
7
8

如果你的电脑系统不支持深色模式,可以使用手机测试,先把手机的系统主题调到深色模式,再打开你的网站。

prefers-color-scheme文档 (opens new window)

# JS判断深色模式

如果你的需求需要js来判断系统是否处于深色模式,可以这样做:

if(window.matchMedia('(prefers-color-scheme: dark)').matches){
  //深色主题
}
1
2
3

matchMedia (opens new window)方法返回一个MediaQueryList (opens new window)对象,该对象具有属性matches、media,具有方法addListener、removeListener。

addListener接收一个MediaQueryList对象作为参数。 为深色模式添加监听器,以响应系统切换到或切换出深色模式:

let listeners={
  dark:(mediaQueryList )=>{
    if(mediaQueryList.matches){
      alert('您切换到深色模式了!')
    }
  },
  light:(mediaQueryList)=>{
    if(mediaQueryList.matches){
      alert('您切换到浅色模式了!')
    }
  }
}

window.matchMedia('(prefers-color-scheme: dark)').addListener(listeners.dark)
window.matchMedia('(prefers-color-scheme: light)').addListener(listeners.light)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
编辑 (opens new window)
#CSS
上次更新: 2023/03/08, 02:53:55
水平垂直居中的几种方式
使用hover和attr()定制悬浮提示

← 水平垂直居中的几种方式 使用hover和attr()定制悬浮提示→

最近更新
01
nodejs递归读取所有文件
12-15
02
vue3响应式原理
09-20
03
原生js实现jquery中siblings效果
09-20
更多文章>
Theme by Vdoing | Copyright © 2021-2025 L&Z |
  • 跟随系统
  • 浅色模式
  • 深色模式