百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

现代CSS:网页暗黑模式实现综合指南

zhezhongyun 2025-03-05 23:51 48 浏览

暗黑模式是一种设计趋势,由暗色(dark)和高亮(light)两种视觉模式组成。暗黑模式之所以成为设计或者 Web 端的热点,主要归功于 Apple 公司,该公司在 iOS 和 macOS 操作系统中加入了暗黑模式,即系统级别的两种皮肤,用户可以通过系统切换,让整个应用的颜色可以轻松切换。暗黑模式流行之后,Windows 和 谷歌也加入了暗黑模式,选多流行的网站和应用程序中都提供了暗黑模式选型。

本文将从以下几个方面深入探讨网页暗黑模式的实现:

  • 效果预览
  • 暗黑模式现状
  • 暗黑模式实现方案
  • 传统方案:类名或者样式表切换
  • 现代方案:CSS变量 + @container + :has()
  • 未来方案:light-dark()
  • 暗黑模式的应用

如果本文对您有帮助,欢迎在关注、点赞、分享给更多需要的人。

1.效果预览

2.暗黑模式现状

暗黑模式在操作系统被支持之后,在APP、网页、浏览器中得到广泛支持,尤其是现在网页端的框架已实现的对暗黑模式的功能支持。

2.1.操作系统

以 macOS 为例,在操作系统中 Settings > 通用 面板可以切换 light 和 dark 模式。

2.2.浏览器

在 Chrome 开发工具中 DevTools > Settings > Preferences > Theme 可以设置 light 和 dark 模式。

2.3.前端框架

1)Bootstrap

Bootstrap 在 v5.3.0 版本支持了 light 和 dark 两种颜色模式,开发者可以通过 data-bs-theme 属性在 html 元素上全局切换,也可以在特定的组件和元素上切换。

更多:https://getbootstrap.com/docs/5.3/customize/color-modes/

2)Tailwind CSS

Tailwind CSS 中暗黑模式可以通过 mediaclass 两种方式进行设置,media 选项由操作系统设置,只会考虑浏览器的配色方案偏好,而 class 选项将查找 .dark 应用于 html 标签的类,通过这种方法,开发者可以手动进行偏好设置。

更多:https://tailwindcss.com/docs/dark-mode

3.暗黑模式实现方案

3.1.传统方案:类名或者样式表切换

暗黑模式最传统的实现方案就是实现两套颜色主题,包含类名切换和按条件加载样式表两种不同方案。

1)类名切换:一个样式文件 + 两套颜色类选择器:

通过一个样式文件和两套颜色类选择器,通过 Javascript 实现类名 light 或者 dark 切换。


2)样式表按需:两个样式文件 + 一套颜色类选择器:

<%if(theme>
  
<%>} else {%>
  
<%}%>

3.2.现代方案:CSS变量 + @container + :has()

现代方案采用现代 CSS 属性:CSS变量、@container、:where()、:has() 等组合来实现。

1)核心样式:

body {
  display: grid;
  place-items: center;
  --background-color: #fff;
  --text-color: #222;
  background-color: var(--background-color);
  color: var(--text-color);
  color-scheme: light dark;
  margin-top: 20px;
}

:where(html) {
  --darkmode: 0;
  container-name: root;
  container-type: normal;
}

@container root style(--darkmode: 1) {
  body {
    --background-color: hsl(228, 5%, 15%);
    --text-color: hsl(228, 5%, 80%);
  }
}

@media (prefers-color-scheme: dark) {
  html {
    --darkmode: 1;
  }
}

@media (prefers-color-scheme: light) {
  html {
    --darkmode: 0;
  }
}

html:has(#color-scheme-light:checked) {
  --darkmode: 0;
}

html:has(#color-scheme-dark:checked) {
  --darkmode: 1;
}

2)部分样式解析:

html:has(#color-scheme-dark:checked)html 子元素含有 id 属性值为 color-scheme-darkchecked 属性值为 true 的元素。示例中使用的是 input[type=radio] 元素。

@media (prefers-color-scheme: light)prefers-color-scheme CSS 媒体特性用于检测用户是否有将系统的主题色设置为亮色或者暗色。本示例在切换系统暗黑模式时,网页的颜色也会跟着变化。

:where():CSS 伪类函数,接受选择器列表作为它的参数,将会选择所有能被该选择器列表中任何一条规则选中的元素。

:has():CSS 伪类函数,通过把可容错相对选择器列表作为参数,提供了一种针对引用元素选择父元素或者先前的兄弟元素的方法。

@container root style(--darkmode: 1): 是一种条件组规则,可将样式应用于包含上下文。样式声明由条件筛选,如果条件为真,则应用于容器。当容器改变大小时,将对条件进行评估。

color-scheme: light dark:color-scheme 属性允许元素指明它可以使用哪些配色方案。当用户选择其中一种配色方案时,操作系统会对用户界面进行调整。这包括表单控件、滚动条和 CSS 系统颜色的使用值。

3.3.未来方案:light-dark()

1)light-dark() 介绍

好消息!,CSS Color Module Level 5 Specification 新增加了一个函数 light-dark()。该函数接受两个颜色值作为参数。根据您正在使用的颜色方案,它将输出第一个或第二个颜色参数。

light-dark(, );

如规范中描述:

This function computes to the computed value of the first color, if the used color scheme is light or unknown, or to the computed value of the second color, if the used color scheme is dark.

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

:root {
  color-scheme: light dark;
}

/* light 对应 #333,dark 对应 #ccc */
:root {
  --text-color: light-dark(#333, #ccc); 
}

2)light-dark() 兼容性

当前,现代浏览器对 light-dark() 的支持还不太好,仅有 firefox 浏览器的最新版本支持。

