应用里所有 <select> 都在用系统原生渲染,没有任何统一样式。同一个界面里按钮、输入框、卡片都有自己的一套视觉,只有下拉框跟着操作系统走,跨平台和跨主题都对不上。
现状
全应用共 4 个 <select>:
| 位置 |
类名 |
components/ProviderSegment.tsx:23 |
#provider-select(完全没有 CSS) |
components/NavigationSidebar.tsx:48 |
.language-select-wide |
components/NavigationSidebar.tsx:52 |
.language-select-compact |
components/ThemePicker.tsx:29 |
.theme-picker select |
浏览器实测四个全部是 appearance: auto。全仓库 CSS 里 没有一处 appearance: none —— 只有 base.css:33 的 font: inherit 和 :49 的焦点环,都不涉及外观。
#provider-select 一条样式规则都没有,所以它和侧栏那两个连尺寸都不一致。
为什么值得做
- 跨平台不一致:macOS 的 select 是圆角带阴影的原生控件,Windows 和 Linux 各自又是另一套。同一份界面在三个平台上下拉框长得都不一样,而按钮和输入框是一致的。
- 深色模式靠系统兜:现在能在深色下勉强可读,是因为
:root 设了 color-scheme: light dark(tokens.css:2)让系统自己反色。这意味着下拉框的配色不由 --window-bg / --text-primary 这套 token 决定 —— 主题 token 改了它不跟着变。
- 没有统一的箭头与状态:原生箭头样式、hover、focus、disabled 全部由系统决定,和
.button / .text-field 已有的 140ms 过渡与 --blue-soft 焦点环不成一套。
建议
抽一条共享的 select 规则(base.css 里 .text-field 旁边),做 appearance: none + 自绘箭头 + 用现有 token 上色,然后让四处都用它。箭头用 background-image 的内联 SVG 或 ::after 都可以,注意 <select> 不支持伪元素,所以自绘箭头需要一个包裹元素或者走 background。
要一并注意的:
appearance: none 之后必须自己补 focus 样式,否则会丢掉 base.css:49 那条焦点环覆盖的可见性
- 展开后的
<option> 列表是操作系统绘制的,CSS 改不了。所以"统一"只能做到收起状态;如果要连展开态也统一,那就得换成自定义组件,那是另一个量级的改动,也要自己处理键盘导航和无障碍。建议先只统一收起态
- 侧栏两个 select 在 900px 断点下会缩到 48px 宽、10px 字号(
app.css:1019 与 :1023),自绘箭头要保证这个尺寸下不挤压文字
优先级定为 P2:纯视觉一致性问题,不影响功能,也没有可用性阻塞。#54 那个才是拦住用户的。
应用里所有
<select>都在用系统原生渲染,没有任何统一样式。同一个界面里按钮、输入框、卡片都有自己的一套视觉,只有下拉框跟着操作系统走,跨平台和跨主题都对不上。现状
全应用共 4 个
<select>:components/ProviderSegment.tsx:23#provider-select(完全没有 CSS)components/NavigationSidebar.tsx:48.language-select-widecomponents/NavigationSidebar.tsx:52.language-select-compactcomponents/ThemePicker.tsx:29.theme-picker select浏览器实测四个全部是
appearance: auto。全仓库 CSS 里 没有一处appearance: none—— 只有base.css:33的font: inherit和:49的焦点环,都不涉及外观。#provider-select一条样式规则都没有,所以它和侧栏那两个连尺寸都不一致。为什么值得做
:root设了color-scheme: light dark(tokens.css:2)让系统自己反色。这意味着下拉框的配色不由--window-bg/--text-primary这套 token 决定 —— 主题 token 改了它不跟着变。.button/.text-field已有的 140ms 过渡与--blue-soft焦点环不成一套。建议
抽一条共享的 select 规则(
base.css里.text-field旁边),做appearance: none+ 自绘箭头 + 用现有 token 上色,然后让四处都用它。箭头用background-image的内联 SVG 或::after都可以,注意<select>不支持伪元素,所以自绘箭头需要一个包裹元素或者走 background。要一并注意的:
appearance: none之后必须自己补 focus 样式,否则会丢掉base.css:49那条焦点环覆盖的可见性<option>列表是操作系统绘制的,CSS 改不了。所以"统一"只能做到收起状态;如果要连展开态也统一,那就得换成自定义组件,那是另一个量级的改动,也要自己处理键盘导航和无障碍。建议先只统一收起态app.css:1019与:1023),自绘箭头要保证这个尺寸下不挤压文字优先级定为 P2:纯视觉一致性问题,不影响功能,也没有可用性阻塞。#54 那个才是拦住用户的。