Hacer coincidir un cuadro de entrada vacío usando CSS

141

¿Cómo aplico un estilo a un cuadro de entrada vacío? Si el usuario escribe algo en el campo de entrada, el estilo ya no debería aplicarse. ¿Es esto posible en CSS? Intenté esto:

input[value=""]
Sjoerd
fuente

Respuestas:

159

Si solo el campo es required, podrías ir coninput:valid

#foo-thing:valid + .msg { visibility: visible!important; }      
 <input type="text" id="foo-thing" required="required">
 <span class="msg" style="visibility: hidden;">Yay not empty</span>

Ver en vivo en jsFiddle

O negar usando #foo-thing:invalid(crédito a @SamGoody)

lukmdo
fuente
14
..o negar usando: inválido {} developer.mozilla.org/en-US/docs/Web/CSS/…
SamGoody
66
Quiero lo mismo, pero mi campo no es obligatorio. ¿Hay alguna manera de hacerlo?
Zahidul Islam Ruhel el
1
Eso es genial :)
kriskodzi
@ZahidulIslamRuhel, por supuesto, esta respuesta no debería ser la mejor. vea la respuesta a continuación stackoverflow.com/a/35593489/11293716
sijanec
150

En los navegadores modernos, puede usar :placeholder-shownpara apuntar a la entrada vacía (que no debe confundirse con ::placeholder).

input:placeholder-shown {
    border: 1px solid red; /* Red border only if the input is empty */
}

Más información y compatibilidad con el navegador: https://css-tricks.com/almanac/selectors/p/placeholder-shown/

Berend
fuente
44
Eso es genial! Muy útil :)
destrabe el
1
@TricksfortheWeb Parece requerir un atributo de marcador de posición (con un valor) para estar presente en la etiqueta de entrada. Probado en Chrome: no estoy seguro si esto cuenta para todos los navegadores.
Berend
9
Se debe establecer el atributo de marcador de posición. De todos modos, podemos establecer el atributo de marcador de posición como espacio en blanco.
Barcelonczyk
2
@Amanpreet Según caniuse.com/#search=placeholder , esto tampoco funcionará en IE 11 (o Edge).
Tim Malone
44
No es compatible con los navegadores de Microsoft: caniuse.com/#feat=css-placeholder-shown
Lounge9
44

No hay un selector en CSS que haga esto. Los selectores de atributos coinciden con los valores de los atributos, no con los valores calculados.

Tendrías que usar JavaScript.

