Je passe énormément de temps 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 supprime la partie :not(:empty)
, cela fonctionne très bien. Même si je change le sélecteur en input:not(:empty)
, il ne sélectionnera toujours pas les champs de saisie contenant du texte. Est-ce cassé ou est-ce que je ne suis pas autorisé à utiliser :empty
dans un sélecteur :not()
?
La seule autre chose à laquelle je peux penser est que les navigateurs disent toujours que l'élément est vide car il n'a pas d'enfants, juste une "valeur" à proprement parler. Le sélecteur :empty
n'a-t-il pas une fonctionnalité distincte pour un élément d'entrée par rapport à un élément normal? Cela ne semble toutefois pas probable, car utiliser :empty
dans un champ et y saisir quelque chose entraînera la disparition des effets alternatifs (car il n'est plus vide).
Testé sous Firefox 8 et Chrome.
Étant un élément vide , un élément <input>
est considéré comme vide par la définition HTML de "vide", car le modèle de contenu de tous les éléments void est toujours vide. Ainsi, ils correspondront toujours à la pseudo-classe :empty
, qu’ils aient ou non une valeur. C'est aussi pourquoi leur valeur est représentée par un attribut dans la balise de début, plutôt que par le contenu textuel dans les balises de début et de fin.
En outre, à partir de la spéc. Sélecteurs :
La pseudo-classe
:empty
représente un élément qui n'a aucun enfant. En termes d'arborescence de documents, seuls les nœuds d'élément et les nœuds de contenu (tels que les nœuds de texte DOM, les nœuds CDATA et les références d'entité) dont les données ont une longueur non nulle doivent être considérés comme affectant la vacuité;
Par conséquent, input:not(:empty)
ne correspondra jamais à quoi que ce soit dans un document HTML approprié. (Cela fonctionnerait toujours dans un document XML hypothétique qui définit un élément <input>
pouvant accepter du texte ou des éléments enfants.)
Je ne pense pas que vous puissiez styler les champs <input>
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 qui ne le sont pas une fois le texte saisi). Vous pouvez sélectionner initialement des champs vides s'ils ont un attribut value
vide (input[value=""]
) ou s'ils n'ont pas l'attribut complet (input:not([value])
), mais c'est à peu près tout.
Il est possible avec onkeyup="this.setAttribute('value', this.value);"
& input:not([value=""]):not(:focus):invalid
javascript en ligne
Démo: http://jsfiddle.net/mhsyfvv9/
input:not([value=""]):not(:focus):invalid{
background-color: tomato;
}
<input
type="email"
value=""
placeholder="valid mail"
onkeyup="this.setAttribute('value', this.value);" />
Vous pouvez essayer d'utiliser: placeholder-shown ...
input {
padding: 10px 15px;
font-size: 16px;
border-radius: 5px;
border: 2px solid lightblue;
outline: 0;
font-weight:bold;
transition: border-color 200ms;
font-family: sans-serif;
}
.validation {
opacity: 0;
font-size: 12px;
font-family: sans-serif;
color: crimson;
transition: opacity;
}
input:required:valid {
border-color: forestgreen;
}
input:required:invalid:not(:placeholder-shown) {
border-color: crimson;
}
input:required:invalid:not(:placeholder-shown) + .validation {
opacity: 1;
}
<input type="email" placeholder="e-mail" required>
<div class="validation">Not valid</span>
pas grand soutien cependant ... caniuse
.floating-label-input {
position: relative;
height:60px;
}
.floating-label-input input {
width: 100%;
height: 100%;
position: relative;
background: transparent;
border: 0 none;
outline: none;
vertical-align: middle;
font-size: 20px;
font-weight: bold;
padding-top: 10px;
}
.floating-label-input label {
position: absolute;
top: calc(50% - 5px);
font-size: 22px;
left: 0;
color: #000;
transition: all 0.3s;
}
.floating-label-input input:focus ~ label, .floating-label-input input:focus ~ label, .floating-label-input input:valid ~ label {
top: 0;
font-size: 15px;
color: #33bb55;
}
.floating-label-input .line {
position: absolute;
height: 1px;
width: 100%;
bottom: 0;
background: #000;
left: 0;
}
.floating-label-input .line:after {
content: "";
display: block;
width: 0;
background: #33bb55;
height: 1px;
transition: all 0.5s;
}
.floating-label-input input:focus ~ .line:after, .floating-label-input input:focus ~ .line:after, .floating-label-input input:valid ~ .line:after {
width: 100%;
}
<div class="floating-label-input">
<input type="text" id="id" required/>
<label for="id" >User ID</label>
<span class="line"></span>
</div>
Vous pouvez aborder cela différemment. omettez l'utilisation de la pseudo-classe :empty
et utilisez les événements input
pour détecter une valeur significative dans le champ <input>
et attribuez-lui un style en conséquence:
var inputs = document.getElementsByTagName('input');
for (var i = 0; i < inputs.length; i++) {
var input = inputs[i];
input.addEventListener('input', function() {
var bg = this.value ? 'green' : 'red';
this.style.backgroundColor = bg;
});
}
body {
padding: 40px;
}
#inputList li {
list-style-type: none;
padding-bottom: 1.5em;
}
#inputList li input,
#inputList li label {
float: left;
width: 10em;
}
#inputList li input {
color: white;
background-color: red;
}
#inputList li label {
text-align: right;
padding-right: 1em;
}
<ul id="inputList">
<li>
<label for="username">Enter User Name:</label>
<input type="text" id="username" />
</li>
<li>
<label for="password">Enter Password:</label>
<input type="password" id="password" />
</li>
</ul>
input
événements (les événements de mutation DOM sont désormais obsolètes dans le niveau 4 de DOM et ont été remplacés par des observateurs de mutation DOM).Avertissement: notez que input
événements sont actuellement expérimentaux , et probablement pas largement pris en charge.}
solution css pure
input::-webkit-input-placeholder {
opacity: 1;
-webkit-transition: opacity 0s;
transition: opacity 0s;
text-align: right;
}
/* Chrome <=56, Safari < 10 */
input:-moz-placeholder {
opacity: 1;
-moz-transition: opacity 0s;
transition: opacity 0s;
text-align: right;
}
/* FF 4-18 */
input::-moz-placeholder {
opacity: 1;
-moz-transition: opacity 0s;
transition: opacity 0s;
text-align: right;
}
/* FF 19-51 */
input:-ms-input-placeholder {
opacity: 1;
-ms-transition: opacity 0s;
transition: opacity 0s;
text-align: right;
}
/* IE 10+ */
input::placeholder {
opacity: 1;
transition: opacity 0s;
text-align: right;
}
/* Modern Browsers */
*:focus::-webkit-input-placeholder {
opacity: 0;
text-align: left;
}
/* Chrome <=56, Safari < 10 */
*:focus:-moz-placeholder {
opacity: 0;
text-align: left;
}
/* FF 4-18 */
*:focus::-moz-placeholder {
opacity: 0;
text-align: left;
}
/* FF 19-50 */
*:focus:-ms-input-placeholder {
opacity: 0;
text-align: left;
}
/* IE 10+ */
*:focus::placeholder {
opacity: 0;
text-align: left;
}
/* Modern Browsers */
input:focus {
text-align: left;
}