必须将所有CSS自定义变量声明在:root中,因为只有html根元素能确保所有后代(包括原生控件和Shadow DOM)通过继承正确获取变量值;其他选择器作用域受限,且@media(prefers-color-scheme:dark)须后置声明并配合class切换逻辑。
必须把所有变量声明在 :root 里,否则 input、select 等原生控件和 Shadow DOM 内部根本拿不到值。
CSS 自定义属性靠继承传播,而只有 :root(即 <html> 元素)能确保任意后代节点通过 var(--bg-color) 正确取值。写在 .dark、body 或组件类里,变量只对该选择器及其后代生效。
.dark { --bg-color: #121212; } → <input> 若没被包裹进 .dark,就 fallback 到透明或浏览器默认色body { --text-color: #eee; } → var(--text-color) 在 <html> 上求值时根本找不到定义:root 变量,须在 :host 或 ::slotted 里手动传入它只负责系统偏好兜底,不是万能开关。写错位置或漏声明变量,一刷新就崩。
:root 默认声明之后,否则旧版 Safari 直接忽略:root 中完整声明默认值,否则系统设为 no-preference 时 var(--border-color) 会 fallback 成 transparent
--shadow-sm,用了 box-shadow: var(--shadow-sm) 的按钮就没了阴影@media (max-width: 768px) { @media (prefers-color-scheme: dark) { } } 是无效结构后者会废掉整套媒体查询逻辑,且维护爆炸。
document.documentElement.classList.toggle('dark')
document.documentElement.style.setProperty('--bg-color', '#121212')
<script> 标签内直接执行,别等 DOMContentLoaded
localStorage.setItem('theme', newTheme) 和 classList 必须一起做,缺一不可:root.dark:JS 切 dark 但 CSS 写 .dark 就失效最容易被忽略的是:变量作用域一旦锚定在 :root,后续所有组件样式都只能靠继承和重声明来响应,没有中间层可绕过——写错一处,input、button、textarea 全线失焦。
tlwdr7650路由器没有wps按钮(tlwdr7650路由器没有wps按钮怎么办)
tlwdr7632扩展器电脑怎么设置(tlwdr7632扩展器电脑设置方法)
tlwda6332re安装教程(tlwda6332re如何安装)
tlwdr7632扩展器手机怎么设置(tlwdr7632扩展器手机设置方法)
tlxdr3010怎么设置网速快(tlxdr3010网速快设置方法)
tlwdr5620易展版怎么克隆(tlwdr5620易展版克隆方法)