Je passe un sacré moment avec ce sélecteur CSS particulier qui ne veut pas fonctionner lorsque j'y ajoute :not(:empty)
. Cela semble fonctionner correctement avec n'importe quelle combinaison des autres sélecteurs:
input:not(:empty):not(:focus):invalid { border-color: #A22; box-shadow: none }
Si je retire la :not(:empty)
pièce, cela fonctionne très bien. Même si je change le sélecteur, input:not(:empty)
je ne sélectionnerai toujours pas les champs de saisie contenant du texte. Est-ce cassé ou ne suis-je tout simplement pas autorisé à l'utiliser :empty
dans un :not()
sélecteur?
La seule autre chose à laquelle je peux penser est que les navigateurs disent toujours que l'élément est vide parce qu'il n'a pas d'enfants, juste une "valeur" par exemple. Est-ce que le:empty
sélecteur n'a- pas de fonctionnalité distincte pour un élément d'entrée par rapport à un élément normal? Cela ne semble pas probable car utiliser :empty
sur un champ et taper quelque chose dedans fera disparaître les effets alternatifs (car il n'est plus vide).
Testé dans Firefox 8 et Chrome.
la source
:empty
sélecteur : « D'autres éléments, d'autre part, sont vides (c. -à- n'a pas d' enfant) par définition:<input>
,<img>
,<br>
et<hr>
, par exemple. »:not(:empty)
, la bordure rouge fonctionne comme prévu pour une entrée qui n'est pas au point mais qui n'est pas valide.Réponses:
Étant un élément void , un
<input>
élément est considéré comme vide par la définition HTML de "vide", puisque le modèle de contenu de tous les éléments void est toujours vide . Ainsi, ils correspondront toujours à la:empty
pseudo-classe, qu'ils aient ou non une valeur. C'est également pourquoi leur valeur est représentée par un attribut dans la balise de début, plutôt que par un contenu textuel dans les balises de début et de fin.Aussi, à partir de la spécification des sélecteurs :
Par conséquent,
input:not(:empty)
ne correspondra jamais à rien dans un document HTML approprié. (Cela fonctionnerait toujours dans un document XML hypothétique qui définit un<input>
élément qui peut accepter du texte ou des éléments enfants.)Je ne pense pas que vous puissiez styliser les
<input>
champs vides de manière dynamique en utilisant uniquement du CSS (c'est-à-dire des règles qui s'appliquent chaque fois qu'un champ est vide, et pas une fois le texte entré). Vous pouvez sélectionner des champs initialement vides s'ils ont unvalue
attribut vide (input[value=""]
) ou s'ils manquent complètement de l'attribut (input:not([value])
), mais c'est à peu près tout.la source
input:empty
. Peut-être ai-je tapé quelque chose de mal, qui sait.input
éléments peuvent être stylisés dynamiquement (dans des navigateurs suffisamment modernes) si vous pouvez utiliser l'required
attribut dans le balisage HTML. Ensuite, vous pouvez utiliser:valid
et:invalid
dans CSS pour tester la valeur non vide ou vide du contrôle. Voir stackoverflow.com/questions/16952526/…C'est possible avec javascript en ligne
onkeyup="this.setAttribute('value', this.value);"
etinput:not([value=""]):not(:focus):invalid
Démo: http://jsfiddle.net/mhsyfvv9/
la source
onchange
événement n'est-il pas meilleur dans ce cas? Puisque vous pouvez également modifier les valeurs d'entrée avecRight click > Cut
(par exemple). Testé: fonctionne très bien.Vous pouvez essayer d'utiliser: placeholder-shown ...
pas de grand support cependant ... caniuse
la source
la source
Vous pouvez aborder cela différemment; omettez l'utilisation de la
:empty
pseudo-classe et utilisez lesinput
événements pour détecter une valeur significative dans le<input>
champ et le styliser en conséquence:en relation
input
événements (les événements de mutation DOM sont désormais obsolètes dans le niveau DOM 4, et ont été remplacés par des observateurs de mutation DOM).Avertissement: notez que les
input
événements sont actuellement expérimentaux , et probablement pas largement pris en charge.la source
Puisque l'espace réservé disparaît en entrée, vous pouvez utiliser:
la source
solution pure css
la source
Une autre solution CSS pure
la source
Cela devrait fonctionner dans les navigateurs modernes:
Il sélectionne toutes les entrées avec l'attribut value, puis sélectionne les entrées avec une valeur non vide parmi elles.
la source
value=""
. Taper / supprimer quelque chose dans la case n'entraînerait aucun changement.Cela fonctionne car nous sélectionnons l'entrée uniquement lorsqu'il n'y a pas de chaîne vide.
la source
la source