Quentin
fuente
3
Para cualquiera que encuentre esta respuesta más tarde: Quentin tiene razón con respecto a los valores calculados, sin embargo, existe el: selector vacío que podría usarse aquí y tiene un soporte razonable (todos los navegadores, excepto IE8 y anteriores, según: w3schools.com/cssref/sel_empty.asp
Cohen
35
:emptyselector solo funciona en elementos vacíos, es decir, solo en elementos que tienen una etiqueta de apertura y cierre que está vacía en el medio, y elementos de etiqueta única que siempre se consideran vacíos, por ejemplo , por lo que no se puede usar en elementos de entrada exceptotextarea
am05mhz
77
No es verdad. Ver la respuesta de lukmo a continuación. La combinación del atributo requerido y los pseudo-selectores: válido o: inválido logran esto.
nulo
2
Esta fue la respuesta correcta en el momento en que se hizo la pregunta. El atributo requerido solo estaba disponible en Chrome y Firefox en 2011, y esta respuesta es de 2010. Sin embargo, los tiempos han cambiado y esta ya no es la "mejor" respuesta, por lo que la desmarqué como aceptada.
Sjoerd
18

La actualización del valor de un campo no actualiza su atributo de valor en el DOM, por eso su selector siempre coincide con un campo, incluso cuando en realidad no está vacío.

En su lugar, use la invalidpseudoclase para lograr lo que desea, así:

input:required {
  border: 1px solid green;
}
input:required:invalid {
  border: 1px solid red;
}
<input required type="text" value="">

<input required type="text" value="Value">

Lanudo
fuente
15

input[value=""], input:not([value])

funciona con:

<input type="text" />
<input type="text" value="" />

Pero el estilo no cambiará tan pronto como alguien comience a escribir (necesita JS para eso).

Draco Ater
fuente
1
No es confiable ya que el atributo de valor no se cambia en DOM después de una edición de campo. Sin embargo, un buen truco si no te importa esto, y funciona en los últimos Safari, Chrome, FF e IE ...
Dunc
9
Para que coincida con el primero, puede usar input[value=""], input:not([value]).
Cisma
10

Si no se necesita apoyo navegadores antiguos, se puede usar una combinación de required, validy invalid.

Lo bueno de usar este es el validy invalidpseudo-elementos funcionan bien con los atributos de tipo de campos de entrada. Por ejemplo:

input:invalid, textarea:invalid { 
    box-shadow: 0 0 5px #d45252;
    border-color: #b03535
}

input:valid, textarea:valid {
    box-shadow: 0 0 5px #5cd053;
    border-color: #28921f;
}
<input type="email" name="email" placeholder="[email protected]" required />
<input type="url" name="website" placeholder="http://johndoe.com"/>
<input type="text" name="name" placeholder="John Doe" required/>

Para referencia, JSFiddle aquí: http://jsfiddle.net/0sf6m46j/

Mi pila se desborda
fuente
7
$('input#edit-keys-1').blur(function(){
    tmpval = $(this).val();
    if(tmpval == '') {
        $(this).addClass('empty');
        $(this).removeClass('not-empty');
    } else {
        $(this).addClass('not-empty');
        $(this).removeClass('empty');
    }
});

en jQuery. Agregué una clase y diseñé con CSS.

.empty { background:none; }
Israel Morales
fuente
6

Esto funcionó para mí:

Para el HTML, agregue el requiredatributo al elemento de entrada

<input class="my-input-element" type="text" placeholder="" required />

Para el CSS, use el :invalidselector para apuntar a la entrada vacía

input.my-input-element:invalid {

}

Notas:

  • Acerca requiredde w3Schools.com : "Cuando está presente, especifica que se debe completar un campo de entrada antes de enviar el formulario".
Ariella
fuente
2

Es posible que esta pregunta se haya hecho hace algún tiempo, pero como recientemente llegué a este tema en busca de la validación de formularios del lado del cliente, y como el :placeholder-shown soporte está mejorando, pensé que lo siguiente podría ayudar a otros.

Utilizando la idea de Berend de usar esta pseudoclase CSS4, pude crear una validación de formulario solo activada una vez que el usuario terminó de llenarla.

Aquí hay una explicación y una explicación sobre CodePen: https://codepen.io/johanmouchet/pen/PKNxKQ

Johan M.
fuente
1

Si está contento de no admitir IE o pre-Chromium Edge (lo que podría estar bien si está usando esto para una mejora progresiva), puede usarlo :placeholder-showncomo Berend ha dicho. Tenga en cuenta que para Chrome y Safari realmente necesita un marcador de posición no vacío para que esto funcione, aunque un espacio funciona.

*,
 ::after,
 ::before {
  box-sizing: border-box;
}

label.floating-label {
  display: block;
  position: relative;
  height: 2.2em;
  margin-bottom: 1em;
}

label.floating-label input {
  font-size: 1em;
  height: 2.2em;
  padding-top: 0.7em;
  line-height: 1.5;
  color: #495057;
  background-color: #fff;
  background-clip: padding-box;
  border: 1px solid #ced4da;
  border-radius: 0.25rem;
  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}

label.floating-label input:focus {
  color: #495057;
  background-color: #fff;
  border-color: #80bdff;
  outline: 0;
  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
}

label.floating-label input+span {
  position: absolute;
  top: 0em;
  left: 0;
  display: block;
  width: 100%;
  font-size: 0.66em;
  line-height: 1.5;
  color: #495057;
  border: 1px solid transparent;
  border-radius: 0.25rem;
  transition: font-size 0.1s ease-in-out, top 0.1s ease-in-out;
}

label.floating-label input:placeholder-shown {
  padding-top: 0;
  font-size: 1em;
}

label.floating-label input:placeholder-shown+span {
  top: 0.3em;
  font-size: 1em;
}
<fieldset>
  <legend>
    Floating labels example (no-JS)
  </legend>
  <label class="floating-label">
    <input type="text" placeholder=" ">
    <span>Username</span>
  </label>
  <label class="floating-label">
    <input type="Password" placeholder=" ">
    <span>Password</span>
  </label>
</fieldset>
<p>
  Inspired by Bootstrap's <a href="https://getbootstrap.com/docs/4.0/examples/floating-labels/">floating labels</a>.
</p>

Sora2455
fuente
1

Me funcionó agregar un nombre de clase a la entrada y luego aplicar reglas CSS a eso:

<input type="text" name="product" class="product" />

<style>
input[value=""].product {
    display: none;
}
</style>
DeFeNdog
fuente
0

Me preguntan las respuestas, tenemos un atributo claro para obtener cuadros de entrada vacíos, eche un vistazo a este código

/*empty input*/
input:empty{
    border-color: red;
}
/*input with value*/
input:not(:empty){
    border-color: black;
}

ACTUALIZAR

input, select, textarea {
    border-color: @green;
    &:empty {
        border-color: @red;
    }
}

Más por tener un excelente aspecto en la validación

 input, select, textarea {
    &[aria-invalid="true"] {
        border-color: amber !important;
    }

    &[aria-invalid="false"], &.valid {
        border-color: green !important;
    }
}
Nasser Hadjloo
fuente
77
:emptyse aplica solo a elementos que no tienen hijos. Las entradas no pueden tener nodos secundarios en absoluto, por lo que su entrada siempre estará con borde rojo. Ver también este comentario
Zhegan
2
@NasserHadjloo, ¿has probado esto? Cambiar el valueno cambia el número de nodos secundarios.
jcuenod
@jcuenod, ¿qué quiere decir con número de nodos secundarios? No entendí tu punto
Nasser Hadjloo
En las estructuras xml, los nodos están anidados (es decir <parent><child></child></parent>). Simplemente tiene <input></input>y mientras escribe lo que está cambiando no es un <value>nodo dentro <input>sino un atributo de valor :<input value='stuff you type'></input>
jcuenod
2
Pero eso no es lo que el OP está tratando de lograr.
jcuenod
0

Me doy cuenta de que este es un hilo muy antiguo, pero las cosas han cambiado un poco desde entonces y me ayudó a encontrar la combinación correcta de cosas que necesitaba para solucionar mi problema. Así que pensé en compartir lo que hice.

El problema era que tenía que aplicar el mismo CSS para una entrada opcional si se llenaba, como lo había hecho para un llenado requerido. El css utilizó la clase psuedo: válida, que aplicó el css en la entrada opcional también cuando no se rellenó.

Así es como lo arreglé;

HTML

<input type="text" required="required">
<input type="text" placeholder="">

CSS

input:required:valid {
    ....
}
input:optional::not(:placeholder-shown){
    ....
}
jessica
fuente