← Todos os Posts

Select customizável: finalmente dá para estilizar o <select> de verdade

Ir além do elemento select padrão sempre significou escolher entre duas alternativas ruins: bibliotecas JavaScript pesadas ou um monte de elementos div — e, dos dois lados, a acessibilidade complica.1 Na WWDC 2026, o time do Safari mostrou a saída: o select customizável, um conjunto de adições ao HTML e ao CSS que torna o já existente elemento <select> totalmente estilizável sem abrir mão da semântica, da navegação por teclado e do 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 depois colocar imagens, vídeos ou emojis dentro das suas options.1

Resumo

  • O select customizável estiliza o elemento <select> de verdade apenas com HTML e CSS, substituindo as bibliotecas JavaScript e as pilhas de div a que os desenvolvedores recorriam antes. A disponibilidade começa no Safari 27 e no Chrome 135.1
  • A ativação é feita com appearance: base-select, aplicado 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 vêm junto: ::picker-icon reestiliza a seta pela propriedade content e por um width, ::checkmark no elemento option troca a marca de seleção do mesmo jeito, e a pseudo-classe :open estiliza o botão enquanto o menu está aberto.1
  • As options aceitam qualquer tipo de conteúdo: imagens, vídeos, emojis. A demonstração da sessão coloca um SVG e um rótulo dentro de cada option e depois distribui o menu suspenso inteiro como um grid CSS, com grid-template e gap.1
  • Colocar um <button> como primeiro filho de <select>, o que antes não era permitido em HTML, substitui o botão embutido; o elemento <selectedcontent> dentro dele exibe o conteúdo rico da option selecionada.2
  • O aprimoramento progressivo vem de graça: navegadores sem suporte caem no pop-up nativo, e o elemento select semântico mantém a acessibilidade embutida em qualquer lugar.1

Da sopa de divs de volta ao HTML semântico

Watch on Apple Developer ↗

Tim, engenheiro do Safari, aplica appearance: base-select a uma demonstração de portfólio de fotografia a partir de 2:48.

A 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 um comportamento sólido com leitores de tela, tudo sem bibliotecas externas.1 Nas plataformas da Apple, a renderização nativa é o familiar pull down button, que combina com todos os outros controles do sistema e dá ao usuário uma forma já conhecida de navegar.1

O problema sempre foi o design. Jogue o controle nativo dentro de um site estilizado e ele destoa; simplesmente não se integra. Até agora, a solução passava por abandonar o elemento de vez em favor de um widget JavaScript ou de uma pilha de divs, e reconstruir a acessibilidade na mão. O select customizável mantém o elemento e entrega a estilização para você, em três etapas que a sessão percorre em cima de um portfólio de fotografia real: o botão, o menu suspenso e, por fim, conteúdo que vai além do 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 exibir 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 na hora, por herança: o site de demonstração define font-family: Gill Sans no body, e o botão do select passa a herdar a fonte do body, ficando igual ao rótulo ao lado.1 Daí em diante, background, border e padding se ajustam como em qualquer outro elemento.

Dois novos ganchos fecham o botão. A seta ganha um seletor próprio, ::picker-icon, que aceita uma propriedade content para o glifo substituto e um width para dimensioná-lo. A pseudo-classe :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 combinando com o restante do site em poucas linhas de CSS.1

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

O menu traz partes estilizáveis próprias. Você endereça o menu suspenso em si com ::picker(select) no elemento select, e a marca de seleção 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 o terreno limpo, a demonstração organiza o espaçamento com padding e margin, e em seguida cuida das bordas e de um box-shadow no menu suspenso.1 Para destacar a escolha atual, entra o seletor :checked, que já existia, em vez de qualquer novidade: a option marcada fica em negrito, as outras ficam 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 a marca de seleção padrão vira o glifo que combinar com o seu design.1

Conteúdo rico nas options, distribuído como um grid

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

<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 em branco de propósito, porque senão o rótulo “Flowers” seria anunciado duas vezes nos leitores de tela.1 Detalhe pequeno, consequência real: options com conteúdo rico continuam tão utilizáveis com tecnologia assistiva quanto as simples.

