← 所有文章

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 分數。真實的生產數據、誠實的取捨,以及清晰的界線。

3 分鐘閱讀