← Todos os Posts

Customizable Select: enfim, estilize o <select> de verdade

Ir além do elemento select padrão sempre significou uma de duas trocas ruins: bibliotecas JavaScript pesadas ou montes de elementos div, com a acessibilidade ficando complicada em ambos os casos.1 Na WWDC 2026, o time do Safari mostrou a saída: customizable select, um conjunto de adições de HTML e CSS que tornam o elemento <select> já existente totalmente estilizável, mantendo a semântica, a navegação por teclado e o suporte a leitores de tela que ele já oferece. A partir do Safari 27 e do Chrome 135, você pode reestilizar o botão, o menu suspenso, a marca de seleção e até a seta, e então colocar imagens, vídeos ou emojis dentro das suas opções.1

TL;DR

  • O customizable select estiliza o elemento <select> de verdade só com HTML e CSS, substituindo as bibliotecas JavaScript e as pilhas de div que os desenvolvedores usavam antes. A disponibilidade começa no Safari 27 e no Chrome 135.1
  • A adesão é via appearance: base-select, aplicada duas vezes: uma no próprio select para liberar a estilização do botão, e outra em ::picker(select) para abrir mão do menu suspenso nativo.1
  • Novas partes estilizáveis chegam junto: ::picker-icon reestiliza a seta pela propriedade content e um width, ::checkmark no elemento option troca o check do mesmo jeito, e a pseudoclasse :open estiliza o botão enquanto o menu está aberto.1
  • As opções aceitam qualquer tipo de conteúdo: imagens, vídeos, emojis. A demo da sessão coloca um SVG e um rótulo dentro de cada opção e então organiza todo o menu suspenso como um grid CSS com grid-template e gap.1
  • Colocar um <button> como primeiro filho de <select>, algo antes não permitido no HTML, substitui o botão embutido; o elemento <selectedcontent> dentro dele exibe o conteúdo rico da opção selecionada.2
  • O aprimoramento progressivo vem de graça: navegadores sem suporte recorrem ao pop-up nativo, e o elemento select semântico mantém sua acessibilidade embutida em todo lugar.1

Da sopa de divs de volta ao HTML semântico

Watch on Apple Developer ↗

Tim, um engenheiro do Safari, aplica appearance: base-select a uma demo de portfólio de fotógrafo a partir de 2:48.

O enquadramento da sessão parte do que o <select> já faz bem. O elemento entrega acessibilidade básica de imediato: navegação por teclado entre os elementos option e comportamento sólido com leitores de tela, tudo sem bibliotecas externas.1 Nas plataformas Apple, a renderização nativa é o conhecido botão suspenso, e ele combina com todos os outros controles da plataforma, o que dá aos usuários uma forma já conhecida de navegar por ele.1

O problema sempre foi o design. Coloque o controle nativo em um site estilizado e ele parece deslocado; recusa-se a se misturar. Até agora, a solução significava abandonar o elemento por completo em favor de um widget JavaScript ou de uma pilha de divs, e reconstruir a acessibilidade na mão. O customizable select mantém o elemento e entrega a estilização a você, em três etapas que a sessão percorre num build real de portfólio de fotógrafo: o botão, o menu suspenso e, por fim, conteúdo que vai além de texto puro.1

Estilizando o botão: base-select, ::picker-icon e :open

O botão é a parte do select em que você clica para mostrar o menu, e o primeiro passo é uma única declaração:

select {
  appearance: base-select;
}

appearance: base-select troca a renderização nativa por um conjunto menor de estilos base que você pode alterar.1 O efeito aparece imediatamente por herança: o site de demo define font-family: Gill Sans no body, e o botão do select agora herda a fonte do body, combinando com o rótulo ao lado.1 A partir daí, fundo, borda e padding se ajustam como em qualquer outro elemento.

Dois novos ganchos finalizam o botão. A seta ganha seu próprio seletor, ::picker-icon, que recebe uma propriedade content para um glifo substituto e um width para dimensioná-lo. A pseudoclasse :open estiliza o botão de forma diferente enquanto o menu suspenso está aberto:

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 */
}

O veredito da sessão sobre o resultado: um select que combina com o resto do site em apenas algumas linhas de CSS.1

Estilizando o menu suspenso: ::picker(select) e ::checkmark

O menu vem com partes estilizáveis próprias. Você endereça o menu suspenso em si com ::picker(select) no elemento select, e o check com ::checkmark no elemento option.1 Abrir mão do menu nativo exige appearance: base-select uma segunda vez, agora no 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);
}

Com a tela limpa pronta, a demo organiza o espaçamento com padding e margin, e então cuida das bordas e de um box-shadow no menu suspenso.1 Para destacar a escolha atual, usa-se o seletor :checked já existente, em vez de algo novo: a opção marcada em negrito, as demais em cinza.1

option:checked {
  font-weight: bold;
}

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

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

::checkmark funciona exatamente como ::picker-icon: defina content e um width, e o check padrão vira qualquer glifo que combine com o seu design.1

Conteúdo rico nas opções, organizado como grid

