直接写background-color: #f0f0f0会失效,因其无法响应深色模式切换、主题动态变化或组件复用,且不支持prefers-color-scheme自动计算;需用CSS变量--placeholder-bg配合:root声明和@media重设,并避免!important阻断解析。
background-color: #f0f0f0会失效这不是颜色没生效,而是它根本没法响应变化。硬编码色值在深色模式切换、主题动态切换、组件复用时全得手动改——background-color本身不支持条件逻辑,浏览器不会根据prefers-color-scheme自动重算。你看到的“占位符没变色”,其实是变量没被声明或被!important阻断了。
--placeholder-bg变量变量必须声明在可继承的作用域里,且要留出被覆盖的路径:
:root中设默认值::root { --placeholder-bg: #f0f0f0; }
@media (prefers-color-scheme: dark)重设:@media (prefers-color-scheme: dark) { :root { --placeholder-bg: #333; } }
background-color: var(--placeholder-bg),别加!important
:host { --placeholder-bg: #f5f5f5; }更安全transition不触发的三个真实原因背景色“啪”一下消失,不是transition写错了,而是浏览器跳过了重绘时机:
el.classList.add('loaded')后立即应用background-color: transparent,中间没留出 layout 触发点requestAnimationFrame(() => el.classList.add('loaded'))
background-image做占位(比如 SVG 或渐变),transition对它完全无效——只能切opacity或visibility
!important,它会让var(--placeholder-bg)解析失败,退回到初始色aspect-ratio和prefers-color-scheme在 2026 年已基本全覆盖,但仍有细节容易漏:
立即学习“前端免费学习笔记(深入)”;
@media (prefers-color-scheme: dark)内对:root变量的重设,需额外加color-scheme: light dark到<html>根元素will-change: background-color支持不稳定,建议只在 iOS 上启用style="--aspect-ratio: X/Y",否则var(--placeholder-bg)再准也没用空间var(--placeholder-bg)再智能,也填不满一个高度塌陷的div。