一个 select 应该告诉你一些信息
摘要
一篇关于 CSS `appearance: base-select` 可自定义下拉选择组件的博客文章,展示五个 before/after 案例,说明选项现在可以包含预览、数值、职位等富内容,让选择列表本身就能提供决策所需的信息,而不是只有一行纯文本。
<p><a href="https://lobste.rs/s/3mnrlw/select_should_tell_you_something">评论</a></p>
查看缓存全文
缓存时间: 2026/10/28 01:54
# 一个 select 应该告诉你点什么
来源:https://alfy.blog/2026/10/27/a-select-should-tell-you-something.html
**注意:**你的浏览器还不支持可自定义的 select,所以下面的"改造后"示例看起来就是普通的 select。你的访客在这个浏览器里看到的也正是这样。想看到区别,请用 Chrome 或 Edge 打开本页。
关于 `appearance: base-select` 以及如何使用它的文章已经不少了。我们终于可以给 select 加样式了。但更大的变化在于 option 能承载什么。直到现在,一个 option 只是一行纯文本,于是一个人做决定所需要的一切,要么硬塞进标签里,要么干脆舍弃。现在一个 option 可以承载人们真正用来决策的东西:预览、数字、职位、警示。人们不再逐行阅读、绞尽脑汁,而是开始"一眼认出"。
下面有五个 select,每个都展示了改造前和改造后。改造前是如今大多数表单的样子。改造后是同一个 `select`,键盘行为相同,表单值相同,只是展示的内容变了。
如果你想了解实现机制,Chrome 团队的公告(https://developer.chrome.com/blog/a-customizable-select)和 MDN 的指南(https://developer.mozilla.org/docs/Learn_web_development/Extensions/Forms/Customizable_select)讲得很清楚。
### 眼见为实,别靠想象
字体选择器通常只列名字。要选得好,你要么本来就记得 Fraunces 长什么样,要么先选它、看看效果,再回来试下一个。当每个 option 都用自己的字体来渲染时,option 本身就是预览。你评判的是字形,而不是名字。
改造前:标题字体
改造后:标题字体
改造前,你得知道 Fraunces 长什么样。改造后,你直接看到。
这个模式并不新鲜。我们早就在文档编辑器(如 Google Docs)和设计工具(如 Figma、Photoshop)里见过它了。它现在也轮到我们用了,而且只需要给每个 option 加一条行内样式,`style="font-family: 'Fraunces', serif"`,收起状态的控件在你选择之后也会保持该字体。
我们还可以展示每种字体的类别,比如衬线(Serif)、无衬线(Sans)、等宽(Mono)、展示体(Display)或手写体(Handwriting)。
### 让列表替你算数
时区选择器通常长得像"(GMT+09:00)东京"。这个偏移量很精确,但几乎从来不是你真正想知道的。你想要的是那边现在几点,于是你得在脑子里把自己的时间和偏移量相加,午夜前后还容易算错。把每个城市的当前时间以及白天还是黑夜显示出来,问题在你选择之前就自己回答了。
改造前:在…安排会议
改造后:在…安排会议
改造前,你得根据偏移量自己推算时间。改造后,列表直接告诉你,还告诉你那边是白天还是黑夜。
这是唯一需要 JavaScript 的示例,因为时间来自 `Intl.DateTimeFormat`。
### 一目了然地比较
配送选项通常是一组单选按钮,每个选项的详情都写成一句话。公平地说,单选按钮有其真正的优势:不用点击就能看到所有选项,对于两三个简短的选择,它就是正确的模式。但一旦每个选项带了几条信息,这些信息就会散落成一段段文字。比较就意味着读完每句话,还得在脑子里记着那些数字。
把信息放进对齐的列里,比较就变成了顺着一列往下扫一眼,而且只占用一个字段的空间。
改造前:
改造后:配送方式
改造前,详情藏在句子里,占满了整个面板。改造后,同样的选择装进一个字段里,到达时间和价格整齐对齐。
这些列就是每个 option 上的网格:
```css
option {
display: grid;
grid-template-columns: 1fr 6.5rem 4rem;
}
```
### 把人区分开
在一家大约两百人的公司里,我们有两位同名同事,分属不同部门。每次我需要选其中一位,我都靠职位来分辨。照片的作用比你想的小,因为人们常常不知道同事长什么样,尤其是另一个部门的。纯文本的 select 只会给你两个一模一样的选项,全靠猜。把职位和部门放在名字下面,它们就变成了两个不同的答案。收起状态的控件也会保留职位,所以任何审阅表单的人都能看出你选的是谁。
改造前:把发票发给
改造后:把发票发给
两个人同名。改造前,你只能猜。改造后,职位和部门让它们成为两个不同的答案,列表收起后也一样。
### 选择之前先知晓
有些选项带有后果。在普通 select 里,你是事后才知道的。在列表里把这些选项标记出来,你在选择的同时就知道了。
改造前:与…共享报告
改造后:与…共享报告
改造前,你共享之后才发现某个团队需要审批。改造后,你在选择的时候就知道了。
徽章只出现在需要特别注意的选项上,其他地方一概没有。
### 它仍然是一个 select
本文中每一个"改造后"都是一个普通的 `select`。键盘处理、首字母跳转、表单提交、`select.value`、`required`、校验以及无障碍角色全部由浏览器负责,控件本身不需要任何 JavaScript。
更大的取舍在于手机上。原生 select 会打开操作系统自带的选择器:iOS 上是滚轮,Android 上是底部面板。这些大家都熟悉,为拇指操作而设计,也针对各平台的无障碍特性做了调校。可自定义的 select 不会用它们,而是自己在页面上绘制列表。
你不必为所有人选择同一种行为。只在有鼠标或触控板的环境下启用,触摸设备保留原生选择器:
```css
@media (hover: hover) and (pointer: fine) {
select,
::picker(select) {
appearance: base-select;
}
}
/* 或者我们可以根据窗口大小判断 */
@media (min-width: 768px) {
select,
::picker(select) {
appearance: base-select;
}
}
```
手机用户看到的是每个选项的纯文本,没有额外内容——这也是为什么文本必须能够独立成立的又一个理由。本文中的示例在所有环境都启用了自定义,所以你可以在任何设备上尝试。
### 今天就开始用
可自定义的 select 是教科书式的渐进增强。不支持它的浏览器不会出错,只是显示普通的原生 select,只保留每个选项的文本,并提交相同的值。没有人会因此得到比现在更差的表单。
如果你写这篇文章时正在用 Firefox 阅读,上面那些"改造后"示例就是你的访客会看到的样子。
于是只剩下一条要求,而这本来就是好实践:每个选项的文本必须能够独立成立。应该是"Ahmed Mostafa,会计 · 财务部",而不只是一个名字;应该是"Express,明天,$8.50",而不是三个零散的片段。在示例中,一些小的分隔符 span 在自定义版本里被隐藏,在普通版本里则让整段文字读起来像一个句子。
不需要 polyfill。
所以没有理由再等了。找到你的产品中最让人犹豫不决的那个 select,问清楚人们真正想了解的是什么,然后把答案放进 option 里。其余的,统统省掉。
相似文章
使用 CSS 媒体查询提升无障碍体验(2025)
一篇关于利用 prefers-contrast、prefers-reduced-motion、prefers-color-scheme 等 CSS 媒体查询提升网站可访问性的前端实践文章,介绍如何在不重做设计的前提下响应用户偏好设置。
@noahduck283: https://x.com/noahduck283/status/2071422717417644490
本文是一份Codex插件的详细使用指南,将插件按场景分类,帮助用户根据实际工作需求选择和配置插件。
@jakevin7: 分享一个很好用的前端提示词。 优先复用成熟库、组件源代码可控、统一设计语言、严格限制重复依赖。 再配合指定好各种库,就算 oneshot 也能出很不错的前端。 UI 风格统一使用 譬如 shadcn/ui Nova 图标统一使用 譬如 L…
分享一个用于 AI 生成前端代码的实用提示词模板:优先复用成熟库、统一设计语言(如 shadcn/ui、Lucide 图标、Motion 动画、react-resizable-panels、dnd-kit、Zustand),即使 one-shot 也能产出风格一致的高质量前端界面。
@xingxingli45573: 又挖到一个好东西,叫 Taste Skill,GitHub 上已经拿了 20.3k Star。 简单来说,装上它之后,AI 生成的前端界面会好看很多。布局、字体、动效、留白,各方面都有明显提升,整体看起来有高级感。 它提供了好几个设计方向…
Taste Skill 是一个开源的前端框架,旨在提升 AI 生成界面的视觉品质,提供多种设计方向和可调节参数,GitHub 上已获 20.3k 星。
@yaohui12138: 之前看乔木老师做了一个超详细的前端设计 Skill 测评!! 我根据他的测试结果 + 自己的实际使用,把这些 Skill 分成了三个档位: 第一档:视觉冲击型(适合营销页、作品集) frontend-design 核心特点:反 gener…
这篇文章详细评测了多种前端设计AI技能,将其分为视觉冲击型、工程规范型和细节打磨型三个档位,并提供了安装链接和使用建议。