为你的网站增加点灵性:随系统变色

🌻 前言

网站切换主题色已经是非常常见的功能了,提供浅色和暗色两种色调可以满足用户的使用习惯,帮助这些用户获得更好的访问体验。但是只能用户手动切换主题。

那如果用户已经将系统切换到了深色模式,当他们打开我们网站的时候,网站自动切换到深色模式,第一感觉就不会那么扎眼,是不是会有更好的第一印象,提高留存。

好了,铺垫到位了哈哈,引出本文将要讲的内容:实现网站跟随系统主题变色。

🎨 实现

实现的基础知识

css中有一个属性color-scheme,可以设置元素支持的系统配色方案,有以下四个值:

  • normal:使用浏览器的默认配色方案进行渲染;
  • light:使某元素支持使用操作系统浅色方案来渲染元素;
  • dark:使某元素支持使用操作系统深色配色方案进行渲染;
  • only:禁止用户代理覆盖元素的配色方案,必须搭配light或dark使用,例如 only dark 关键词表示禁用浅色模式,只应用深色模式;

简单来说,这个属性就是设置元素支持的系统配色方案,例如仅支持系统深色模式,注意是设置支持的值,而不是直接设置配色方案,他是会影响表单控件和滚动条等的颜色的,你可以简单在下面码上掘金上体验下效果:

jcode

与此相关的,有个媒体查询@media (prefers-color-scheme: light|dark)。它用于检测操作系统是浅色还是深色主题,从而设置针对不同的配色方案设置不同的样式。

很容易理解,例如下面代码:

:root{
  --bg-color: #f2f2f2;
}
div{
  background: var(--bg-color);
}
@media (prefers-color-scheme: light) {
    :root{
      --bg-color: #f2f2f2;
    }
}

@media (prefers-color-scheme: dark) {
    :root{
      --bg-color: #000;
    }
}

一个div的背景色由css变量--bg-color设定,那么我们就可以通过在@media prefers-color-scheme媒体查询中修改这个变量的值来修改页面样式。

由此,想必你应该想到了,那利用这个媒体查询不就能实现根据系统主题切换网页配色了吗?确实可以,但,未免有些粗糙!

问题

1.这样做切换网页配色,那网页只能跟随系统主题来变化了,但是用户对于系统主题色,一般都是设置一种之后基本就不会再变了,所以这样来实现切换网站主题色岂不是相当于多写了一套“闲置无用”的主题方案。

2.常规实现网站手动切换主题色有很多种方案,例如在根元素设置[theme="dark"]属性,通过切换其属性值来切换网站主题,而网站中的各种配色都以CSS变量形式存储在theme的属性选择器下。

这样的话属性选择器中的css变量和@media prefers-color-scheme中的css变量就会重合,就会根据书写顺序进行覆盖,那只能有一种切换网站主题的方案生效了。

而网站随系统变色,本身就属于附加功能,它和用户自由切换主题色相比,如果为了网站随系统变色而使手动切换主题色失效,那岂不是本末倒置了。

所以怎样才能使手动切换网站配色和随系统变色公共生效呢?
答案很简单,在网站配置了手动切换配色的功能后,只需要在网站加载时,通过 JS 查询系统主题,然后在代码中切换到对应的配色不就好了吗😎

关键代码

JS 中有一个 API:window.matchMedia(),它可以检测是否匹配到了某个媒体查询。

问题简单起来了,只需要利用window.matchMedia()检测@media prefers-color-scheme媒体查询,即可根据系统主题切换不同的网站配色了。代码大致如下:

// html
<div id="app" theme="light"></div>

// css
[theme="light"]{
  --bg: #f2f2f2;
}
[theme="dark"]{
  --bg: #000;
}
#app{
  background: var(--bg);
}

// js
const app = document.getElementById('app')
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
    // 切换到深色主题
    app.setAttribute('theme','dark')
} else {
    // 切换到浅色主题
    app.setAttribute('theme','light')
}

效果如下:

jcode

甚至你还可以监听颜色方案的变化,以便在用户改变系统颜色主题时跟随切换网站配色:

window.matchMedia('(prefers-color-scheme: dark)').addListener((e) => {
    if (e.matches) {
        app.setAttribute('theme','dark')
    } else {
       app.setAttribute('theme','light')
    }
});

tutieshi_640x287_4s.gif

又一些问题

在上一章讲color-scheme属性时,想必就有人想到了,是不是可以通过切换color-scheme: lightcolor-scheme: dark,配合@media prefers-color-scheme媒体查询写两套样式(浅色和深色的各写一套),然后也能实现手动切换网站主题?

但事实上并不能,因为color-scheme本质上只是设置支持的系统主题,而不是设置系统主题的,所以并不会影响@media prefers-color-scheme的匹配。说人话就是,即使你设置了color-scheme: only dark,但你的系统是浅色模式,@media (prefers-color-scheme:dark)里的代码也不会生效。

