Estou usando espaços reservados para entradas de texto que estão funcionando bem. Mas eu gostaria de usar um espaço reservado para minhas caixas de seleção também. Claro que posso apenas usar este código:
<select>
<option value="">Select your option</option>
<option value="hurr">Durr</option>
</select>
Mas a opção "Selecione sua opção" está em preto em vez de cinza claro. Portanto, minha solução pode ser baseada em CSS. jQuery também está bem.
Isso só torna a opção cinza no menu suspenso (então, depois de clicar na seta):
option:first {
color: #999;
}
A pergunta é: como as pessoas criam espaços reservados nas caixas de seleção? Mas já foi respondido, aplausos.
E usar isso resulta no valor selecionado sempre em cinza (mesmo depois de selecionar uma opção real):
select {
color: #999;
}
html
css
html-select
placeholder
Thomas
fonte
fonte
Respostas:
Uma resposta não CSS - sem JavaScript / jQuery:
fonte
<select> <option value="" disabled selected>Select your option</option> </select>
Eu me deparei com essa pergunta, e aqui está o que funciona no Firefox e Chrome (pelo menos):
A opção Desativado interrompe a
<option>
seleção com o mouse e o teclado, enquanto o simples uso'display:none'
permite ao usuário ainda selecionar através das setas do teclado. O'display:none'
estilo apenas faz a caixa de listagem parecer 'legal'.Nota: O uso de um
value
atributo vazio na opção "espaço reservado" permite que a validação (atributo obrigatório) contenha o "espaço reservado"; portanto, se a opção não for alterada, mas necessária, o navegador deverá solicitar ao usuário que escolha uma opção da lista.Atualização (julho de 2015):
Este método é confirmado trabalhando nos seguintes navegadores:
Atualização (outubro de 2015):
Eu removi o
style="display: none"
favor do atributo HTML5,hidden
que tem amplo suporte. Ohidden
elemento possui características semelhantes àsdisplay: none
do Safari, Internet Explorer, (o Project Spartan precisa de verificação), ondeoption
é visível no menu suspenso, mas não é selecionável.Atualização (janeiro de 2016):
Quando o
select
elemento está,required
ele permite o uso da:invalid
pseudo-classe CSS, que permite estilizar oselect
elemento no estado "espaço reservado".:invalid
funciona aqui por causa do valor vazio no espaço reservadooption
.Depois que um valor for definido, a
:invalid
pseudo-classe será descartada. Opcionalmente, você também pode usar,:valid
se desejar.A maioria dos navegadores suporta essa pseudo classe. Internet Explorer 10 e posterior. Isso funciona melhor com
select
elementos de estilo personalizado ; em alguns casos, ou seja, (Mac no Chrome / Safari), você precisará alterar a aparência padrão daselect
caixa para que certos estilos sejam exibidos,background-color
ecolor
. Você pode encontrar alguns exemplos e mais sobre compatibilidade em developer.mozilla.org .Aparência do elemento nativo Mac no Chrome:
Usando o elemento de borda alterado Mac no Chrome:
fonte
display:none
estilo.:invalid
muito antes de mim.color
as opções nos navegadores de suporte, como neste violino . Isso ajudaria a reforçar que os desmotivadosoption
são um espaço reservado. (Edit: Eu vejo MattW já cobriu este em sua resposta)Para um campo obrigatório, há uma solução de CSS puro nos navegadores modernos:
fonte
required
funcionar, por isso não adianta se você quiser que o campo seja opcional.:required
seletor não é suportado no IE8 e abaixo. O:invalid
seletor não é suportado no IE9 e abaixo. Quirksmode.org/css/selectorsrequired
condição que faz com que o navegador aplique a:invalid
pseudo-classe quando o espaço reservado é selecionado.[value=""]
não funcionará como um substituto, porque o que é atualizado pela interação do usuário é a propriedade value , mas a sintaxe CSS se refere a um atributo (inexistente) .Algo assim:
HTML:
CSS:
JavaScript:
Exemplo de trabalho: http://jsfiddle.net/Zmf6t/
fonte
Acabei de adicionar um atributo oculto em um
option
like abaixo. Está funcionando bem pra mim.fonte
A solução abaixo também funciona no Firefox, sem JavaScript:
fonte
Eu tive o mesmo problema e, durante a pesquisa, me deparei com essa pergunta e, depois de encontrar uma boa solução para mim, gostaria de compartilhá-la com vocês, caso alguém possa se beneficiar.
Aqui está:
HTML:
CSS:
JavaScript:
Depois que o cliente faz a primeira seleção, não há necessidade de cor cinza, portanto o código JavaScript remove a classe
place_holder
.Graças a @ user1096901, como solução alternativa para o navegador Internet Explorer, você pode adicionar a
place_holder
classe novamente caso a primeira opção seja selecionada novamente :)fonte
Não há necessidade de JavaScript ou CSS, apenas três atributos:
Não mostra a opção; apenas define o valor da opção como padrão.
No entanto, se você não gostar de um espaço reservado da mesma cor que o restante , poderá corrigi-lo da seguinte maneira:
Obviamente, você pode separar as funções e pelo menos o CSS do select em arquivos separados.
Nota: a função onload corrige um bug de atualização.
fonte
O usuário não deve ver o espaço reservado nas opções selecionadas. Sugiro usar o
hidden
atributo para a opção de espaço reservado e você não precisa doselected
atributo para esta opção. Você pode colocá-lo como o primeiro.fonte
select:invalid
também é válido.required
Aqui eu modifiquei a resposta de David (resposta aceita). Em sua resposta, ele colocou o atributo desativado e selecionado na
option
tag, mas quando também colocamos a tag oculta, ela ficará muito melhor.Ao adicionar um atributo oculto extra na
option
tag, impedirá que a opção "Selecione sua opção" seja re-selecionada após a seleção da opção "Durr".fonte
Aqui é minha:
fonte
<option value="" selected disabled>Please select</option>
como a primeira opção.Vejo sinais de respostas corretas, mas, para reunir tudo, essa seria a minha solução:
fonte
Durr
fica cinza depois que você o seleciona. Isso força a caixa de seleção fechada a ficar sempre cinza.Se você estiver usando Angular, vá assim:
fonte
hidden
atributo para que a opção não seja exibida ao abrir oselect
. Mas, de qualquer forma, obrigado por essa resposta, funcionou para mim.Esta
HTML + CSS
solução funcionou para mim:Boa sorte...
fonte
Outra possibilidade em JavaScript:
JSFiddle
fonte
Adoro a solução aceita e funciona muito bem sem JavaScript.
Eu só quero adicionar como eu adotei essa resposta para um componente de reação com seleção controlada , porque demorei algumas tentativas para descobrir. Seria muito simples de incorporar
react-select
e terminar com ele, mas, a menos que você precise da incrível funcionalidade que este repositório fornece, o que não é necessário para o projeto em questão, não há necessidade de adicionar mais kilobytes ao meu pacote. Observe quereact-select
manipula espaços reservados em selects através de um sistema complexo de váriosinputs
ehtml
elementos.No React, para um componente controlado , você não pode adicionar o
selected
atributo às suas opções. O React manipula o estado da seleção por meio de umvalue
atributo sobreselect
ele mesmo, junto com um manipulador de alterações, em que o valor deve corresponder a um dos atributos de valor nas próprias opções.Por exemplo, por exemplo
Como seria impróprio e, de fato, geraria um erro para adicionar o
selected
atributo a uma das opções, o que então?A resposta é simples quando você pensa sobre isso. Como queremos que o nosso primeiro
option
sejaselected
tão bom quantodisabled
ehidden
, precisamos fazer três coisas:hidden
edisabled
ao primeiro definidooption
.option
como uma sequência vazia.select
para também ser uma sequência vazia.Agora você pode estilizar a seleção conforme indicado acima (ou via a,
className
se preferir).fonte
Espaço
[type="text"]
reservado para o estilo de entrada para elementos selecionadosA solução a seguir simula um espaço reservado no que se refere a um
input[type="text"]
elemento:fonte
Eu queria que o SELECT fosse cinza até ser selecionado, para este trecho de HTML:
Eu adicionei estas definições de CSS:
Funciona como esperado no Chrome / Safari e talvez também em outros navegadores, mas eu não verifiquei.
fonte
Aqui está uma solução CSS que funciona lindamente. O conteúdo é adicionado (e absolutamente posicionado em relação ao contêiner) após o elemento que contém ( via: after pseudo-class ).
Ele obtém seu texto do atributo placeholder que eu defini onde usei a diretiva ( attr (placeholder) ). Outro fator importante são os eventos do ponteiro: nenhum - isso permite que cliques no texto do espaço reservado passem para a seleção. Caso contrário, não será suspenso se o usuário clicar no texto.
Eu mesmo adicionei a classe .empty na minha diretiva select, mas normalmente acho que o angular adiciona / remove .ng-vazio para mim (suponho que seja porque estou injetando a versão 1.2 do Angular no meu exemplo de código).
(A amostra também demonstra como agrupar elementos HTML no AngularJS para criar suas próprias entradas personalizadas)
fonte
Não consegui fazer com que nenhum deles funcione atualmente, porque para mim não é (1) necessário e (2) precisa da opção para retornar ao padrão selecionável. Então, aqui está uma opção pesada, se você estiver usando o jQuery:
fonte
Não estou satisfeito com soluções somente HTML / CSS, por isso decidi criar um personalizado
select
usando JavaScript.Isso é algo que escrevi nos últimos 30 minutos, portanto, pode ser melhorado ainda mais.
Tudo que você precisa fazer é criar uma lista simples com poucos atributos de dados. O código transforma automaticamente a lista em um menu suspenso selecionável. Ele também adiciona um oculto
input
para armazenar o valor selecionado, para que possa ser usado em um formulário.Entrada:
Resultado:
O texto do item que deveria ser um espaço reservado fica acinzentado. O espaço reservado é selecionável, caso o usuário deseje reverter sua escolha. Também usando CSS, todas as desvantagens de
select
podem ser superadas (por exemplo, incapacidade de definir o estilo das opções).Mostrar snippet de código
Atualização : melhorei isso (seleção usando as teclas para cima / para baixo / enter), arrumei a saída um pouco e transformei isso em um objeto. Saída atual:
Inicialização:
Para um exame mais aprofundado: JSFiddle ,
GitHub(renomeado).Atualização: reescrevi isso novamente. Em vez de usar uma lista, podemos apenas usar um select. Dessa forma, ele funcionará mesmo sem JavaScript (caso esteja desativado).
Entrada:
Resultado:
JSFiddle , GitHub .
fonte
Você precisa da validação do formulário e os navegadores modernos oferecem isso do zero.
Portanto, você não precisa cuidar para que o usuário não possa selecionar o campo. Porque quando ele está fazendo isso, a validação do navegador diz a ele que esta é uma seleção errada.
O navegador embutido na função de validação checkValidity () .
O Bootstrap também tem um bom exemplo.
HTML
Javascript
fonte
fonte
Em Angular , podemos adicionar uma opção como espaço reservado que pode ser ocultada no menu suspenso. Podemos até adicionar um ícone suspenso personalizado como plano de fundo que substitui o ícone suspenso do navegador .
O truque é ativar o espaço reservado css somente quando o valor não estiver selecionado
/ ** Meu modelo de componente * /
/ ** Meu componente.TS * /
/**global.scss*/
fonte
Solução para Angular 2
Crie um rótulo em cima da seleção
e aplique CSS para colocá-lo em cima
pointer-events: none
permite exibir a seleção quando você clica no rótulo, que fica oculto quando você seleciona uma opção.angular html css
fonte
Aqui está a minha contribuição. Haml + CoffeeScript + SCSS
Haml
CoffeeScript
SCSS
É possível usar apenas CSS alterando o código do servidor e definindo apenas os estilos de classe, dependendo do valor atual da propriedade, mas dessa maneira parece mais fácil e limpo.
Você pode adicionar mais CSS (
select option:first-child
) para manter o espaço reservado em cinza quando for aberto, mas não me importei com isso.fonte
Tente isso para variar:
fonte
Aqui está um exemplo prático de como conseguir isso com JavaScript puro que lida com a cor das opções após o primeiro clique:
fonte
Com base na resposta de MattW , você pode tornar a opção selecionar espaço reservado visível no menu suspenso após a seleção válida, ocultando-a condicionalmente apenas enquanto o espaço reservado permanece selecionado (e a seleção é, portanto, inválida).
fonte
Com base na resposta de Albireo , esta versão não usa jQuery e a especificidade do CSS é melhor.
fonte