A mudança maior é o que vai dentro de <option>. A sessão é explícita: qualquer tipo de conteúdo funciona, imagens, vídeos, emojis, o que você quiser.1 A demo monta um navegador de categorias para os temas mais populares do fotógrafo, com um símbolo SVG e um rótulo dentro de cada opção:

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

Repare no alt vazio. Tim deixa o texto alternativo da imagem vazio de propósito, porque, caso contrário, o rótulo “Flowers” seria anunciado duas vezes pelos leitores de tela.1 Detalhe pequeno, consequência real: opções ricas continuam tão usáveis com tecnologia assistiva quanto as simples.

Com a marca de seleção padrão removida, a demo destaca a opção selecionada pelo seletor checked e por mudanças de cor.1 Resta um problema: opções de símbolo e rótulo deixam o menu suspenso muito longo. A correção reutiliza CSS que já existe, porque o picker agora é um alvo de estilização comum. Um layout de grid remodela todo o menu:

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

grid-template define o número de linhas e colunas, enquanto gap define o espaçamento entre as células do grid, e o menu suspenso se encaixa em uma grade organizada de categorias.1 A sessão termina com um floreio no mesmo tema: um seletor de cores radial, construído inteiramente com customizable select.1

O botão substituível e o selectedcontent

Resta uma lacuna no navegador de categorias: os símbolos SVG vivem nas opções, mas o botão que mostra a seleção atual só exibe texto.1 O customizable select fecha a lacuna ao deixar você substituir o botão embutido, colocando um elemento <button> como primeiro filho do <select>. Colocar um botão dentro de um select antes não era permitido no HTML; agora ele aceita conteúdo personalizado, como rótulos, ou como o elemento criado exatamente para esse fim.1

O anúncio do beta do Safari 27 pela WebKit dá nome a esse elemento: <selectedcontent>. Colocado dentro do botão que é o primeiro filho do select, ele exibe o conteúdo da opção atualmente selecionada e pode ser estilizado diretamente.2

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

O elemento espelha qualquer conteúdo rico que pertença à opção selecionada, como o SVG ao lado do rótulo “Everything” na demo, de modo que o botão enfim mostra a mesma linguagem visual do menu que ele abre.12

O aprimoramento progressivo já vem embutido

O último passo da sessão é aquele que os times pulam por sua conta e risco: checar o design em navegadores sem suporte ao customizable select. A resposta é entediante no melhor sentido. O aprimoramento progressivo entra em ação, o controle continua usável, e os clientes recebem o pop-up nativo.1 Reutilizar o elemento select significa que a história do fallback já existe, e como <select> é um elemento semântico, os recursos de acessibilidade embutidos sobrevivem em todo navegador.1

A disponibilidade é concreta: Safari 27 e Chrome 135. Para testar os recursos agora, baixe o Safari Technology Preview ou o Safari Beta.1 A orientação final da sessão é prática: veja a demo no webkit.org, estilize algo simples no seu próprio site, teste em navegadores sem suporte e com ferramentas assistivas, e leia o material de boas práticas da WebKit para que a interface funcione para todo mundo.1

Principais conclusões

Para desenvolvedores front-end: - Faça a adesão com appearance: base-select no elemento select para o botão, e de novo em ::picker(select) para o menu suspenso; depois estilize fundo, borda, padding, espaçamento e box-shadow como em qualquer outro elemento.1 - Troque a seta com ::picker-icon e o check com ::checkmark, ambos via content mais width; estilize o estado aberto com :open; destaque a seleção com o seletor :checked já existente.1 - Coloque HTML de verdade dentro de <option> (imagens, vídeos, emojis) e remodele o menu com CSS existente, como um grid de grid-template mais gap; substitua o botão embutido por um <button> primeiro filho contendo <selectedcontent>.12

Para times atentos à acessibilidade: - O select semântico mantém a navegação por teclado e o suporte a leitores de tela sem bibliotecas externas, tanto em navegadores com suporte quanto sem.1 - Quando as opções carregam tanto uma imagem quanto um rótulo de texto, deixe o texto alternativo da imagem vazio para que os leitores de tela não anunciem o rótulo duas vezes.1 - Teste com navegadores sem suporte e com ferramentas assistivas antes de publicar, conforme o próprio checklist da sessão.1

Para líderes técnicos planejando a adoção: - Trate o customizable select como um aprimoramento progressivo: Safari 27 e Chrome 135 recebem o design personalizado, todos os outros recebem o pop-up nativo, e nenhum fallback em JavaScript é necessário.1 - Avalie-o agora no Safari Technology Preview ou no Safari Beta, e pondere-o frente à biblioteca de menu suspenso que está hoje no seu bundle.1

FAQ

O que é customizable select?

O customizable select é um conjunto de capacidades de HTML e CSS, apresentado pelo time do Safari na WWDC 2026 e disponível a partir do Safari 27 e do Chrome 135, que torna o elemento <select> já existente totalmente personalizável. Você estiliza o botão, o menu suspenso, a seta e a marca de seleção com CSS, e coloca conteúdo rico dentro das opções, mantendo a acessibilidade embutida do elemento.1

