Estoy tratando de usar el :after
pseudo-elemento CSS en un input
campo, pero no funciona. Si lo uso con a span
, funciona bien.
<style type="text/css">
.mystyle:after {content:url(smiley.gif);}
.mystyle {color:red;}
</style>
Esto funciona (pone el smiley después de "¡buu!" Y antes de "un poco más")
<span class="mystyle">buuu!</span>a some more
Esto no funciona: solo colorea algunos valores en rojo, pero no hay carita sonriente.
<input class="mystyle" type="text" value="someValue">
¿Qué estoy haciendo mal? ¿Debo usar otro pseudo-selector?
Nota: No puedo agregar un span
alrededor de mi input
, porque está siendo generado por un control de terceros.
html
css
pseudo-element
css-content
matra
fuente
fuente
border-color
delinput
. Me parece más llamativo.Respuestas:
:after
y:before
no son compatibles con Internet Explorer 7 y versiones anteriores, en ningún elemento.Tampoco debe usarse en elementos reemplazados, como elementos de formulario (entradas) y elementos de imagen .
En otras palabras, es imposible con CSS puro.
Sin embargo, si usa jquery puede usar
Documentos de API en .after
Para agregar su contenido con javascript. Esto funcionará en todos los navegadores.
fuente
:after
, en general, a pesar de que no es compatible con cualquiera:before
o:after
en las entradas.:after
y:before
pseudo elementos, solo se pueden poner en elementos contenedores. ¿Por qué? Porque se agregan dentro de ese elemento en particular.input
No es un contenedor.button
por ejemplo, es por eso que puedes ponértelos. Funciona como se esperaba. La especificación realmente dice: antes y después del contenido del árbol de documentos de un elemento Dice explícitamente CONTENT . Entonces un elemento debe ser un contenedor.:before
y:after
renderizar dentro de un contenedory <input> no puede contener otros elementos.
Los pseudoelementos solo se pueden definir (o mejor dicho, solo se admiten) en los elementos del contenedor. Porque la forma en que se representan está dentro del contenedor como un elemento hijo.
input
no puede contener otros elementos, por lo tanto, no son compatibles. A,button
por otro lado, también es un elemento de formulario que los admite, porque es un contenedor de otros subelementos.Si me preguntas, si un navegador hace mostrar estos dos pseudo-elementos en elementos no contenedores, que es un error y una conformidad no estándar. La especificación habla directamente sobre el contenido del elemento ...
Especificación W3C
Si leemos cuidadosamente la especificación, en realidad dice que se insertan dentro de un elemento contenedor:
¿Ver? El contenido del árbol de documentos de un elemento . Según tengo entendido, esto significa dentro de un contenedor.
fuente
[required]::before { content "*"; color: red; }
: P<input type="submit" value="Send"/>
, use<button type="submit">Send</button>
en su lugar. La presentación es idéntica pero<button>
es un contenedor y, por lo tanto, admite:before
y:after
.<hr />
? Pensé que no era un elemento contenedor, pero podría renderizar:after
y:before
jsfiddle.net/Uf88j/1p
yh1
, el contenido está dentro de la etiqueta, por lo que antes / después también aparecen dentro. Con elementos comoinput
yhr
, before y: after aún aparecerían antes o después del contenido, pero no hay ningún contenedor involucrado (especialmente parainput
). input: check: before se usa ampliamente para indicar que las casillas de verificación se verifican mediante css.Curiosamente, funciona con algunos tipos de entrada. Al menos en Chrome,
funciona bien, igual que
Es justo
type=text
y algunos otros que no funcionan.fuente
Aquí hay otro enfoque (suponiendo que tenga control del HTML): agregue un vacío
<span></span>
justo después de la entrada y apunte eso en CSS usandoinput.mystyle + span:after
Estoy usando este enfoque en AngularJS porque agregará
.ng-invalid
clases automáticamente a los<input>
elementos del formulario y al formulario, pero no al<label>
.fuente
input:hover+span:after{color: blue}
. Voto a favor.:before
y:after
se aplican dentro de un contenedor, lo que significa que puede usarlo para elementos con una etiqueta final.En una nota al margen, los elementos que se cierran automáticamente (como img / hr / input) también se conocen como 'Elementos reemplazados', ya que se reemplazan con su contenido respectivo. "Objetos externos" por la falta de un término mejor. Una mejor lectura aquí
fuente
Usé
background-image
para crear el punto rojo para los campos obligatorios.Ver en Codepen
fuente
¡No puede poner un pseudo elemento en un elemento de entrada, pero puede poner un elemento de sombra, como un marcador de posición!
Para hacer que funcione en otros navegadores, uso
:-moz-placeholder
,::-moz-placeholder
y:-ms-input-placeholder
en diferentes selectores . No se pueden agrupar los selectores, porque si un navegador no reconoce el selector invalida toda la declaración.ACTUALIZACIÓN : El código anterior funciona solo con preprocesador CSS (SASS, LESS ...), sin el uso de preprocesadores:
fuente
glyphicon-search
marcado sin tocar.Los pseudo elementos como
:after
,:before
son solo para elementos contenedores. Los elementos que comienzan y cierran en un solo lugar como<input/>
,<img>
etc., no son elementos contenedores y, por lo tanto, no se admiten pseudoelementos. Una vez que aplique un pseudo elemento al elemento contenedor como<div>
y si inspecciona el código (vea la imagen), puede entender lo que quiero decir. En realidad, el pseudo elemento se crea dentro del elemento contenedor. Esto no es posible en caso de<input>
o<img>
fuente
Una solución de trabajo en CSS puro:
El truco es suponer que hay un elemento dom después del campo de texto.
(*) Solución limitada, sin embargo:
Pero en la mayoría de los casos, conocemos nuestro código, por lo que esta solución parece eficiente y 100% CSS y 0% jQuery.
fuente
input#myTextField ~ span:before {
mucho mejor, pero span debería tener una clase realmente para ser más explícita como.tick
o.icon
Encontré esta publicación porque tenía el mismo problema, esta fue la solución que funcionó para mí. A diferencia de reemplazar el valor de la entrada, simplemente elimínelo y coloque absolutamente un tramo detrás del mismo que sea del mismo tamaño, el tramo puede tener una
:before
pseudo clase aplicada con la fuente de icono que elija.fuente
El mayor malentendido aquí es el significado de las palabras
before
yafter
. No se refieren al elemento en sí, sino al contenido del elemento. Entonces,element:before
está antes del contenido, yelement:after
está después del contenido, pero ambos todavía están dentro del elemento original.El
input
elemento no tiene contenido en la vista CSS y, por lo tanto, no tiene:before
o tiene:after
pseudo contenido. Esto es cierto para muchos otros elementos vacíos o reemplazados.No hay un pseudo elemento que se refiera al exterior del elemento.
En un universo diferente, estos pseudo elementos podrían haberse llamado de otra manera para aclarar esta distinción. Y alguien podría incluso haber propuesto un pseudo elemento que está realmente fuera del elemento. Hasta ahora, este no es el caso en este universo.
fuente
hr
siempre ha sido ambiguo desde el punto de vista de CSS, aunque lo ve más al hablar del color.Según una nota en la especificación CSS 2.1, la especificación "no define completamente la interacción de: before y: after con elementos reemplazados (como IMG en HTML). Esto se definirá con más detalle en una especificación futura ". Aunque
input
ya no es realmente un elemento reemplazado, la situación básica no ha cambiado: el efecto de:before
y:after
sobre él no está especificado y generalmente no tiene ningún efecto.La solución es encontrar un enfoque diferente para el problema que está tratando de abordar de esta manera. Poner contenido generado en un control de entrada de texto sería muy engañoso: para el usuario, parecería ser parte del valor inicial en el control, pero no se puede modificar, por lo que parecería ser algo forzado al comienzo del control, pero aún así no se enviaría como parte de los datos del formulario.
fuente
input
elementos, solo no especificado y dependiendo del navegador.Como otros explicaron, los
input
s son elementos vacíos reemplazados, por lo que la mayoría de los navegadores no le permitirán generar::before
ni::after
pseudoelementos en ellos.Sin embargo, el Grupo de Trabajo CSS está considerando permitir explícitamente
::before
y::after
en caso de que loinput
haya hechoappearance: none
.De https://lists.w3.org/Archives/Public/www-style/2016Mar/0190.html ,
fuente
prueba a continuación:
fuente
Debe tener algún tipo de envoltorio alrededor de la entrada para usar un pseudo-elemento anterior o posterior. Aquí hay un violín que tiene un antes en el contenedor contenedor de una entrada y luego coloca el antes dentro de la entrada, o al menos así lo parece. Obviamente, este es un trabajo alternativo pero efectivo en caso de apuro y se presta para ser receptivo. Puedes hacer esto fácilmente después si necesitas poner algún otro contenido.
Violín de trabajo
Signo de dólar dentro de una entrada como un pseudo-elemento: http://jsfiddle.net/kapunahele/ose4r8uj/1/
El HTML:
El CSS:
fuente
Si está tratando de diseñar un elemento de entrada con: before y: after, es probable que esté tratando de imitar los efectos de otros span, div o incluso elementos en su pila CSS.
Como señala la respuesta de Robert Koritnik,: before y: after solo pueden aplicarse a elementos de contenedor y los elementos de entrada no son contenedores.
SIN EMBARGO, HTML 5 introdujo el elemento de botón que es un contenedor y se comporta como un elemento de entrada [type = "submit | reset"].
fuente
Resumen
No funciona con
<input type="button">
, pero funciona bien con<input type="checkbox">
.Violín : http://jsfiddle.net/gb2wY/50/
HTML :
CSS :
fuente
:before
y:after
solo funciona para nodos que pueden tener nodos secundarios ya que insertan un nuevo nodo como el primer o el último nodo.fuente
Descubrí que puedes hacerlo así:
Mostrar fragmento de código
Debe tener un padre div que tome el relleno y el: después. El primer padre debe ser relativo y el segundo div debe ser absoluto para que pueda establecer la posición del after.
fuente
Tengo otra idea, use esto en su lugar:
fuente