Existe uma maneira apenas de CSS de estilizar um <select>
menu suspenso?
Preciso estilizar um <select>
formulário da forma mais humanamente possível, sem nenhum JavaScript. Quais são as propriedades que posso usar para fazer isso em CSS?
Esse código precisa ser compatível com todos os principais navegadores:
- Internet Explorer 6, 7 e 8
- Raposa de fogo
- Safári
Eu sei que posso fazê-lo com JavaScript: exemplo .
E não estou falando de estilo simples. Quero saber o melhor que podemos fazer apenas com CSS.
Encontrei perguntas semelhantes no Stack Overflow.
E esse aqui no Doctype.com.
Respostas:
Aqui estão três soluções:
Solução # 1 - aparência: nenhuma - com solução alternativa para o Internet Explorer 10 - 11 ( demonstração )
-
Para ocultar a seta padrão definida
appearance: none
no elemento de seleção, adicione sua própria seta personalizada combackground-image
Suporte do navegador:
appearance: none
tem um suporte muito bom ao navegador ( caniuse ) - exceto o Internet Explorer 11 (e posterior) e Firefox 34 (e posterior).Podemos melhorar essa técnica e adicionar suporte ao Internet Explorer 10 e Internet Explorer 11 adicionando
Se o Internet Explorer 9 for uma preocupação, não temos como remover a seta padrão (o que significaria que agora teríamos duas setas), mas poderíamos usar um seletor do Internet Explorer 9.
Para desfazer pelo menos nossa seta personalizada - deixando a seta de seleção padrão intacta.
Todos juntos:
Mostrar snippet de código
Essa solução é fácil e possui um bom suporte ao navegador - geralmente deve ser suficiente.
Se o suporte ao navegador do Internet Explorer 9 (e posterior) e Firefox 34 (e posterior) for necessário, continue lendo ...
Solução # 2 Trunque o elemento de seleção para ocultar a seta padrão ( demo )
-
(Leia mais aqui)
Enrole o
select
elemento em uma div com uma largura fixa eoverflow:hidden
.Em seguida, dê ao
select
elemento uma largura de cerca de 20 pixels maior que a div .O resultado é que a seta suspensa padrão do
select
elemento ficará oculta (devido aooverflow:hidden
contêiner) e você pode colocar qualquer imagem de plano de fundo desejada no lado direito da div.A vantagem dessa abordagem é que ela é entre navegadores (Internet Explorer 8 e posterior, WebKit e Gecko ). No entanto, a desvantagem dessa abordagem é que o menu suspenso de opções se projeta no lado direito (pelos 20 pixels que ocultamos ... porque os elementos de opção assumem a largura do elemento de seleção).
[No entanto, deve ser observado que, se o elemento de seleção personalizado for necessário apenas para dispositivos móveis - o problema acima não se aplica - devido à maneira como cada telefone abre nativamente o elemento de seleção. Portanto, para dispositivos móveis, essa pode ser a melhor solução.]
Mostrar snippet de código
Se a seta personalizada for necessária no Firefox - anterior à versão 35 - mas você não precisar oferecer suporte a versões antigas do Internet Explorer - continue lendo ...
Solução # 3 - Use a
pointer-events
propriedade ( demo )-
(Leia mais aqui)
A idéia aqui é sobrepor um elemento sobre a seta suspensa nativa (para criar uma personalizada) e, em seguida, não permitir eventos de ponteiro nele.
Vantagem: Funciona bem no WebKit e Gecko. Parece bom também (sem
option
elementos salientes ).Desvantagem: o Internet Explorer (Internet Explorer 10 e inferior) não suporta
pointer-events
, o que significa que você não pode clicar na seta personalizada. Além disso, outra desvantagem (óbvia) desse método é que você não pode segmentar sua nova imagem de seta com um efeito de foco ou cursor de mão, porque acabamos de desativar os eventos de ponteiro neles!No entanto, com esse método, você pode usar o Modernizer ou comentários condicionais para fazer o Internet Explorer reverter para a seta incorporada padrão.
NB: Como o Internet Explorer 10 não suporta
conditional comments
mais: se você deseja usar essa abordagem, provavelmente deve usar o Modernizr . No entanto, ainda é possível excluir o CSS de eventos do ponteiro do Internet Explorer 10 com um hack de CSS descrito aqui .Mostrar snippet de código
fonte
É possível, mas infelizmente principalmente nos navegadores baseados no WebKit, na medida em que, como desenvolvedores, exigimos. Aqui está o exemplo de estilo CSS reunido no painel de opções do Chrome por meio do inspetor de ferramentas de desenvolvedor integrado, aprimorado para corresponder às propriedades CSS atualmente suportadas nos navegadores mais modernos:
Quando você executa esse código em qualquer página de um navegador baseado no WebKit, ele deve alterar a aparência da caixa de seleção, remover a seta padrão do SO e adicionar uma seta PNG, colocar algum espaçamento antes e depois do rótulo, quase o que você desejar.
A parte mais importante é a
appearance
propriedade, que altera a forma como o elemento se comporta.Funciona perfeitamente em quase todos os navegadores baseados no WebKit, incluindo os móveis, embora o Gecko não suporte
appearance
tão bem quanto o WebKit, ao que parece.fonte
text-indent: 0.01px; text-overflow: "";
ele vai trabalhar ainda melhorO elemento de seleção e seu recurso suspenso são difíceis de estilizar.
Os atributos de estilo para o elemento select de Chris Heilmann confirmam o que Ryan Dohery disse em um comentário à primeira resposta:
fonte
Eu tive esse problema exato, exceto que não podia usar imagens e não estava limitado pelo suporte ao navegador. Isso deve estar "sob especificação" e, com sorte, começar a trabalhar em qualquer lugar eventualmente .
Ele usa camadas de fundo giradas em camadas para "cortar" uma seta suspensa, pois os pseudoelementos não funcionariam para o elemento selecionado.
Edit: Nesta versão atualizada, estou usando variáveis CSS e um pequeno sistema de temas.
fonte
-moz-appearance: none;
A maior inconsistência que eu notei ao estilizar as listas suspensas é a renderização Safari e Google Chrome (o Firefox é totalmente personalizável por meio de CSS). Após algumas pesquisas nas profundezas obscuras da Internet, deparei-me com o seguinte, que quase resolve completamente minhas dúvidas com o WebKit:
Correção do Safari e do Google Chrome :
No entanto, isso remove a seta suspensa. Você pode adicionar uma seta suspensa usando uma área próxima
div
com fundo, margem negativa ou absolutamente posicionada sobre a lista suspensa selecionada.* Mais informações e outras variáveis estão disponíveis na propriedade CSS: -webkit-aparecimento .
fonte
<select>
as tags podem ser estilizadas por meio de CSS, como qualquer outro elemento HTML em uma página HTML renderizada em um navegador. Abaixo está um exemplo (excessivamente simples) que posicionará um elemento de seleção na página e renderizará o texto das opções em azul.Exemplo de arquivo HTML (selectExample.html):
Exemplo de arquivo CSS (selectExample.css):
fonte
A postagem do blog Como o estilo suspenso do formulário CSS, nenhum JavaScript funciona para mim, mas falha no Opera :
fonte
Aqui está uma versão que funciona em todos os navegadores modernos. Está usando a chave
appearance:none
que remove a formatação padrão. Como toda a formatação se foi, é necessário adicionar novamente a seta que diferencia visualmente a seleção da entrada.Exemplo de trabalho: https://jsfiddle.net/gs2q1c7p/
fonte
Eu cheguei ao seu caso usando o Bootstrap . Esta é a solução mais simples que funciona:
Nota: o material base64 está
fa-chevron-down
em SVG.fonte
Nos navegadores modernos, é relativamente simples estilizar o
<select>
CSS. Comappearance: none
a única parte complicada é substituir a seta (se é isso que você deseja). Aqui está uma solução que usa umdata:
URI embutido com SVG em texto sem formatação:O restante do estilo (bordas, preenchimento, cores etc.) é bastante direto.
Isso funciona em todos os navegadores que acabei de experimentar (Firefox 50, Chrome 55, Edge 38 e Safari 10). Uma observação sobre o Firefox é que, se você deseja usar o
#
caractere no URI de dados (por exemplofill: #000
), precisa escapar dele (fill: %23000
).fonte
height
e / ouwidth
na<svg>
tag, em vez da propriedade CSSbackground-size
.fonte
Estilos CSS selecionados personalizados
Testado no Internet Explorer (10 e 11), Edge, Firefox e Chrome
fonte
background-position: right 15px center, right 10px center;
Use a
clip
propriedade para cortar as bordas e a seta doselect
elemento e adicione seus próprios estilos de substituição ao wrapper:Use uma segunda seleção com opacidade zero para tornar o botão clicável:
As coordenadas diferem entre o Webkit e outros navegadores, mas uma consulta @media pode cobrir isso.
Referências
fonte
Um exemplo muito bom que usa
:after
e:before
faz o truque está em Styling Select Box with CSS3 | CSSDeckfonte
Editar este elemento não é recomendado, mas se você quiser tentar, é como qualquer outro elemento HTML.
Editar exemplo:
fonte
Isso usa uma cor de fundo para selecionar elementos e eu removi a imagem.
fonte
Sim. Você pode estilizar qualquer elemento HTML pelo nome da tag, assim:
Obviamente, você também pode usar uma classe CSS para estilizá-la, como qualquer outro elemento:
fonte
Aqui está uma solução baseada nas minhas idéias favoritas desta discussão. Isso permite estilizar um elemento <select> diretamente sem nenhuma marcação adicional.
Ele funciona no Internet Explorer 10 (e posterior) com um fallback seguro para o Internet Explorer 8/9. Uma ressalva para esses navegadores é que a imagem de plano de fundo deve ser posicionada e ser pequena o suficiente para se esconder atrás do controle de expansão nativo.
HTML
SCSS
CodePen
http://codepen.io/ralgh/pen/gpgbGx
fonte
No Internet Explorer 10, você pode usar o
::-ms-expand
seletor de pseudoelementos para estilizar e ocultar o elemento da seta suspensa.O estilo restante deve ser semelhante a outros navegadores.
Aqui está uma bifurcação básica do jsfiddle de Danield que aplica suporte ao IE10
fonte
Existe uma maneira fácil.
Verifique este violino e perdoe-me o excesso de estilos: https://jsfiddle.net/dkellner/7ac9us70/
O truque por trás: assim que a tag <select> obtiver uma propriedade chamada "size", ela se comportará como uma lista de altura fixa e, de repente, por algum motivo, permitirá que você a impeça. Agora, estritamente falando, a lista fixa é um efeito colateral - mas apenas nos ajuda mais porque a usamos para a "aparência suspensa".
Um exemplo mínimo:
(para simplificar, eu fiz isso com o jQuery - mas você pode fazer o mesmo sem ele)
Notas laterais
Esta solução oferece mais do que apenas uma seleção: o valor também é editável manualmente. Use a propriedade readonly se você preferir a maneira restrita à seleção padrão.
Para maximizar as possibilidades de estilo, as tags <optgroup> não estão próximas dos filhos, elas são movidas antes deles. É intencional, visualmente mais claro e eles ficam felizes em trabalhar assim, não se preocupe.
Javascripts: sim, eu sei que o OP disse "sem Javascript", mas entendi como não se preocupe com plugins , o que é bom. Você não precisa de bibliotecas para esta. Nem o jQuery, como eu disse, é apenas pela clareza do exemplo.
fonte
Você definitivamente deve fazê-lo como em Styling select, optgroup e options with CSS . De várias maneiras, cor de plano de fundo e cor são exatamente o que você normalmente precisa para estilizar as opções, não a seleção inteira.
fonte
Você também pode adicionar um estilo de foco instantâneo ao menu suspenso.
fonte
O terceiro método na resposta de Danield pode ser aprimorado para trabalhar com efeitos de foco e outros eventos de mouse. Apenas certifique-se de que o elemento "botão" venha logo após o elemento de seleção na marcação. Em seguida, direcione-o usando o seletor + CSS:
HTML:
CSS:
No entanto, isso mostrará o efeito de foco ao passar o mouse sobre qualquer lugar sobre o elemento de seleção, não apenas sobre o "botão".
Estou usando esse método em combinação com Angular (desde que meu projeto seja um aplicativo Angular de qualquer maneira), para cobrir todo o elemento select e permitir que o Angular exiba o texto da opção selecionada no elemento "button". Nesse caso, faz todo o sentido que o efeito de passar o mouse se aplique ao passar o mouse em qualquer lugar sobre a seleção.
Porém, ele não funciona sem JavaScript; portanto, se você quiser fazer isso, e seu site precisar funcionar sem JavaScript, verifique se o script adiciona os elementos e classes necessários para o aprimoramento. Dessa forma, um navegador sem JavaScript simplesmente obterá uma seleção normal, sem estilo, em vez de um emblema estilizado que não é atualizado corretamente.
fonte
Uma solução apenas CSS e HTML
Parece compatível com Chrome, Firefox e Internet Explorer 11. Mas, por favor, deixe seus comentários sobre outros navegadores da web.
Conforme sugerido pela resposta de Danield, envolvo meu select em uma div (até duas divs para compatibilidade com o navegador x) para obter o comportamento esperado.
Veja http://jsfiddle.net/bjap2/
HTML:
Observe os dois wrappers div.
Observe também a div extra adicionada para colocar o botão de seta para baixo onde quiser (posicionado absolutamente), aqui o colocamos à esquerda.
CSS
fonte