Tengo problemas para comprender el comportamiento de la :after
propiedad CSS . Según la especificación ( aquí y aquí ):
Como sus nombres indican, las
:before
y los:after
pseudo-elementos especifican la ubicación del contenido antes y después del contenido del árbol de documentos de un elemento.
Esto no parece imponer restricciones sobre qué elementos pueden tener una propiedad :after
(o :before
). Sin embargo, parece que solo funciona con elementos específicos ... <p>
funciona, <img>
no lo <input>
hace , no lo <table>
hace. Podría probar más, pero el punto está claro. Tenga en cuenta que esto parece bastante consistente en todos los navegadores. ¿Qué determina si un objeto puede aceptar una propiedad :before
y :after
?
fuente
<before></before>
" en la fuente.<before></before>
. Debería haber dicho "fingir DOM" o algo así. El punto era mostrar que:before
y:after
están dentro del elemento, no fuera de él.:before
y:after
no funciona para elementos reemplazados; simplemente dice que no "define completamente" cómo y que esto se definirá en el futuro (lo que no ha sucedido hasta ahora). Lo que sucede en DOM es irrelevante aquí. Si bien los navegadores no admiten estos pseudoelementos para algunos elementos, esto no está en las especificaciones, solo lo que hacen las implementaciones.::before
y::after
no funciona para elementos nulos (vacíos) que nunca tienen contenido real, antes / después de lo cual podrían aplicarse. Pero, sorprendentemente, funcionan comohr
elemento en casi todos los navegadores.:before
y:after
no es necesario que funcionen para elementos reemplazados, y las especificaciones CSS no especifican cómo funcionarían para ellos, y el concepto de elemento reemplazado es algo vago.La especificación CSS 2.1 sugiere claramente que pueden funcionar para elementos reemplazados, simplemente diciendo que no "define completamente" cómo. Esto se relaciona con el problema de que se espera que un elemento reemplazado tenga su propia representación visual, que no está controlada por CSS, mientras que los pseudoelementos deberían agregar algo al contenido del elemento. La especificación agrega que esto se definirá "con más detalle" en una especificación futura, pero esto no ha ocurrido hasta ahora.
Los proveedores de navegadores simplemente decidieron evitar problemas al no implementar estos pseudoelementos para algunos elementos.
No está nada claro qué significa "elemento reemplazado", y el significado parece haber cambiado un poco. A menudo se interpreta que significa lo mismo que elemento vacío (un elemento con
EMPTY
contenido declarado, es decir, un elemento que no puede tener ningún contenido), pero CSS 2.1 muestra una hoja de estilo de muestra con el selectorbr:before
(aunque los navegadores han ignorado esto, implementandobr
su propio camino). Se puede argumentar que cada vez más elementos se han movido al alcance de la representación CSS, al menos en parte. Por ejemplo, uninput
elemento (incluida su fuente, colores, etc.) se puede controlar en gran medida con CSS en los navegadores modernos.No parecen navegadores (Firefox, IE, Chrome) para apoyar el
:after
y:before
pseudo-elementos para los elementos vacíos distintoshr
. Porquehr
, IE y Chrome colocan el contenido generado dentro de un cuadro con borde, que es la implementación dehr
; el contenido hace que la caja sea más alta. Firefox coloca el contenido de ambos (!) Pseudoelementos después de la regla horizontal que es su implementaciónhr
. Esta variación ilustra los tipos de problemas de "interacción" a los que se hace referencia en CSS 2.1.A menudo se afirma que estos pseudoelementos no se pueden utilizar para elementos vacíos ya que sus definiciones HTML no permiten ningún contenido. Este es un error de categoría. Las reglas de sintaxis de un lenguaje de marcado no restringen lo que puede hacer en CSS
Para concluir,
:after
y:before
actualmente no son utilizables para los elementos vacíos (excepto marginalmente ahr
), pero esto se debe principalmente a las implementaciones y puede cambiar en el futuro.fuente
Los elementos que no tienen etiqueta de cierre son elementos nulos y no pueden mostrar contenido dentro de ellos:
https://www.w3.org/TR/html5/syntax.html#void-elements
Todos los navegadores Blink, Webkit y Quantum le permiten crear pseudo elementos solo en las casillas de verificación, pero esto es controvertido ya que ninguna especificación permite este comportamiento.
Aquí un ejemplo: https://codepen.io/equinusocio/pen/BOBaEM/
fuente