Sem a marca de seleção padrão, a demonstração destaca a option selecionada pelo seletor :checked e por mudanças de cor.1 Resta um problema: options com símbolo e rótulo deixam o menu suspenso comprido demais. A correção reaproveita CSS que já existe, porque agora o picker é um alvo comum de estilização. Um layout em grid remodela o menu inteiro:

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, e o menu suspenso se encaixa num grid organizado de categorias.1 A sessão termina com um floreio sobre o mesmo tema: um seletor de cores radial, construído inteiramente com select customizável.1

O botão substituível e o selectedcontent

Falta uma peça no explorador de categorias: os símbolos SVG vivem nas options, mas o botão que mostra a seleção atual exibe apenas texto.1 O select customizável resolve isso permitindo que você substitua o botão embutido, colocando um elemento <button> como primeiro filho do <select>. Colocar um botão dentro de um select não era permitido em HTML até então; agora ele aceita conteúdo customizado, como rótulos, ou como o elemento criado exatamente para essa função.1

O anúncio do beta do Safari 27 no WebKit dá nome a esse elemento: <selectedcontent>. Colocado dentro do botão que é primeiro filho do select, ele exibe o conteúdo da option selecionada no momento 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 à option selecionada — como o SVG ao lado do rótulo “Everything” na demonstração —, de modo que o botão finalmente fala a mesma linguagem visual do menu que ele abre.12

O aprimoramento progressivo já vem embutido

A última etapa da sessão é aquela que os times pulam por conta e risco: conferir o design em navegadores sem suporte ao select customizável. A resposta é do melhor tipo possível — sem graça. O aprimoramento progressivo entra em ação, o controle continua utilizável e o cliente recebe o pop-up nativo.1 Reaproveitar o elemento select significa que a história do fallback já está pronta, e como <select> é um elemento semântico, os recursos de acessibilidade embutidos sobrevivem em qualquer 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 recomendação final da sessão é prática: veja a demonstração 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 do WebKit para que a interface funcione para todo mundo.1

O que o time do Safari acrescentou nos labs

Alguns pontos dos labs da WWDC completam o quadro, principalmente sobre para onde o select customizável está indo.

O item do roadmap a acompanhar é appearance: base, a mesma ativação, agora generalizada para todos os controles de formulário, não só o <select>. O valor existe na especificação do CSS, mas ainda não foi lançado em lugar nenhum.3 No lab, o painel disse que ele “não está sendo lançado agora” e viria depois, e que a discussão na especificação segue abertamente indefinida — os participantes discordaram ao vivo sobre qual deveria ser a aparência do base sem estilização.4 Os objetivos de design declarados são claros o bastante: herdar ao máximo dos estilos da página, nada de mágica de layout, e renderização base idêntica e estrutura de DOM idêntica entre os motores dos navegadores.4

O histórico explica por que o select customizável reaproveita o <select>. A proposta original era um elemento totalmente novo, <selectmenu>. Um engenheiro de padrões do WebKit defendeu reaproveitar o <select> no lugar, para que navegadores sem suporte mantivessem o fallback nativo de graça — exatamente a história de aprimoramento progressivo descrita acima.4

Uma regra inegociável saiu do painel: sempre mantenha conteúdo de texto nas suas options. Options só com ícone renderizam um pop-up nativo em branco em navegadores sem suporte, o que deixa esses usuários na mão.4

Pontos principais

Para desenvolvedores frontend: - Ative com appearance: base-select no elemento select para o botão, e de novo em ::picker(select) para o menu suspenso; depois estilize background, border, padding, espaçamento e box-shadow como em qualquer outro elemento.1 - Troque a seta com ::picker-icon e a marca de seleção com ::checkmark, ambas via content mais width; estilize o estado aberto com :open; destaque a seleção com o seletor :checked, que já existia.1 - Coloque HTML de verdade dentro do <option> (imagens, vídeos, emojis) e remodele o menu com CSS já existente, como um grid feito 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 navegação por teclado e suporte a leitores de tela sem bibliotecas externas, tanto em navegadores compatíveis quanto nos incompatíveis.1 - Quando a option tiver imagem e 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 em navegadores sem suporte e com ferramentas assistivas antes de publicar, seguindo o próprio checklist da sessão.1

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

