Me lo estoy pasando genial con este selector de CSS en particular que no quiere funcionar cuando lo agrego :not(:empty)
. Parece funcionar bien con cualquier combinación de los otros selectores:
input:not(:empty):not(:focus):invalid { border-color: #A22; box-shadow: none }
Si quito la :not(:empty)
pieza, funciona bien. Incluso si cambio el selector a input:not(:empty)
, todavía no seleccionará campos de entrada que tengan texto escrito en ellos. ¿Está roto o simplemente no puedo usarlo :empty
dentro de un :not()
selector?
La única otra cosa en la que puedo pensar es que los navegadores siguen diciendo que el elemento está vacío porque no tiene hijos, solo un "valor" por decir. ¿El :empty
selector no tiene una funcionalidad separada para un elemento de entrada frente a un elemento regular? Sin embargo, esto no parece probable porque usarlo :empty
en un campo y escribir algo en él hará que los efectos alternativos desaparezcan (porque ya no está vacío).
Probado en Firefox 8 y Chrome.
fuente
:empty
selectora : "Algunos otros elementos, por otra parte, se vacía (es decir, no tienen hijos) por definición:<input>
,<img>
,<br>
, y<hr>
, por ejemplo.":not(:empty)
, el borde rojo funciona como se esperaba para una entrada que no está enfocada pero no es válida.Respuestas:
Al ser un elemento vacío , un
<input>
elemento se considera vacío según la definición HTML de "vacío", ya que el modelo de contenido de todos los elementos vacíos siempre está vacío . Por lo tanto, siempre coincidirán con la:empty
pseudoclase, tengan o no un valor. Esta es también la razón por la que su valor está representado por un atributo en la etiqueta de inicio, en lugar del contenido de texto dentro de las etiquetas de inicio y finalización.Además, de la especificación de Selectores :
En consecuencia,
input:not(:empty)
nunca coincidirá con nada en un documento HTML adecuado. (Todavía funcionaría en un documento XML hipotético que define un<input>
elemento que puede aceptar texto o elementos secundarios).No creo que pueda
<input>
aplicar estilo a los campos vacíos dinámicamente usando solo CSS (es decir, reglas que se aplican siempre que un campo está vacío, y no una vez que se ingresa el texto). Puede seleccionar campos inicialmente vacíos si tienen unvalue
atributo vacío (input[value=""]
) o carecen del atributo por completo (input:not([value])
), pero eso es todo.fuente
input:empty
. Quizás escribí algo mal, quién sabe.input
elementos se pueden diseñar dinámicamente (en navegadores suficientemente modernos) si puede usar elrequired
atributo en el marcado HTML. Luego puede usar:valid
y:invalid
en CSS para probar el valor no vacío frente al valor vacío del control. Ver stackoverflow.com/questions/16952526/…Es posible con JavaScript en línea
onkeyup="this.setAttribute('value', this.value);"
yinput:not([value=""]):not(:focus):invalid
Demostración: http://jsfiddle.net/mhsyfvv9/
fuente
onchange
mejor el evento en este caso? Dado que también puede editar valores de entrada conRight click > Cut
(por ejemplo). Probado: funciona bien.Podría intentar usar: placeholder-shown ...
aunque no hay un gran apoyo ... caniuse
fuente
fuente
Puede abordar esto de manera diferente; omitir el uso de la
:empty
pseudoclase y utilizarinput
eventos para detectar un valor significativo en el<input>
campo y diseñarlo en consecuencia:Relacionado
input
eventos (los eventos de mutación DOM ahora están obsoletos en el nivel 4 de DOM y han sido reemplazados por observadores de mutaciones DOM).Descargo de responsabilidad: tenga en cuenta que los
input
eventos son actualmente experimentales y probablemente no cuentan con un amplio apoyo.fuente
Dado que el marcador de posición desaparece en la entrada, puede usar:
fuente
solución css pura
fuente
Otra solución CSS pura
fuente
Esto debería funcionar en los navegadores modernos:
Selecciona todas las entradas con atributo de valor y luego selecciona las entradas con valor no vacío entre ellas.
fuente
value=""
. Escribir / eliminar algo en el cuadro no provocaría ningún cambio.Esto funciona porque estamos seleccionando la entrada solo cuando no hay una cadena vacía.
fuente
fuente