A maior parte da interface gerada pelo navegador pode ser personalizada até certo ponto usando CSS. Mesmo que exija recursos modernos, ele se degrada de forma otimizada em navegadores mais antigos e, portanto, geralmente não requer um polyfill ou substituto.
Antes de recriar a interface do navegador (controles de formulário, barras de rolagem, seleções, mensagens de erro etc.), verifique se:
- a interface do navegador não pode ser personalizada o suficiente para suas necessidades, mesmo com CSS moderno;
- a personalização desejada é suficientemente crítica para justificar as compensações de recriar a interface integrada, principalmente a perda de semântica acessível, processamento de teclado, IME e integração de TA que a interface nativa oferece sem custo financeiro.
Exemplos de personalizações possíveis:
- Use
::selectionpara personalizar as cores do texto destacado. - NÃO aplique
user-select: noneao texto do conteúdo. Isso interrompe as ferramentas de copiar e colar, de tradução e os gestos de "ler daqui" da TA. Limite-o ao chrome (alças de arrastar, barras de ferramentas, rótulos de botão redundantes). - Use
accent-colorpara aplicar a cor de destaque da página a qualquer interface gerada pelo navegador. - Use
color-schemepara que a interface do navegador se adapte ao modo claro/escuro. - Use
scrollbar-colorpara personalizar as cores da barra de rolagem escrollbar-widthpara controlar a espessura dela. Mantenha o controle deslizante visivelmente diferente da faixa (≥3:1) e não definascrollbar-width: noneem regiões roláveis (use apenas quando a rolagem for totalmente substituída por outra funcionalidade). - Use
:user-invalid/:user-validpara estilizar a validade, não:invalid/:valid. Eles só correspondem depois que o usuário interage com o campo, evitando o padrão hostil de sinalizar campos obrigatórios vazios como erros no carregamento de página. Exclua os controles deslizantes de intervalo ao segmentarinputde forma ampla (por exemplo,input:not(input[type="range"]):user-valid) para que o ajuste de um controle deslizante não aplique bordas ou planos de fundo de validade de campo a ele. - Os botões e campos de texto (incluindo
<textarea>) geralmente podem ser estilizados como elementos normais. - Use
font-sizepara dimensionar e outras propriedades textuais para controlar a tipografia
Como estilizar campos de texto (<input> e <textarea>)
Para a maioria das finalidades de estilo (por exemplo, cores, bordas, planos de fundo, tipografia etc.), trate esses elementos como contêineres de texto normais.
- Use
:placeholder-showne::placeholderpara estilizar marcadores de posição de entrada. - Use
field-sizing: contentpara ajustar o tamanho dos campos de texto ao conteúdo. - Para elementos
<textarea>, useresize: verticalpara desativar o redimensionamento horizontal ouresize: nonepara desativar todo o redimensionamento.
Controles de múltipla escolha (seleção, botões de opção, caixas de seleção)
- Para selecionar uma entre várias opções apresentadas em um menu suspenso: use
<select>+appearance: base-select+::picker(select). Para mais informações, consulte Estilo de marca selecionado. - Selecionar uma ou mais opções entre várias dispostas em linha na página: use um
<input type=checkbox>ou<input type=radio>dentro de um<label>para cada opção. Estilo vialabel:has(:checked). - Estilize caixas de seleção, botões de opção e interruptores usando
appearance: none+ conteúdo gerado (::before/::after) ou imagens de plano de fundo para desenhar o estado marcado.
<input>s não textuais (botões, controles deslizantes, entradas de arquivo etc.)
- Entradas de arquivo: use
::file-selector-buttonpara estilizar o botão. - Não use
<input>com umtypedebutton,submitoureset. Use<button>e estilize-o como um elemento normal. - Controles deslizantes: use
appearance: none+ pseudoelementos de miniatura (::-webkit-slider-thumb,::-moz-range-thumbetc.) e pseudoelementos de faixa (::-webkit-slider-runnable-track,::-moz-range-tracketc.) para um controle mais granular.