2)light-dark() 支持判断

可以通过 @supports 和 CSS 伪元素来判断。

#support::after {
  content: " Your browser does not support light-dark()";
  background-color: #ff00002b;

  display: block;
  margin: 1em 0;
  padding: 1em;
  border: 1px solid #ccc;
}
@supports(color: light-dark(#fff, #000)) {
  #support::after {
    content: " Your browser supports light-dark()";
    background-color: #00ff002b;
  }
}

4.暗黑模式的应用

除了主要的网页颜色主题切换外,还有一些其他应用场景。

1)暗黑模式图像

2)暗黑模式阴影

3)暗黑模式调色板

4)暗黑模式段落

5.最后

网站是否启用暗黑模式,取决于不同团队、不同用户群体、不同设计风格,下面是一些推荐你开启的理由:

  • UI 风格和功能会看起来很酷、很时尚
  • 通过支持对 light 主题敏感的用户,它可以增强可访问性,减轻他们的眼睛疲劳
  • 它允许用户决定最舒适的内容消费方式,同时为我们提供了一种保持外观和感觉的控制方式
  • 它有助于延长具有 OLED 屏幕的设备的电池寿命,因为较亮的颜色消耗更多能量
  • 最重要的一点,暗盒模式现状非常非常受欢迎

相关推荐

Python入门学习记录之一:变量_python怎么用变量

写这个,主要是对自己学习python知识的一个总结,也是加深自己的印象。变量(英文:variable),也叫标识符。在python中,变量的命名规则有以下三点:>变量名只能包含字母、数字和下划线...

python变量命名规则——来自小白的总结

python是一个动态编译类编程语言,所以程序在运行前不需要如C语言的先行编译动作,因此也只有在程序运行过程中才能发现程序的问题。基于此,python的变量就有一定的命名规范。python作为当前热门...

Python入门学习教程:第 2 章 变量与数据类型

2.1什么是变量?在编程中,变量就像一个存放数据的容器,它可以存储各种信息,并且这些信息可以被读取和修改。想象一下,变量就如同我们生活中的盒子,你可以把东西放进去,也可以随时拿出来看看,甚至可以换成...

绘制学术论文中的“三线表”具体指导

在科研过程中,大家用到最多的可能就是“三线表”。“三线表”,一般主要由三条横线构成,当然在变量名栏里也可以拆分单元格,出现更多的线。更重要的是,“三线表”也是一种数据记录规范,以“三线表”形式记录的数...

Python基础语法知识--变量和数据类型

学习Python中的变量和数据类型至关重要,因为它们构成了Python编程的基石。以下是帮助您了解Python中的变量和数据类型的分步指南:1.变量:变量在Python中用于存储数据值。它们充...

一文搞懂 Python 中的所有标点符号

反引号`无任何作用。传说Python3中它被移除是因为和单引号字符'太相似。波浪号~(按位取反符号)~被称为取反或补码运算符。它放在我们想要取反的对象前面。如果放在一个整数n...

Python变量类型和运算符_python中变量的含义

别再被小名词坑哭了:Python新手常犯的那些隐蔽错误,我用同事的真实bug拆给你看我记得有一次和同事张姐一起追查一个看似随机崩溃的脚本,最后发现罪魁祸首竟然是她把变量命名成了list。说实话...

从零开始:深入剖析 Spring Boot3 中配置文件的加载顺序

在当今的互联网软件开发领域,SpringBoot无疑是最为热门和广泛应用的框架之一。它以其强大的功能、便捷的开发体验,极大地提升了开发效率,成为众多开发者构建Web应用程序的首选。而在Spr...

Python中下划线 ‘_’ 的用法,你知道几种

Python中下划线()是一个有特殊含义和用途的符号,它可以用来表示以下几种情况:1在解释器中,下划线(_)表示上一个表达式的值,可以用来进行快速计算或测试。例如:>>>2+...

解锁Shell编程:变量_shell $变量

引言:开启Shell编程大门Shell作为用户与Linux内核之间的桥梁,为我们提供了强大的命令行交互方式。它不仅能执行简单的文件操作、进程管理,还能通过编写脚本实现复杂的自动化任务。无论是...

一文学会Python的变量命名规则!_python的变量命名有哪些要求

目录1.变量的命名原则3.内置函数尽量不要做变量4.删除变量和垃圾回收机制5.结语1.变量的命名原则①由英文字母、_(下划线)、或中文开头②变量名称只能由英文字母、数字、下画线或中文字所组成。③英文字...

更可靠的Rust-语法篇-区分语句/表达式,略览if/loop/while/for

src/main.rs://函数定义fnadd(a:i32,b:i32)->i32{a+b//末尾表达式}fnmain(){leta:i3...

C++第五课:变量的命名规则_c++中变量的命名规则

变量的命名不是想怎么起就怎么起的,而是有一套固定的规则的。具体规则:1.名字要合法:变量名必须是由字母、数字或下划线组成。例如:a,a1,a_1。2.开头不能是数字。例如:可以a1,但不能起1a。3....

Rust编程-核心篇-不安全编程_rust安全性

Unsafe的必要性Rust的所有权系统和类型系统为我们提供了强大的安全保障,但在某些情况下,我们需要突破这些限制来:与C代码交互实现底层系统编程优化性能关键代码实现某些编译器无法验证的安全操作Rus...

探秘 Python 内存管理:背后的神奇机制

在编程的世界里,内存管理就如同幕后的精密操控者,确保程序的高效运行。Python作为一种广泛使用的编程语言,其内存管理机制既巧妙又复杂,为开发者们提供了便利的同时,也展现了强大的底层控制能力。一、P...