prefers-color-scheme设置检测系统主题色
作者:码上花甲 发布时间:2024-07-06 02:57:11
标签:prefers-color-scheme,主题色,设置检测
引言
我们在访问某个站点时,有时可能会发现这样一种场景:该站点在白天访问时,它是亮色主题;当晚上访问时,它就变成暗色主题了。而且这种主题的切换是自动的,他会随系统主题变化而改变。如果我们要将这种功能应用在自己站点上,该如何实现呢?
本文涉及三个相关知识点:
设置主题色
检查主题色
监听主题色变化
设置主题色
在 CSS 中,提供了一种设置系统主题色的媒体特性 prefers-color-scheme
,该特性通常提供两个值 light
和 dark
。顾名思义,这两个值一个代表 日间模式
,一个表示 夜间模式
。并且他们的兼容性也是最好的。
这里有一个简单的例子,可以很方便的通过 CSS 实现系统主题色:
.day { background: #eee; color: black; }
.night { background: #333; color: white; }
@media (prefers-color-scheme: dark) {
.day.dark-scheme { background: #333; color: white; }
.night.dark-scheme { background: black; color: #ddd; }
}
@media (prefers-color-scheme: light) {
.day.light-scheme { background: white; color: #555; }
.night.light-scheme { background: #eee; color: black; }
}
当系统主题为日间模式时,会应用上面的 light 主题样式;当系统主题为夜间模式时,会应用上面的 dark 主题样式。
实际开发中,我们会将项目用到的色值抽离出来作为全局的公共变量,方便我们对项目整体的色值管理。如:
:root {
// Light Theme
--PrimaryBackgroundColorLight: #f9f9f9;
--PageBackgroundColorLight: #efefef;
--PrimaryColorLight: #34495e;
--PrimaryActivedColorLight: #1890FF;
// Dark Theme
--PrimaryBackgroundColorDark: #293042;
--PageBackgroundColorDark: #202634;
--PrimaryColorDark: #c6cfd8;
--PrimaryActivedColorDark: #1890FF;
}
我们定义好全局 CSS 变量后,在需要的地方直接引用即可:
.day.light {
background-color: var(--PrimaryBackgroundColorLight);
}
检测主题色
既然能通过 CSS 设置系统主题色,那 JS 肯定也有能力来检测系统主题色。JS 提供了一个用于检查媒体查询的函数 matchMedia
,利用该函数能方便地检查当前系统主题色:
const themeMedia = window.matchMedia("(prefers-color-scheme: light)");
if (themeMedia.matches) {
// 日间模式
} else {
// 夜间模式
}
监听主题色变化
除了获取当前系统主题色,我们还能监听主题色的变化。
const themeMedia = window.matchMedia("(prefers-color-scheme: light)");
themeMedia.addListener(e => {
if (e.matches) {
console.log("light");
} else {
console.log("dark");
}
});
通过上面提到的三个知识点,在自己站点实现主题色功能是绰绰有余的。像一些更丰富的多主题切换,虽然实现的方法不同,但思路基本都是类似的。总结起来就是开篇的三句话:如何设置主题、获取当前被应用的主题以及监听主题的变更。
来源:https://juejin.cn/post/7226641471947653179


猜你喜欢
- 本文实例为大家分享了python实现分页效果展示的具体代码,供大家参考,具体内容如下难点:清空Layout#!/usr/bin/python
- 首先想说的是它的安全性,这方面确实能让我感受到它的良苦用心。这主要可以分为两点:一、防范跨站伪造请求(Cross-site request
- 本文实例为大家分享了python比特币初始配置的具体代码,供大家参考,具体内容如下# -*- coding: utf-8 -*- "
- CSS+DIV是网站标准(或称“WEB标准”)中常用的术语之一,通常为了说明与HTML网页设计语言中的表格(table)定位方式的区别,因为
- 本文实例讲述了PHP函数extension_loaded()用法。分享给大家供大家参考。具体分析如下:extension_loaded —
- 一、configparser模块是什么可以用来操作后缀为 .ini 的配置文件;python标准库(就是python自带的意思,无需安装)二
- 为了访问数据库,就要提供数据库连接类,在C#中,是通过Connection类来实现的四种类型的连接方式SQLConnectionADOCon
- step 1:perpar database & datause mastergoCreate database Inventory
- URL提交是百度提供的一个站长工具,用于给站长提供手工收录某些URL的接口,但是该接口有验证码识别部分,比较难弄。所以编写了如下程序进行验证
- 在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句
- SELECT ABS(DATEDIFF(dd,EndDate,BeginDate)) FROM dbo.WorkingPlan 其中,Wor
- 一、简介Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因如此,Python已
- 前言相信我,只要记住本文的 7️⃣ 步口诀,就能彻底掌握 JS 中的 this 指向。先念口诀:箭头函数、new、bind、apply 和
- 2。date_default_timezone_set("PRC"); 3。PHP&
- 链表链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址。由于每个结
- 在计算机编程中,数据类型是非常重要的一个概念。数据类型决定了计算机内部如何表示数据,以及在执行不同的操作时需要进行哪些转换。Go 语言作为一
- 首先来解释一下SpringBoot首页设置的三种方式1.SpringBoot默认首页设置编写一个最简单的html文件 index.html&
- 在移动端开发应用UI组件也会遇到一系列需要注意的问题。问题1比如说,标签页是一个整体的组件,但是我们需要将标签页的标题和其他组件一起固定到顶
- 你不可能随时备份数据,但你的数据丢失时,或者数据库目录中的文件损坏时, 你只能恢复已经备份的文件,而在这之后的插入或更新的数据,就无能为力了
- 1. 建表的语法建表属于 DDL 语句,DDL 语句包括:create、drop、alter…create table