Estou tendo um inferno com este seletor CSS específico que não quer funcionar quando eu adiciono :not(:empty)
a ele. Parece funcionar bem com qualquer combinação dos outros seletores:
input:not(:empty):not(:focus):invalid { border-color: #A22; box-shadow: none }
Se eu remover a :not(:empty)
peça, funciona perfeitamente. Mesmo se eu mudar o seletor para input:not(:empty)
ele ainda não selecionará os campos de entrada que têm texto digitado neles. Ele está quebrado ou não tenho permissão para usar :empty
em um :not()
seletor?
A única outra coisa que consigo pensar é que os navegadores ainda estão dizendo que o elemento está vazio porque não tem filhos, apenas um "valor" por dizer. O :empty
seletor não tem funcionalidade separada para um elemento de entrada e um elemento regular? Isso não parece provável porque usar:empty
em um campo e digitar algo nele fará com que os efeitos alternativos desapareçam (porque ele não está mais vazio).
Testado no Firefox 8 e Chrome.
fonte
:empty
seletor : "Alguns outros elementos, por outro lado, estão vazios (ou seja, não têm filhos) por definição:<input>
,<img>
,<br>
, e<hr>
, por exemplo.":not(:empty)
, a borda vermelha funcionará conforme o esperado para uma entrada que não está em foco, mas é inválida.Respostas:
Sendo um elemento void , um
<input>
elemento é considerado vazio pela definição HTML de "vazio", uma vez que o modelo de conteúdo de todos os elementos void está sempre vazio . Portanto, eles sempre corresponderão à:empty
pseudoclasse, tenham ou não um valor. É também por isso que seu valor é representado por um atributo na tag inicial, em vez de conteúdo de texto nas tags inicial e final.Além disso, nas especificações dos seletores :
Conseqüentemente,
input:not(:empty)
nunca corresponderá a nada em um documento HTML adequado. (Ainda funcionaria em um documento XML hipotético que define um<input>
elemento que pode aceitar texto ou elementos filho.)Eu não acho que você pode estilizar
<input>
campos vazios dinamicamente usando apenas CSS (ou seja, regras que se aplicam sempre que um campo está vazio e não se aplicam depois que o texto é inserido). Você pode selecionar campos inicialmente vazios se eles tiverem umvalue
atributo vazio (input[value=""]
) ou não tiverem o atributo completamente (input:not([value])
), mas isso é tudo.fonte
input:empty
. Talvez eu tenha digitado algo errado, quem sabe.input
elementos podem ser estilizados dinamicamente (em navegadores suficientemente modernos) se você puder usar orequired
atributo na marcação HTML. Em seguida, você pode usar:valid
e:invalid
em CSS para testar o valor não vazio vs. valor vazio do controle. Consulte stackoverflow.com/questions/16952526/…É possível com javascript inline
onkeyup="this.setAttribute('value', this.value);"
&input:not([value=""]):not(:focus):invalid
Demo: http://jsfiddle.net/mhsyfvv9/
fonte
onchange
evento não é melhor neste caso? Uma vez que você também pode editar valores de entrada comRight click > Cut
(por exemplo). Testei: funciona bem.Você pode tentar usar: placeholder-mostrado ...
nenhum grande suporte ... caniuse
fonte
fonte
Você pode abordar isso de forma diferente; omita o uso da
:empty
pseudoclasse e utilizeinput
eventos para detectar um valor significativo no<input>
campo e estilize-o de acordo:Relacionados
input
eventos (os eventos de mutação DOM estão obsoletos no nível 4 do DOM e foram substituídos por observadores de mutação DOM).Isenção de responsabilidade: observe que os
input
eventos são atualmente experimentais e provavelmente não são amplamente suportados.fonte
Como o marcador desaparece na entrada, você pode usar:
fonte
solução css pura
fonte
Outra solução CSS pura
fonte
Isso deve funcionar em navegadores modernos:
Ele seleciona todas as entradas com atributo de valor e, em seguida, seleciona entradas com valor não vazio entre elas.
fonte
value=""
. Digitar / remover algo na caixa não causaria nenhuma alteração.Isso funciona porque estamos selecionando a entrada apenas quando não há uma string vazia.
fonte
fonte