最轻量且无需JS的深色模式方案是优先使用prefers-color-scheme媒体查询,再用localStorage+dark类实现用户手动覆盖;避免color-scheme meta标签误用及内联样式硬改,图标和图片需双资源适配。
prefers-color-scheme 检测系统偏好,最轻量且无需 JS现代浏览器(Chrome 76+、Firefox 67+、Safari 12.1+)原生支持 prefers-color-scheme 媒体查询,能直接读取用户操作系统级的深色/浅色设置。这是加夜间模式的第一道防线,也是最可靠的基础。
change 事件才实时更新)@media (prefers-color-scheme: dark) {
:root {
--bg: #1e1e1e;
--text: #e0e0e0;
}
}
@media (prefers-color-scheme: light) {
:root {
--bg: #ffffff;
--text: #333333;
}
}
localStorage + class 切换,支持用户手动覆盖系统设置用户可能想“反系统”:比如系统设为浅色,但希望网页用深色。这时必须提供开关按钮,并把选择持久化到 localStorage,否则刷新就丢。
style 标签或内联样式切换——难以维护、无法继承、CSS 优先级混乱 或 添加 dark class,再用 CSS 层叠控制样式localStorage 和 class,还要处理 prefers-color-scheme 与手动设置的优先级关系function setDarkMode(isDark) {
if (isDark) {
document.documentElement.classList.add('dark');
localStorage.setItem('theme', 'dark');
} else {
document.documentElement.classList.remove('dark');
localStorage.setItem('theme', 'light');
}
}
// 初始化:先看 localStorage,再 fallback 到 prefers-color-scheme
const saved = localStorage.getItem('theme');
const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
if (saved === 'dark' || (!saved && systemPrefersDark)) {
setDarkMode(true);
} else {
setDarkMode(false);
}
color-scheme meta 标签和强制重绘陷阱 只影响浏览器 UI(如地址栏、滚动条),**不会改变你的页面样式**。别指望它替代 CSS。
document.body.style.backgroundColor 这类内联样式硬改?会导致 CSS 变量失效、媒体查询被绕过、动画卡顿getComputedStyle 或强制重排(如读写 offsetHeight)可能引发布局抖动,尤其在 scroll 或 toggle 事件中box-shadow 和半透明背景(rgba(0,0,0,0.1) 在黑底上几乎不可见)filter: brightness(0.8) contrast(1.2) 看似简单,但对图标、图表、照片效果极不稳定:可能让灰度图变糊、让红色失真、让 SVG 渐变断裂。
立即学习“前端免费学习笔记(深入)”;
picture + media 切换.dark svg path { fill: var(--icon-dark); } 控制颜色background-image: image-set(...)(支持有限)或 JS 动态换 src
真正麻烦的是第三方内容(如 embed 的视频、iframe 广告、富文本里的 )——它们不受你 CSS 控制,得靠 invert() + hue-rotate 补救,但代价是色彩失真。这种边界情况,往往比开关本身更耗时间。
()
# css
# html
# js
# go
# html5
# svg
# 操作系统
# 浏览器
# ssl
# safari
# win
# firefox
# chrome
# Filter
# 继承
# class
# var
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
c++ atoi和atof函数用法_c++字符数组转数字
Win11怎么关闭VBS安全性_Windows11提升游戏性能关闭虚拟化安全
Win11怎么设置DNS服务器_Windows11修改网络适配器DNS优选
Mac怎么进行语音输入_Mac听写功能设置与使用【教程】
c++中如何对数组进行排序_c++数组排序算法汇总
如何使用Golang实现多重错误处理_Golangerror组合与判断方法
Win10怎样清理C盘浏览器缓存_Win10清理浏览器缓存步骤【步骤】
Win11任务栏怎么调到左边_Win11开始菜单居左设置教程【步骤】
Python lxml的etree和ElementTree有什么区别
跨文件调用类方法怎么用_php作用域操作符与自动加载配合【介绍】
Win10如何更改网络连接_Windows10以太网属性IP配置
如何在 ACF 中正确更新嵌套多层的 Group 字段子字段
如何使用Golang管理模块版本_Golanggo mod tidy与升级方法
php文件怎么变mp4保存_php输出视频流保存为mp4操作【操作】
Win11玩游戏全屏闪退怎么办_Win11全屏优化禁用设置【教程】
Python网络超时处理_健壮性设计说明【指导】
c++如何使用std::bind绑定函数参数_c++ 占位符std::placeholders使用【详解】
Win11输入法切换快捷键怎么改_Windows 11自定义语言切换键位【教程】
Win10系统怎么查看显卡温度_Win10任务管理器GPU温度
php订单日志怎么按金额排序_php按订单金额排序日志方法【方法】
如何使用Golang实现微服务状态监控_Golang服务运行状态采集方法
如何在Golang中验证模块完整性_Golanggo.sum校验与安全实践
Win11怎么关闭搜索历史 Win11清除搜索框最近记录【隐私】
PHP接收参数长度超限怎么办_修改postmaxsize设置教程【解答】
win11 OneDrive怎么彻底关闭 Win11禁用并卸载OneDrive教程【分享】
全球各国上班时间表外贸邮件时间
Mac如何创建和管理多个桌面空间_Mac高效多任务处理【技巧】
Win11怎么关闭右下角弹窗_Win11拦截系统通知广告【设置】
Win11怎么开启空间音效_Windows11耳机杜比音效与Sonic设置
Windows 11登录时提示“用户配置文件服务登录失败”怎么办_Windows 11修复损坏的用户配置文件
Mac版Final Cut Pro入门_Mac视频剪辑基础操作【教程】
如何使用Golang反射创建map对象_动态生成键值映射
c++ stringstream用法详解_c++字符串与数字转换利器
Python函数参数高级用法_默认值与可变参数解析【教程】
Linux如何申请SSL免费证书_Linux下Certbot安装与Nginx自动续期【指南】
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
如何在 PHP 单元测试中正确模拟带方法的图像处理门面(Facade)
Win11怎么关闭自动修复_跳过Win11开机自动修复循环【技巧】
如何使用Golang捕获并记录协程panic_保证主程序稳定运行
Win10电脑怎么设置休眠快捷键_Windows10电源按钮功能定义
Win11怎么设置声音输出设备_Windows11音量合成器单独调节应用
Go 中的 := 运算符:类型推导机制与使用边界详解
Python 模块的 __name__ 属性如何由导入方式决定?
如何在包含多值的列中精准搜索指定演员?
Win11讲述人怎么关闭_Win11误触开启语音朗读关闭【快捷键】
作用域操作符会影响性能吗_php静态调用性能分析【教程】
Windows蓝屏错误0x0000002C怎么解决_系统IO异常排查方法
Win11怎么硬盘分区 Win11新建磁盘分区详细教程【步骤】
Win11怎么开启远程桌面_Win11系统远程桌面启用开关
如何在Golang中写入XML文件_生成符合规范的XML数据
2026-01-03
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。