深色模式下表单还是白的:color-scheme 才是开关

把背景涂黑不等于原生控件跟着黑。select 的下拉、日期选择器、自动填充的底色都由 color-scheme 决定,accent-color 只管住勾选框与滑块。

站点的深色模式做完之后,剩下白的地方通常是控件:select 弹出的列表、input[type=date] 的日历、浏览器自动填充时的底色、滚动条。页面背景已经是 #101433,这些仍是白的。

根因不是背景色

原生控件的外观由 color-scheme 决定,它告诉浏览器「这个页面支持哪些主题」,浏览器据此决定下拉列表、日历、自动填充这些页面画不出来的部分用什么颜色。你在 input 上写 background: transparent 只影响输入框本体,管不到浏览器自己渲染的弹层。

html[data-theme="light"] { color-scheme: light; }
html[data-theme="dark"]  { color-scheme: dark; }

本站的主题是 html[data-theme] 上一个显式的值,所以映射表也写在这里 —— 不用 light dark 交给系统,因为站内的主题切换允许和操作系统不一致。

accent-color 管另一批控件

勾选框、单选钮、进度条、滑块(input[type=range])画的是单一强调色,它们由 accent-color 决定:

:root { accent-color: var(--c-accent); }

一行就够,而且跟随换肤令牌。这两条写完之后,剩下的才是真正需要逐个打补丁的少数派:::file-selector-button(文件按钮)、::-webkit-calendar-picker-indicator(日期图标)、::placeholder。

顺序不要倒过来

先写自定义控件的样式、再补 color-scheme,会得到一批「在浅色下正常、深色下像贴纸」的补丁 —— 因为那些补丁原本是为了遮住白底弹层而加的。先声明主题,再决定哪些控件值得重画。

能用 color-scheme 与 accent-color 表达的意思,不要用 appearance: none 重画一遍。

← 返回文章列表

评论

…