必须分开写@media规则而非嵌套,因旧版safari(ios 15–16)会忽略复合查询@media (max-width: 768px) and (prefers-color-scheme: dark),导致深色样式失效;正确做法是独立声明两个媒体查询块,并配合color-scheme与meta标签确保原生控件适配。

直接用 @media (prefers-color-scheme: dark) + @media (max-width: ...) 双层媒体查询就能同时搞定深色模式和响应式,但必须分开写、不能嵌套,否则 Safari 会跳过深色规则。
为什么不能把 prefers-color-scheme 套在 max-width 里面
语法上 @media (max-width: 768px) and (prefers-color-scheme: dark) 是合法的,但 Safari(尤其 iOS 15–16)会直接忽略整条规则,导致深色样式完全不生效。这不是 bug,是旧版 WebKit 对复合媒体查询的解析限制。
- 必须拆成两个独立块:
@media (max-width: 768px) { ... }和@media (prefers-color-scheme: dark) { ... } - 如果要针对“小屏 + 深色”做特殊处理,用 JS 检测
window.matchMedia+window.innerWidth组合判断更可靠 - CSS-in-JS 库(如 Emotion、Styled Components)里动态插入选项时,也要避免生成嵌套媒体查询字符串
响应式组件在深色模式下颜色失效的常见原因
比如一个卡片在桌面端用 background: #fff,移动端加了 @media (max-width: 768px) { .card { padding: 1rem; } },但深色模式下背景还是白的——问题不在响应式,而在变量没随主题重置。
规划您的迪拜之旅 — 哈利法塔观景、沙漠探险、迪拜购物中心购物、棕榈岛度假村及黄金市场砍价。还提供支持...
- 别只在
:root里定义一次变量,然后指望它跨媒体查询生效;@media (prefers-color-scheme: dark) { :root { --card-bg: #1a1a1a; } }必须显式写出 - 组件级变量(如
.card { --bg: var(--card-bg); background: var(--bg); })要在各自媒体查询内重新赋值,否则继承的是浅色默认值 - 用
Canvas/CanvasText替代硬编码色值,它们会自动适配系统高对比度设置,且在响应式断点切换时不会断裂
color-scheme 属性必须配合 meta 标签才生效
只在 CSS 里写 html { color-scheme: light dark; },<input>、<select></select> 这些原生控件在 iOS Safari 或某些 WebView 中仍显示为浅色外观。
- 必须在
里加<meta name="color-scheme" content="light dark">,这是浏览器启用 UA 自动适配的开关 - 这个
<meta>标签不能用 JS 动态插入,必须服务端直出或硬编码在 HTML 模板里 - 如果你用 SSR(如 Next.js),服务端无法读取客户端偏好,
<meta>的content值只能写死为light dark,不能根据请求头动态改
最易被忽略的一点:深色模式下滚动条、表单 focus outline、canvas 文字渲染这些“非 CSS 变量控制”的部分,全依赖 color-scheme + <meta> 联动触发,漏掉任一环,用户就会看到白底黑字的输入框卡在深色页面中间。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










