← 所有文章

Customizable Select:终于能为真正的 <select> 设计样式

要超越默认的 select 元素,过去只有两种糟糕的取舍:沉重的 JavaScript 库,或大量的 div 元素,而无论哪一种,无障碍都会变得棘手。1在 WWDC 2026 上,Safari 团队指出了一条出路:customizable select,这是一组 HTML 与 CSS 的新增功能,让既有的 <select> 元素变得完全可设计样式,同时保留它原本就具备的语义、键盘导航与屏幕阅读器支持。从 Safari 27 与 Chrome 135 开始,您可以重新设计按钮、下拉菜单、勾选标记,甚至箭头,然后在选项中放入图片、视频或表情符号。1

TL;DR

  • Customizable select 仅靠 HTML 与 CSS 就能为真正的 <select> 元素设计样式,取代开发者过去依赖的 JavaScript 库与 div 堆叠。此功能自 Safari 27 与 Chrome 135 起提供。1
  • 启用方式是 appearance: base-select,需应用两次:一次用在 select 本身以开放按钮样式,一次用在 ::picker(select) 上以退出原生下拉菜单。1
  • 随之而来的还有新的可设计样式部件:::picker-icon 通过 content 属性与 width 重新设计箭头,option 元素上的 ::checkmark 以相同方式替换勾选标记,而 :open 伪类则在菜单打开时为按钮设计样式。1
  • 选项可接受任何形式的内容:图片、视频、表情符号。本场演讲的演示在每个选项中放入一个 SVG 与一个标签,再以 grid-templategap 将整个下拉菜单排成 CSS grid。1
  • <button> 放在 <select> 的第一个子元素位置(这在 HTML 中过去并不允许)可取代内置按钮;其中的 <selectedcontent> 元素会显示所选选项的丰富内容。2
  • 渐进增强是免费附带的:不支持的浏览器会回退到原生弹出菜单,而语义化的 select 元素在任何地方都保有其内置的无障碍能力。1

从 div 杂烩回到语义化 HTML

观看:重新认识 HTML select 元素(WWDC26)

Safari 工程师 Tim 从 2:48 起,将 appearance: base-select 应用到一个摄影师作品集的演示上。

这场演讲的切入点,是 <select> 原本就做得很好的部分。此元素开箱即提供基本无障碍:跨 option 元素的键盘导航,以及稳健的屏幕阅读器行为,全都不需外部库。1在 Apple 平台上,原生呈现是大家熟悉的下拉按钮,并与平台上其他所有控件一致,这让用户拥有一套已知的导航方式。1

问题一直出在设计。把原生控件放到一个精心设计的网站上,它会显得格格不入,怎么也融不进去。在此之前,解法意味着完全舍弃此元素,改用 JavaScript 小部件或一堆 div,再亲手重建无障碍。Customizable select 保留了元素,并把样式设计交到您手上,分为演讲以一个真实摄影师作品集为例所走过的三个阶段:按钮、下拉菜单,最后是超越纯文本的内容。1

设计按钮:base-select、::picker-icon 与 :open

按钮是 select 中您点击以显示菜单的部分,第一步是一行声明:

select {
  appearance: base-select;
}

appearance: base-select 会将原生呈现换成一组较小、可供您修改的基础样式。1效果会通过继承立即显现:演示网站在 body 上设置 font-family: Gill Sans,而 select 按钮现在继承了 body 字体,与旁边的标签相符。1从此处开始,背景、边框与内边距便可像任何其他元素一样调整。

两个新的着力点为按钮收尾。箭头有自己的选择器 ::picker-icon,它接受一个 content 属性以指定替换用的字符,以及一个 width 来设置大小。:open 伪类则在下拉菜单打开时为按钮应用不同样式:

select::picker-icon {
  content: "▼"; /* swap in your own glyph */
  width: 1rem;
}

select:open {
  background: #1d1d1f;
  color: #f5f5f7;
}

select:open::picker-icon {
  color: #f5f5f7; /* arrow matches the text color in the open state */
}

演讲对成果的评语是:只用几行 CSS,就得到一个与网站其余部分相称的 select。1

设计下拉菜单:::picker(select) 与 ::checkmark

菜单本身也带有可设计样式的部件。您通过 select 元素上的 ::picker(select) 来指向下拉菜单本身,并以 option 元素上的 ::checkmark 指向勾选标记。1要退出原生菜单,需要第二次使用 appearance: base-select,这次用在 picker 上:

select::picker(select) {
  appearance: base-select;
  padding: 0.5rem;
  margin-top: 0.25rem;
  border: 1px solid #d2d2d7;
  box-shadow: 0 8px 24px rgb(0 0 0 / 0.12);
}