color-scheme有什么用呢?其实吧,这玩意确实没什么用,但是如果你的网站使用了很多系统控件,就可以用color-scheme来控制它们在系统深色模式下的颜色。

系统控件在浅色和深色模式下是有两套默认的配色的。你可以使用light-dark()函数分别设置它们在浅色和深色模式下的样式。

light-dark()函数用于检测是否设置了浅色或深色配色方案,使用方式很简单,用逗号分隔浅色和深色模式的值即可,如下:
background: light-dark(blue,red); //blue就是浅色模式下的值,red是深色模式的值

无论是手动切换系统主题,还是设置 color-scheme: only dark ,其实都可以影响到 light-dark()。但往往我们都做法是,全部设置color-scheme: light dark,然后利用light-dark()函数设置系统系统控件的样式。

注意: 我一直在说系统控件,不代表 light-dark() 只能作用于系统原生控件,只是它用来设置普通网页元素的配色方案的场景不多。

关于深色模式

深色模式可不只是切换一些配色这么简单,里面的学问也很多,例如为了确保可访问性和可读性,要注意选择颜色和调整一些板式:

深色模式的颜色不是简单的反转,例如白色背景变为黑色,黑色文本变为白色。显然,全黑背景上的纯白色文本使得阅读长段文本会导致眼睛疲劳。深色模式一般最好使用低对比度的颜色,例如使用稍微灰白色的文本和/或深灰色背景。降低对比度可以提高可读性,Lea Verou 的对比度计算器 这个工具可以计算颜色对比度,优化配色方案。

深色模式设计不应仅限于选择深色。还应该考虑改变排版样式,以保持深色模式可读性。例如深色模式下的浅色文本对比度会相对较高,可以考虑提高文本行高或字距离。

兼容性

兼容性方面,其实主要只需要考虑 prefers-color-scheme 的兼容性就好,还凑合,color-scheme也差不多,light-dark()相对兼容性较差,但是一般使用场景比较少。

在这里插入图片描述

🎁 最后

学如逆水行舟,不进则退~👊👊👊

先看后赞,养成习惯👍
收藏吃灰,不如学会🍗
点个关注,不要迷路🪤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/897067.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虚拟机网络设置为桥接模式

1、打开VMware Workstation Pro&#xff0c;点击“虚拟机—设置”&#xff0c;进入虚拟机设置页面 2、点击“网络适配器”&#xff0c;网络连接选择桥接模式 3、点击“编辑—虚拟网络编辑器”&#xff0c;进入虚拟网络编辑器页面 4、选择桥接模式&#xff0c;并选择要桥接到的…

有趣的css - 跷跷板加载动画

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是使用 css 模拟一个跷跷板效果的加载动画效果。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面…

YOLO目标检测

文章目录 一、含义二、与传统检测对比1.one-stage的优缺点2.two-stage的优缺点 三、MAP指标1.基本概念2.计算方法3.指标意义 一、含义 YOLO&#xff08;You Only Look Once&#xff09;是一种基于深度学习的目标检测算法&#xff0c;由Joseph Redmon等人于2016年提出。它的核心…

基于STM32的多功能MP3播放器

基于STM32的多功能MP3播放器 基于STM32的多功能MP3播放器一、项目背景与意义二、系统设计与实现2.1 硬件设计2.2 软件设计2.3 系统调试 三、功能实现与展望四、结论五、附录 基于STM32的多功能MP3播放器 在数字化时代&#xff0c;多功能播放器已成为我们生活中不可或缺的一部分…

Aurora 4.6.2 | 第三方谷歌商店,无需谷歌框架

Aurora Store是谷歌Play Store的一个非官方FOSS客户端&#xff0c;通常称为‘极光商店’&#xff0c;设计优雅。Aurora Store不仅可以下载、更新和搜索Play Store等应用程序&#xff0c;还为用户提供了新功能。应用提供范围广泛的游戏和应用程序&#xff0c;包括音乐流媒体、购…

一起搭WPF架构之LiveCharts.Wpf的简单了解与安装

一起搭WPF架构之LiveCharts.Wpf的简单了解与安装 前言LiveCharts.Wpf介绍LiveCharts.Wpf的安装总结 前言 根据项目需求&#xff0c;我单独留了一个界面用于进行数据分析。数据分析的内容考虑是采用图表的形式将SQLite数据库中存储的数据进行绘制成图&#xff0c;以便数据分析。…

【ARM】ARM架构参考手册_Part B 内存和系统架构(5)

目录 5.1关于缓存和写缓冲区 5.2 Cache 组织 5.2.1 集联性&#xff08;Set-associativity&#xff09; 5.2.2 缓存大小 5.3 缓存类型 5.3.1 统一缓存或分离缓存 5.3.2 写通过&#xff08;Write-through&#xff09;或写回&#xff08;Write-back&#xff09;缓存 5.3.3…

09_实现reactive之代理 Set 和 Map

