Estoy tratando de usar el :afterpseudo-elemento CSS en un inputcampo, 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 spanalrededor de mi input, porque está siendo generado por un control de terceros.
html
css
pseudo-element
css-content
matra
fuente
fuente

border-colordelinput. Me parece más llamativo.Respuestas:
:aftery:beforeno 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:beforeo:afteren las entradas.:aftery:beforepseudo elementos, solo se pueden poner en elementos contenedores. ¿Por qué? Porque se agregan dentro de ese elemento en particular.inputNo es un contenedor.buttonpor 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.:beforey:afterrenderizar 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.
inputno puede contener otros elementos, por lo tanto, no son compatibles. A,buttonpor 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:beforey:after.<hr />? Pensé que no era un elemento contenedor, pero podría renderizar:aftery:beforejsfiddle.net/Uf88j/1pyh1, el contenido está dentro de la etiqueta, por lo que antes / después también aparecen dentro. Con elementos comoinputyhr, 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=texty 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:afterEstoy usando este enfoque en AngularJS porque agregará
.ng-invalidclases 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.:beforey:afterse 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-imagepara 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-placeholdery:-ms-input-placeholderen 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-searchmarcado sin tocar.Los pseudo elementos como
:after,:beforeson 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.ticko.iconEncontré 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
:beforepseudo clase aplicada con la fuente de icono que elija.fuente
El mayor malentendido aquí es el significado de las palabras
beforeyafter. No se refieren al elemento en sí, sino al contenido del elemento. Entonces,element:beforeestá antes del contenido, yelement:afterestá después del contenido, pero ambos todavía están dentro del elemento original.El
inputelemento no tiene contenido en la vista CSS y, por lo tanto, no tiene:beforeo tiene:afterpseudo 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
hrsiempre 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
inputya no es realmente un elemento reemplazado, la situación básica no ha cambiado: el efecto de:beforey:aftersobre é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
inputelementos, solo no especificado y dependiendo del navegador.Como otros explicaron, los
inputs son elementos vacíos reemplazados, por lo que la mayoría de los navegadores no le permitirán generar::beforeni::afterpseudoelementos en ellos.Sin embargo, el Grupo de Trabajo CSS está considerando permitir explícitamente
::beforey::afteren caso de que loinputhaya 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
:beforey:aftersolo 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