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=""]

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)


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/


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.


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">


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).


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="john_doe@example.com" 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/


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; }

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".

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


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>


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>

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;
    }
}

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){
    ....
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.