目录 创建代理建立响应式联系避免污染原始数据处理 forEachfor...ofvalues 与 keys 方法 Set 和 Map 都有特定的属性和方法来操作自身&#xff0c;因此需要单独处理。 创建代理 我们来看一段案例代码&#xff0c;体验一下和它们的独特之处&#xff0c;如下&#xff1a; const…

柯桥俄语学习,旅游俄语中的支付和交际常用语句

支付用语 --Здравствуйте, счёт, пожалуйста. --Как вы будете платить? --Вы принимаете карты? --Да, пожалуйста, покажите QR - код. --Нам нужно ещё одно б…

云原生技术:nacos进化到servicemash

面试的时候跟面试官吹嘘说&#xff0c;现在主流的微服务架构&#xff0c;都已经用得熟熟的了&#xff0c;自己技术很不错。进了公司却被分到了API资产管理平台&#xff0c;要做一个类似于网关的东西。经过调研才发现&#xff0c;自己用的微服务架构已经过时了&#xff0c;什么&…

基于yolov10的驾驶员抽烟打电话安全带检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv10的驾驶员抽烟、打电话、安全带检测系统是一种先进的驾驶行为监测系统。该系统利用YOLOv10算法的高效性和准确性&#xff0c;实现对驾驶员行为的实时检测与识别。 YOLOv10是一种最新的实时物体检测模型&#xff0c;其通过深度学习技术&#xff0c;如卷…

FastCFS高性能分布式文件系统集群搭建

FastCFS – 可以跑数据库的高性能通用分布式文件系统 简介 FastCFS 是一款强一致性、高性能、高可用、支持百亿级海量文件的通用分布式文件系统&#xff0c;可以作为MySQL、PostgreSQL、Oracle等数据库&#xff0c;k8s、KVM、FTP、SMB和NFS等系统的后端存储。 FastCFS 主要特…

L0G1000 Linux 基础知识

1.创建虚拟机 构建完成后 按需启动&#xff0c;本次启动30分钟&#xff0c;启动完成后出现下图界面。 点击进入开发机&#xff0c;出现初始界面。 2. 配置SSH密钥进行SSH远程连接 2.1打开Windows PowerShell,利用 ssh-keygen -t rsa 输入命令后一路回车就可以了&#xff0c;…

WXML-模板语法-条件渲染及列表渲染

条件渲染&#xff1a; wx&#xff1a;if: 结合block使用wx:if&#xff1a; hidden&#xff1a; wx:if和hidden对比&#xff1a; 列表渲染&#xff1a; wx&#xff1a;for&#xff1a; 1、在.js文件中创建一个数组&#xff1a; 2、创建一个view使用wx&#xff1a;for组件&…

【机器学习】并行计算(parallel computation)Part2

Asynchronous Parallel Gradient Descent Using Parameter Server 用Parameter Server实现异步并行梯度下降 Parameter Server这种编程模型可以实现异步并行梯度下降&#xff0c;架构采用的是Client-Server&#xff0c;通信方式是Message-passing&#xff0c;同步方式是异步的…

windows scp 免密码文件传输

windows scp 免密码文件传输 scp 是基于ssh加密服务的一种文件传输方式&#xff0c;是常见的linux主机间文件传输方式&#xff0c;在windows中也是支持的。 配置目标&#xff1a; 两台windows主机间通过scp命令行传输文件梳理概念 客户端&#xff1a; 通过命令行实现文件传输…

Mycat2安装配置

安装配置 安装 目前Mycat2下载地址已经不可访问&#xff0c;安装包可从参考资料[1]获取 下载后解压zip文件&#xff0c;将jar放在lib目录下 编辑配置文件 编辑conf文件夹下的prototypeDs.datasource.json 更改数据库相关信息 启动 windows环境下启动Mycat 以管理员身份运行…

[论文阅读]Deep Depth Completion of a Single RGB-D Image

摘要 我们的工作目标是完成RGB-D图像的深度通道。商用级深度摄像头通常无法捕捉光滑、明亮、透明和远处表面的深度信息。为了解决这个问题&#xff0c;我们训练了一个深度网络&#xff0c;该网络以RGB图像作为输入&#xff0c;并预测稠密的表面法线和遮挡边界。然后&#xff0…

只需15秒!这也太短了吧,单反自动拍VR就看这篇

在如今这个追求高效的时代&#xff0c;拍摄VR全景不再是复杂的技术挑战&#xff0c;而是轻松可实现的日常操作。720云相机电动云台的问世彻底颠覆了传统VR拍摄的方式&#xff0c;只需15秒&#xff0c;一键拍摄&#xff0c;极简流程即可呈现出令人惊叹的VR全景效果。 集成多功能…

机器视觉系统硬件组成之工业相机篇

工业相机是一种非常重要的机器视觉器件&#xff0c;它能够将被采集的图像信息通过电路转换成电信号&#xff0c;再通过模数转换器&#xff08;ADC&#xff09;将其转化为数字信号&#xff0c;最后以标准的视频信号输出。工业相机在机器视觉领域得到了广泛应用&#xff0c;包括质…