Perguntas frequentes

O que é o select customizável?

O select customizável é 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 já existente elemento <select> totalmente customizá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 options, sem perder a acessibilidade embutida do elemento.1

Como faço para ativar o select customizável?

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 renderização nativa para que você possa estilizá-lo livremente.1

Posso colocar imagens ou outro HTML dentro dos elementos option?

Sim. A sessão afirma que você pode colocar qualquer tipo de conteúdo dentro das options: imagens, vídeos, emojis. A demonstração usa um SVG e um rótulo de texto por option, com o texto alternativo da imagem vazio para que os leitores de tela anunciem o rótulo apenas uma vez, e distribui 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 option selecionada no momento dentro do botão do select. O select customizável permite um <button> como primeiro filho de <select>, algo que não era permitido em HTML até então; colocar <selectedcontent> dentro desse botão espelha o conteúdo da option selecionada, como um SVG ao lado do seu rótulo, e o elemento pode ser estilizado diretamente.12

O que acontece em navegadores que não suportam o select customizável?

O controle degrada com elegância. O aprimoramento progressivo faz com que o select continue plenamente utilizável e o cliente receba 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 select customizável elimina uma dependência do mesmo jeito que as faixas do Grid no CSS fazem com layouts masonry, e a dupla não é acidental: a própria sessão 315 se encerra apontando os espectadores para a sessão sobre as faixas do Grid, e o site de demonstração usa os dois recursos juntos.1 A Apple continua ampliando o que elementos HTML comuns conseguem fazer — a mesma trajetória tratada em o elemento model do HTML nas plataformas da Apple —, e cada biblioteca de menu suspenso que você deixa de embarcar reforça o argumento do manifesto no-build. O hub completo da série é a Série Ecossistema Apple.

Referências


  1. Apple, sessão 315 da WWDC 2026, Rediscover the HTML select element. Fonte para o estado anterior (bibliotecas JavaScript pesadas ou muitos elementos div); a 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 pseudo-classe :open; o já existente seletor :checked para destacar a seleção; HTML arbitrário dentro das options (imagens, vídeos, emojis), com a demonstração 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 (algo antes não permitido em HTML); a demonstração do seletor de cores radial; a nomenclatura “pull down buttons on Apple platforms”; 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 option selecionada no momento, podendo ser estilizado diretamente. 

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

  4. Parafraseado de uma gravação transcrita localmente do Safari & Web Technologies Group Lab da WWDC 2026; as legendas oficiais estavam incompletas. Apple, WWDC 2026, Safari & Web Technologies Group Lab. Fonte para as declarações do roadmap sobre appearance: base (“não está sendo lançado agora”, viria depois, discussão da especificação ainda indefinida com discordância ao vivo sobre o base sem estilização) e seus objetivos de design declarados (herdar ao máximo dos estilos da página, nada de mágica de layout, renderização base idêntica e estrutura de DOM idêntica entre os motores dos navegadores); o histórico de que a proposta original era um novo elemento <selectmenu> antes de um engenheiro de padrões do WebKit defender o reaproveitamento do <select> para que navegadores sem suporte mantenham o fallback nativo; e a regra de que as options precisam manter conteúdo de texto, porque options só com ícone renderizam um pop-up nativo em branco em navegadores sem suporte. 

Artigos relacionados

Por que o Safari 27 entrega 525 correções: notas do laboratório do WebKit

O laboratório do Safari na WWDC 2026 sobre como o WebKit decide o que construir: 525 correções, novo carregador de módul…

10 min de leitura

CSS Grid Lanes: masonry nativo no Safari

CSS Grid Lanes traz masonry nativo ao Safari 26.4 em três linhas de CSS, e o controle flow-tolerance resolve o velho pro…

9 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