有了干净的起点,演示以 padding 与 margin 安排间距,再为下拉菜单处理边框与 box-shadow。1要强调当前的选择,用的是既有的 :checked 选择器,而非任何新东西:把勾选的选项加粗,其余的变灰。1

option:checked {
  font-weight: bold;
}

option:not(:checked) {
  color: #6e6e73;
}

option::checkmark {
  content: "✓";
  width: 1rem;
}

::checkmark 的运作方式与 ::picker-icon 完全相同:设置 content 与一个 width,默认的勾选标记就会变成任何符合您设计的字符。1

选项中的丰富内容,以 grid 排版

更大的转变在于 <option> 里头能放什么。演讲说得很明确:任何形式的内容都行,图片、视频、表情符号,随您喜欢。1演示为摄影师最热门的主题打造了一个分类浏览器,每个选项中都有一个 SVG 符号与一个标签:

<select>
  <option value="flowers">
    <img src="flowers.svg" alt="">
    Flowers
  </option>
  <!-- more categories -->
</select>

请留意空白的 alt。Tim 刻意把图片的替代文本留空,否则“Flowers”这个标签会被屏幕阅读器念出两次。1细节虽小,后果却实在:丰富的选项在辅助技术下,能与纯文本选项一样好用。

移除默认勾选标记后,演示改以 checked 选择器与颜色变化来突显所选的选项。1还剩一个问题:符号加标签的选项会让下拉菜单变得很长。解法重用了既有的 CSS,因为 picker 如今是一个普通的样式目标。一个 grid 布局重塑了整个菜单:

select::picker(select) {
  display: grid;
  grid-template: 1fr 1fr / 1fr 1fr 1fr; /* rows / columns */
  gap: 0.5rem;
}

grid-template 定义行数与列数,而 gap 定义 grid 单元格之间的间距,于是下拉菜单便对齐成一个井然有序的分类网格。1演讲以同一主题的精彩之作收尾:一个完全用 customizable select 打造的放射状颜色选择器。1

可替换的按钮与 selectedcontent

分类浏览器还留有一处缺口:SVG 符号活在选项里,但显示当前选择的那个按钮,却只呈现文本。1Customizable select 通过让您替换内置按钮来补上这个缺口,方法是把一个 <button> 元素放在 <select> 的第一个子元素位置。在 select 里放一个按钮,在 HTML 中过去并不允许;如今它接受自定义内容,例如标签,或是专为此用途打造的那个元素。1

WebKit 的 Safari 27 beta 公告为那个元素命了名:<selectedcontent>。把它放进 select 的第一个子按钮中,它就会显示当前所选选项的内容,并可直接设计样式。2

<select>
  <button>
    <selectedcontent></selectedcontent>
  </button>
  <option value="everything">
    <img src="everything.svg" alt="">
    Everything
  </option>
  <!-- more categories -->
</select>

该元素会映现所选选项所属的任何丰富内容,例如演示中“Everything”标签旁的那个 SVG,于是按钮终于展现出与它所打开的菜单相同的视觉语汇。12

渐进增强内置其中

演讲的最后一步,正是各团队一旦略过便会自食其果的那一步:在不支持 customizable select 的浏览器中检查设计。答案以最好的方式平淡无奇。渐进增强随即生效,控件依然可用,而客户会拿到原生弹出菜单。1重用 select 元素意味着回退方案早已存在,而且由于 <select> 是语义化元素,内置的无障碍功能能在每一个浏览器中留存。1

可用性十分具体:Safari 27 与 Chrome 135。要立即试用这些功能,请下载 Safari Technology Preview 或 Safari Beta。1演讲的结尾指引很实际:到 webkit.org 上看看演示,在自己的网站上设计一些简单的东西,在不支持的浏览器中、以及配合辅助工具进行测试,并阅读 WebKit 的最佳实践资料,让界面对每个人都行得通。1

要点总结

给前端开发者: - 在 select 元素上用 appearance: base-select 启用按钮的设计,并在 ::picker(select) 上再次启用下拉菜单;接着像对待任何其他元素一样设计背景、边框、内边距、间距与 box-shadow。1 - 用 ::picker-icon 替换箭头、用 ::checkmark 替换勾选标记,两者皆通过 contentwidth;用 :open 设计打开状态;用既有的 :checked 选择器强调所选项目。1 - 在 <option> 中放入真正的 HTML(图片、视频、表情符号),并用既有的 CSS 重塑菜单,例如一个 grid-templategap 的 grid;用一个内含 <selectedcontent> 的第一子 <button> 取代内置按钮。12

给重视无障碍的团队: - 语义化的 select 在支持与不支持的浏览器中一律保有键盘导航与屏幕阅读器支持,且无需外部库。1 - 当选项同时带有图片与文本标签时,请把图片的替代文本留空,以免屏幕阅读器把标签念两次。1 - 依照演讲本身的检查清单,在发布前以不支持的浏览器、并配合辅助工具进行测试。1

