css未来:使用light-dark()切换主题色

css未来:使用light-dark()切换主题色

要根据使用的是浅色模式还是深色模式来更改颜色,我们通常会使用 prefers-color-scheme 媒体查询。为了让代码实现变得更容易,CSS 现在附带了一个名为 light-dark() 的实用函数。该函数接受两个颜色值作为其参数。根据我们正在使用的配色方案,它将使用第一个或第二个参数。

使用 prefers-color-scheme 切换主题色

要根据所使用的浅色模式或深色模式更改颜色值(或任何其他值),我们通常会使用媒体prefers-color-scheme 查询来更改自定义属性的值:

:root {--text-color: #333; /* 浅色主题色 */
}@media (prefers-color-scheme: dark) {:root {--text-color: #ccc; /* 深色主题色 */}
}

实现深色模式时,通常会得到一堆重复的 CSS 变量,这些变量为每种模式设置值。然后,CSS 的其余部分将这些自定义属性用于实际声明。

body {color: var(--text-color);
}

使用 light-dark() 切换主题色

CSS 颜色模块第 5 级规范 的新增功能是 light-dark() 功能。该函数接受两个颜色值作为其参数。根据我们正在使用的颜色方案,它将使用第一个或第二个颜色参数。

light-dark(<color>, <color>);

根据规格:

如果使用的配色方案为 light 或未知,则此函数计算第一种颜色的计算值;如果使用的配色方案为dark,则此函数计算第二个颜色的计算值。

使用的配色方案不仅基于用户的浅色/深色模式设置,还基于属性的值 color-scheme。这类似于系统颜色的计算方式。

color-scheme属性允许元素指示其设计用于渲染的配色方案。这些值是根据用户的偏好进行协商的,从而产生使用的配色方案。

这意味着,为了 light-dark() 起作用,我们还必须包含一份 color-scheme 声明。

:root {color-scheme: light dark;
}:root {--text-color: light-dark(#333, #ccc); /* 在浅色模式使用#333,在深色模式使用#ccc */
}

因为 color-scheme 的声明方式,这也意味着我们可以覆盖每个元素的值,以强制其进入某种模式:

.dark {color-scheme: dark; /* 在.dark元素上使用 light-dark,.dark元素的所有子元素都是深色模式 */
}

light-dark()看起来跟Chromium 内部的 -internal-light-dark()很类似。基于此功能, CSS 工作组内提出了向作者公开类似功能的提案。结果就诞生了 light-dark()。

-internal-light-dark() 适用于任何类型的值,而 light-dark() 只能用于颜色。

其他非颜色值能否支持

light-dark() 的功能相当有限:它只能处理 light/dark,并且只能处理值。这是正确的,也是非常有意的,因为这是迈向最终解决方案的中间步骤。

正如CSS 工作组问题中所提出的,最终目标是在未来(暂定)有一个命名的函数。该函数功能可以:

  • 响应 color-scheme 的任意值。
  • 返回的不仅仅是 值

它可能看起来像这样:

:root {color-scheme: dark light custom;
}body {color: schemed-value(light hotpink, dark lime, custom rebeccapurple);
}

但是,就目前而言,我们“仅”拥有 light-dark(),而且我个人认为这很好,因为它与当今浏览器可以执行的操作的现实相符:

  • 它只支持 light/dark 。因为浏览器现在不支持incolor-scheme,所以现在支持其他值是没有用的。
  • 它只能处理值,因为解析器需要提前知道它正在解析的值的类型。light-dark()被明确定义为一个值。

light-dark() 的名称和语法非常容易记住,易于使用。

当 schemed-value() 成为一个事物时,light-dark()就会成为它的语法糖:

light-dark(<color>, <color>); = schemed-value(light <color>, dark <color>);

浏览器支持

在这里插入图片描述
目前只有 firefox 支持,如果我们想体验这个功能,可以使用firefox进行测试。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编译原理lab3-cminus_compiler-LLVM简要熟悉

lab3实验报告&#xff0c;我的实验报告图例很少&#xff0c;这次只有两张图&#xff0c;其余的都以复制输出的形式展现出来了&#xff0c;最终提交的代码在最后 [[#你的提交|你的提交]][[#实验设计|实验设计]][[#提交一&#xff1a;手动编写.ll|提交一&#xff1a;手动编写.ll…

TREK610C高压放大器

181/2461/8938技术规格 输出电压&#xff1a;0到10 kV直流电压 输出电流&#xff1a;0到2 mA 转换率&#xff1a;大于500 V/μs 信号带宽&#xff1a;直流到1.0 kHz &#xff08;-3dB&#xff09; 放大倍数&#xff1a;1000 V/V 闭环系统以保持低噪音、高精确度电压输出 短…

最简单的基于 FFmpeg 的音频解码器

最简单的基于 FFmpeg 的音频解码器 最简单的基于 FFmpeg 的音频解码器正文参考工程文件下载 参考雷霄骅博士的文章&#xff0c;链接&#xff1a;最简单的基于FFMPEGSDL的音频播放器&#xff1a;拆分-解码器和播放器 最简单的基于 FFmpeg 的音频解码器 正文 FFmpeg 音频解码器…

【ArcGIS微课1000例】0080:ArcGIS将shp转json(geojson)案例教程

本文以案例的形式,讲述在ArcGIS软件中,将矢量数据转为GeoJSON的方法。 扩展阅读:【GIS风暴】GeoJSON数据格式案例全解 文章目录 一、GeoJson简介二、ArcGIS将矢量数据转为GeoJSON一、GeoJson简介 GeoJSON是一种基于JSON的地理空间数据交换格式,它定义了几种类型JSON对象以…

Spring Cloud Gateway 网关的基础使用

1. 什么是网关&#xff1f;网关有什么用&#xff1f; 在微服务架构中&#xff0c;网关就是一个提供统一访问地址的组件&#xff0c;它解决了内部微服务与外部的交互问题。网关主要负责流量的路由和转发&#xff0c;将外部请求引到对应的微服务实例上。同时提供身份认证、授权、…

Spring-Boot---配置文件

文章目录 配置文件的作用配置文件的格式PropertiesProperties基本语法读取Properties配置文件 ymlyml基本语法读取yml配置文件 Properties VS Yml 配置文件的作用 整个项目中所有重要的数据都是在配置文件中配置的&#xff0c;具有非常重要的作用。比如&#xff1a; 数据库的…

230. 二叉搜索树中第K小的元素 --力扣 --JAVA

题目 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 个最小元素&#xff08;从 1 开始计数&#xff09;。 解题思路 利用List存储数据&#xff1b;遍历整个树&#xff0c;读取数各个节点的value&#xff1b;对value进行…

Python绘制多分类ROC曲线

目录 1 数据集介绍 1.1 数据集简介 1.2 数据预处理 2随机森林分类 2.1 数据加载 2.2 参数寻优 2.3 模型训练与评估 3 绘制十分类ROC曲线 第一步&#xff0c;计算每个分类的预测结果概率 第二步&#xff0c;画图数据准备 第三步&#xff0c;绘制十分类ROC曲线 1 数据集…

【数据结构】——排序篇(上)

前言&#xff1a;前面我们已经学过了许许多多的排序方法&#xff0c;如冒泡排序&#xff0c;选择排序&#xff0c;堆排序等等&#xff0c;那么我们就来将排序的方法总结一下。 我们的排序方法包括以下几种&#xff0c;而快速排序和归并排序我们后面进行详细的讲解。 直接插入…

Qt实现二维码生成和识别

一、简介 QZxing开源库: 生成和识别条码和二维码 下载地址&#xff1a;https://gitcode.com/mirrors/ftylitak/qzxing/tree/master 二、编译与使用 1.下载并解压&#xff0c;解压之后如图所示 2.编译 打开src目录下的QZXing.pro&#xff0c;选择合适的编译器进行编译 最后生…

util.js

一、util.js是什么&#xff1f; 1、util.js是Node.js提供的一个工具库&#xff0c;主要用于辅助实现JavaScript代码的通用功能。 2、除了Node.js中内置的模块外&#xff0c;util.js是Node.js中最核心的模块之一。 3、通过util.js&#xff0c;开发者可以轻松实现JavaScript常…

Unity 资源管理之StreamingAssets

StreamingAssets也是Unity中特殊的文件夹&#xff0c;用于存放运行时可以直接访问的资源。StreamingAssets一般存放数据或配置文件、图片、视频资源等。 StreamingAssets的文件路径可以通过Application.streamingAssetsPath来获取。 加载或访问使用WWW类或UnityWebRequest类。…

MIT6S081-Lab2总结

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com&#xff0c;github地址为https://github.com/xjintong。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家访问。 Lab2就是了解一下xv6的系统调用流程&…

Java - Synchronized的锁升级之路

Synchronized锁 Synchronized在Java JVM里的实现是基于进入和退出Monitor对象来实现方法同步和代码块同步的 monitor enter指令是在编译后插入到同步代码块的开始位置 而monitor exit是插入到方法结束处和异常处 JVM要保证每个monitor enter必须有对应的monitor exit与之配对。…

解决服务端渲染程序SSR运行时报错: ReferenceError: document is not defined

现象&#xff1a; 原因&#xff1a; 该错误表明在服务端渲染 (SSR) 过程中&#xff0c;有一些代码尝试在没有浏览器环境的情况下执行与浏览器相关的操作。这在服务端渲染期间是一个常见的问题&#xff0c;因为在服务端渲染期间是没有浏览器 API。 解决办法&#xff1a; 1. 修…

bat脚本之while

在批处理&#xff08;BAT&#xff09;脚本中&#xff0c;while循环是一种常用的控制流结构&#xff0c;用于在满足特定条件的情况下重复执行一段代码。 while循环的基本语法如下&#xff1a; while [ condition ] do command1 command2 ... commandN done这里的 cond…

【2023传智杯-新增场次】第六届传智杯程序设计挑战赛AB组-DEF题复盘解题分析详解【JavaPythonC++解题笔记】

本文仅为【2023传智杯-第二场】第六届传智杯程序设计挑战赛-题目解题分析详解的解题个人笔记,个人解题分析记录。 本文包含:第六届传智杯程序设计挑战赛题目、解题思路分析、解题代码、解题代码详解 文章目录 一.前言二.赛题题目D题题目-E题题目-F题题目-二.赛题题解D题题解-…

深入理解Sentinel系列-1.初识Sentinel

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理&#x1f525;如果感觉博主的文章还不错的话&#xff…

待做-待补充-每个节点做事,时间,以及与角度的关系

文章目录 待定内容红黑树应用场景限制什么是二叉树遍历递归遍历1.前序遍历 进入节点时2.中序遍历 遍历完左子树回到节点。此操作需要等到所有左树节点做完后才会做3.后序遍历 遍历完左右子树回到节点。左右子树的所有节点都做完操作后&#xff0c;回到当前节点才会做此操作 …

如何搭建自己的直播电商系统?

当下&#xff0c;传统的图文电商模式已经走向没落&#xff0c;视频电商备受追捧。抖音、快手、小红书、京东、淘宝、拼多多都在发力直播电商业务&#xff0c;尤其是以抖音为首的直播电商备受用户欢迎&#xff0c;它具有实时直播和强互动的特点&#xff0c;是传统电商所不具备的…