Como faço a adesão ao customizable select?

Aplique appearance: base-select em dois lugares: no próprio elemento select, o que substitui a renderização nativa do botão por um conjunto menor de estilos base, e em ::picker(select), o que faz o menu suspenso abrir mão da sua renderização nativa para que você possa estilizá-lo à vontade.1

Posso colocar imagens ou outro HTML dentro de elementos option?

Sim. A sessão afirma que você pode colocar qualquer tipo de conteúdo dentro das opções: imagens, vídeos, emojis. A demo usa um SVG e um rótulo de texto por opção, com o texto alternativo da imagem vazio para que os leitores de tela anunciem o rótulo apenas uma vez, e organiza o menu como um grid CSS usando grid-template e gap.1

O que é o elemento selectedcontent?

<selectedcontent> é o elemento que exibe o conteúdo rico da opção atualmente selecionada dentro do botão do select. O customizable select permite um <button> como primeiro filho de <select>, o que antes não era permitido no HTML; colocar <selectedcontent> dentro desse botão espelha o conteúdo da opção selecionada, como um SVG ao lado de seu rótulo, e o elemento pode ser estilizado diretamente.12

O que acontece em navegadores sem suporte ao customizable select?

O controle degrada com elegância. O aprimoramento progressivo significa que o select continua totalmente usável e os clientes recebem o pop-up nativo, e como <select> é um elemento semântico, os recursos de acessibilidade embutidos permanecem. A sessão recomenda testar em navegadores sem suporte e com ferramentas assistivas antes de publicar.1


O customizable select apaga uma dependência do mesmo jeito que o CSS Grid Lanes faz com layouts masonry, e a dupla é proposital: a própria sessão 315 encerra apontando os espectadores para a sessão de Grid Lanes, e o site de demo usa os dois recursos juntos.1 A Apple segue ampliando o que elementos HTML simples podem fazer, a mesma trajetória abordada em o elemento HTML model nas plataformas Apple, e cada biblioteca de menu suspenso que você deixa de entregar reforça o argumento do manifesto no-build. O hub completo da série é a Apple Ecosystem Series.

Referências


  1. Apple, WWDC 2026 session 315, Rediscover the HTML select element. Fonte para o estado anterior (bibliotecas JavaScript pesadas ou montes de elementos div); disponibilidade a partir do Safari 27 e do Chrome 135, com Safari Technology Preview e Safari Beta para acesso antecipado; appearance: base-select aplicado no select e em ::picker(select); os seletores ::picker-icon e ::checkmark estilizados via content e width; a pseudoclasse :open; o seletor :checked já existente para destacar a seleção; HTML arbitrário dentro das opções (imagens, vídeos, emojis) com a demo de SVG mais rótulo e o detalhe do alt vazio para leitores de tela; o layout em grid dentro do menu suspenso via grid-template e gap; o <button> primeiro filho substituindo o botão embutido (antes não permitido no HTML); a demo do seletor de cores radial; a nomenclatura “pull down buttons nas plataformas Apple”; e o fallback de aprimoramento progressivo para o pop-up nativo. 

  2. WebKit, News from WWDC26: WebKit in Safari 27 beta. Fonte para o nome do elemento <selectedcontent>, sua colocação dentro do <button> primeiro filho do select, e seu comportamento de exibir o conteúdo da opção atualmente selecionada enquanto é estilizável diretamente. 

  3. MDN Web Docs, appearance. Fonte para o valor de especificação appearance: base

  4. Parafraseado de uma gravação transcrita localmente do WWDC 2026 Safari & Web Technologies Group Lab; as legendas oficiais eram parciais. Apple, WWDC 2026, Safari & Web Technologies Group Lab. Fonte para as declarações de roadmap sobre appearance: base (“não está sendo lançado agora”, virá depois, discussão da especificação ainda em aberto com discordância ao vivo sobre como deveria ser a base sem estilo) e suas metas de design declaradas (herdar ao máximo dos estilos da página, sem mágica de layout, renderização base idêntica e estrutura de DOM idêntica entre os engines); a história de que a proposta original era um novo elemento <selectmenu> antes de um engenheiro de padrões da WebKit defender reaproveitar o <select> para que navegadores sem suporte mantenham o fallback nativo; e a regra de que as opções devem manter conteúdo de texto porque opções apenas com ícone renderizam um pop-up nativo em branco em navegadores sem suporte. 

Artigos relacionados

CSS Grid Lanes: masonry nativo no Safari

O CSS Grid Lanes traz o layout masonry nativo para o Safari 26.4 em três linhas de CSS, com um controle de flow-toleranc…

9 min de leitura

O elemento HTML <model> chega a todos os sistemas operacionais da Apple

O elemento HTML model agora renderiza 3D pronto para usar no Safari em iOS, iPadOS e macOS, com stagemode, entityTransfo…

11 min de leitura

O Manifesto No-Build: Publicando Sem um Bundler

FastAPI + HTMX + CSS puro com zero ferramentas de build e pontuações perfeitas no Lighthouse. Números reais de produção,…

9 min de leitura