给规划落地的技术负责人: - 把 customizable select 当作渐进增强来看待:Safari 27 与 Chrome 135 获得自定义设计,其余所有人获得原生弹出菜单,且无需 JavaScript 回退方案。1 - 现在就在 Safari Technology Preview 或 Safari Beta 中评估它,并权衡它与当前躺在您 bundle 中的那个下拉菜单库。1

FAQ

什么是 customizable select?

Customizable select 是一组 HTML 与 CSS 的能力,由 Safari 团队在 WWDC 2026 上推出,自 Safari 27 与 Chrome 135 起提供,让既有的 <select> 元素变得完全可自定义。您用 CSS 设计按钮、下拉菜单、箭头与勾选标记,并在选项中放入丰富内容,同时保留元素内置的无障碍能力。1

我该如何启用 customizable select?

在两个地方应用 appearance: base-select:一是 select 元素本身,这会把原生按钮呈现换成一组较小的基础样式;二是 ::picker(select),这会让下拉菜单退出其原生呈现,使您能自由设计样式。1

我可以在 option 元素中放入图片或其他 HTML 吗?

可以。演讲指出您可以在选项中放入任何形式的内容:图片、视频、表情符号。演示在每个选项中使用一个 SVG 与一个文本标签,并把图片的替代文本留空,使屏幕阅读器只念标签一次,再以 grid-templategap 把菜单排成 CSS grid。1

selectedcontent 元素是什么?

<selectedcontent> 是在 select 的按钮中显示当前所选选项丰富内容的元素。Customizable select 允许 <button> 作为 <select> 的第一个子元素,这在 HTML 中过去并不允许;把 <selectedcontent> 放进那个按钮中,会映现所选选项的内容,例如标签旁的一个 SVG,而该元素可直接设计样式。12

在不支持 customizable select 的浏览器中会发生什么?

控件会优雅降级。渐进增强意味着 select 依然完全可用,客户会拿到原生弹出菜单,而且由于 <select> 是语义化元素,内置的无障碍功能依旧保留。演讲建议在发布前以不支持的浏览器并配合辅助工具进行测试。1


Customizable select 删去一个依赖,正如 CSS Grid Lanes 之于 masonry 布局,而这样的搭配是刻意安排的:session 315 本身在结尾就把观众引向 Grid Lanes 那场演讲,而演示网站同时用上了这两项功能。1Apple 持续扩展纯 HTML 元素所能做到的事,这与 Apple 平台上的 HTML model 元素 所谈的是同一条轨迹,而您每少发布一个下拉菜单库,都让 no-build 宣言 的论点更加站得住脚。完整的系列中枢是 Apple Ecosystem Series

参考资料


  1. Apple, WWDC 2026 session 315, Rediscover the HTML select element. Source for the before-state (heavy JavaScript libraries or lots of div elements); availability starting in Safari 27 and Chrome 135, with Safari Technology Preview and Safari Beta for early access; appearance: base-select applied on the select and on ::picker(select); the ::picker-icon and ::checkmark selectors styled via content and width; the :open pseudo-class; the pre-existing :checked selector for emphasizing the selection; arbitrary HTML inside options (images, videos, emojis) with the SVG-plus-label demo and the empty-alt screen-reader detail; the grid layout inside the drop-down via grid-template and gap; the first-child <button> replacing the built-in button (previously not allowed in HTML); the radial color picker demo; the “pull down buttons on Apple platforms” naming; and the progressive-enhancement fallback to the native pop-up. 

  2. WebKit, News from WWDC26: WebKit in Safari 27 beta. Source for the name of the <selectedcontent> element, its placement inside the select’s first-child <button>, and its behavior of displaying the currently selected option’s content while being directly stylable. 

相关文章

CSS Grid Lanes:Safari 中的原生瀑布流布局

CSS Grid Lanes 只需三行 CSS,就为 Safari 26.4 带来原生的瀑布流(masonry)布局,并以 flow-tolerance 旋钮解决了瀑布流长久以来的 Tab 顺序问题。

2 分钟阅读

HTML <model> 元素登陆每一个 Apple 操作系统

HTML model 元素如今可在 iOS、iPadOS 与 macOS 的 Safari 上直接渲染 3D,支持 stagemode、entityTransform、烘焙动画与 AR Quick Look。

3 分钟阅读

无构建宣言:不用打包工具直接发布

FastAPI + HTMX + 纯CSS,零构建工具,Lighthouse满分。真实的生产数据、诚实的取舍分析,以及清晰的边界划定。

1 分钟阅读