color-scheme 不是深色模式开关,仅声明支持的系统配色方案;需通过 <meta name="color-scheme"> 或 :root { color-scheme: light dark; } 声明才能使原生控件适配系统偏好,且不影响自定义元素样式。
color-scheme 不是用来“实现深色模式”的万能开关,它只负责告诉浏览器:「我支持哪些系统配色方案」。真正起效的前提是——你得先声明它,否则原生控件(input、select、button、滚动条)在深色系统下仍会固执地显示浅色样式。<meta name="color-scheme"> 声明全局支持这是最轻量、最早生效的方式,无需 CSS 解析,页面 HTML 加载阶段就起作用:
<meta name="color-scheme" content="light dark"> 放在 <head> 里,浏览器立刻知道该适配系统偏好:root { color-scheme: light dark; },某些浏览器(如 Safari iOS 16.4 之前)可能延迟应用或忽略原生控件样式content 值顺序无关紧要:light dark 和 dark light 行为一致,没有“优先级”一说light, dark
color-scheme 在 CSS 中的写法与作用范围它只影响浏览器默认渲染的「系统级元素」,不是自定义样式的开关:
input、textarea、select、button、progress、scrollbar,以及所有使用 Canvas 系统颜色(如 CanvasText)的场景div、p、h1 等普通元素无任何视觉影响,它们的背景/文字色仍需手动控制:root { color-scheme: light dark; } 是推荐写法;局部设置如 .card { color-scheme: dark; } 会让该区域内的原生控件强制走深色逻辑(哪怕系统是浅色)only light 这种写法极少需要,它会阻止浏览器自动覆盖——比如你明确不想让某个 input 被深色化color-scheme 还是白底黑字?常见误解是它能自动切换整个页面主题。实际上:
background-color、color、border-color 等自定义属性,这些必须配合 @media (prefers-color-scheme: dark) 手动写color-scheme 没写媒体查询,页面内容仍按初始 CSS 渲染(通常是浅色),只是输入框边框变灰了而已color-scheme 仅对新版标准滚动条有效ButtonFace)只有在 color-scheme 生效后才动态变化,直接写死 #f0f0f0 就绕过了这个机制主流浏览器(Chrome 89+、Firefox 96+、Safari 15.4+)已稳定支持,但要注意:
立即学习“前端免费学习笔记(深入)”;
color-scheme 被忽略,页面照常渲染,不会报错也不会崩getComputedStyle(document.documentElement).colorScheme —— 该属性未标准化,返回值不可靠prefers-color-scheme 媒体查询为准,color-scheme 只管“基础皮肤”color-scheme 的核心价值不在“炫技”,而在消除系统级视觉冲突。最容易被忽略的是:它必须和 prefers-color-scheme 配合使用,前者管控件,后者管内容——漏掉任一环,用户在深色系统里点开你的页面,看到的都可能是半截深色滚动条配全屏刺眼白背景。