Qué hacen ::before y ::after
::before inserta una caja como primer hijo de un elemento y ::after como último hijo. Lo que va dentro de la caja lo define la propiedad content. No se agrega nada al HTML: el navegador lo genera desde el CSS.
El HTML solo contiene 9 y Tests pass. El signo de dólar, la etiqueta "/ month" y la marca de verificación vienen del CSS. Heredan los estilos del elemento (fuente, color) salvo que los sobrescribas, como hacen los ejemplos de arriba.
Sintaxis
selector::before {
content: "text"; /* required */
/* any other styles */
}
selector::after {
content: ""; /* empty string: a box with no text */
}
Valor de content | Resultado |
|---|---|
"text" | Un string. Usa "\A" para un salto de línea (con white-space: pre) y "\2192" para un carácter Unicode (→) |
"" | Una caja vacía, para formas y decoraciones |
attr(data-label) | El valor de un atributo del elemento |
counter(step) | El valor de un contador CSS |
open-quote / close-quote | Comillas según el idioma del elemento |
none o normal | Sin pseudoelemento (normal es el valor por defecto) |
content es obligatorio. Sin él, ::before y ::after nunca se crean, por muchas otras propiedades que les pongas.
Formas decorativas con content: ""
Con content: "", el pseudoelemento es una caja vacía a la que puedes dar tamaño y color. Por defecto es inline, y una caja inline ignora width y height, así que dale display: block, inline-block o position: absolute:
Posicionar un pseudoelemento
Para una decoración que va encima o alrededor del elemento, usa position: absolute en el pseudoelemento y position: relative en el propio elemento, así los desplazamientos se miden desde el elemento:
Fíjate en el orden al combinarlo con una pseudoclase: primero va el estado y luego el pseudoelemento, .link:hover::after, nunca .link::after:hover.
Leer atributos con attr(): un tooltip
attr() lleva el valor de un atributo a content, así una sola regla puede mostrar un texto distinto en cada elemento:
Un tooltip que solo aparece con hover es invisible para quienes usan teclado o pantalla táctil. Para cualquier cosa importante, pon el texto en la página, o muéstralo también con :focus y tabindex="0" en el elemento.
Numerar con contadores
Los contadores CSS y ::before numeran elementos sin escribir los números:
Agrega o quita un paso y los números se actualizan solos.
Dónde no funcionan ::before y ::after
Los pseudoelementos se insertan dentro del elemento, entre sus etiquetas. Los elementos que no tienen un interior para ellos no pueden mostrarlos:
<img>,<video>,<iframe>(elementos reemplazados)<input>,<select>,<textarea>(controles de formulario) y<br>
Algunos navegadores los dibujan en un checkbox o en una imagen rota, pero no de forma consistente. Pon el pseudoelemento en un contenedor: <span class="field"><input></span> y da estilo a .field::after.
Errores comunes
- Sin
content. Es la razón más común de que no se vea nada. Agregacontent: "". - Dar tamaño a un pseudoelemento inline.
widthyheightno hacen nada hasta que ponesdisplay: block,inline-blockoposition: absolute. - Orden incorrecto con un estado.
a:hover::afterfunciona;a::after:hoverno. - Posición absoluta sin un padre posicionado. El pseudoelemento se alinea entonces con algún ancestro lejano. Agrega
position: relativeal elemento. - Poner contenido real en el CSS. El texto de
contentno se puede seleccionar ni copiar. Deja la información en el HTML.
Preguntas frecuentes
¿Qué hace ::before en CSS?
Crea un pseudoelemento que es el primer hijo del elemento seleccionado, con lo que indique la propiedad content. ::after hace lo mismo como último hijo. Ninguno de los dos existe en el HTML, así que son útiles para íconos, etiquetas y decoraciones.
¿Por qué no se muestra mi ::before o ::after?
La razón más común es que falta la propiedad content: sin ella el pseudoelemento no se genera. Usa content: "" para una caja decorativa vacía. Otras causas: un pseudoelemento inline con ancho y alto (dale display: block o inline-block), o un elemento como <img> o <input> que no puede contenerlos.
¿Qué diferencia hay entre :before y ::before?
Ninguna en el comportamiento. ::before con dos signos de dos puntos es la sintaxis actual que marca los pseudoelementos; :before con uno es la forma antigua de CSS2, que los navegadores siguen aceptando para before, after, first-line y first-letter.
¿Puedo usar ::before en un img o un input?
No de forma fiable. Los pseudoelementos se insertan dentro del contenido del elemento, y los elementos reemplazados como <img> y los controles de formulario como <input> no tienen una caja de contenido para ellos. Envuelve el elemento en un <span> o un <div> y pon el pseudoelemento en el contenedor.
¿Los lectores de pantalla leen el contenido de ::before?
En general sí: el texto de content suele incluirse en el nombre accesible, pero no se puede seleccionar ni copiar. Deja la información real en el HTML y usa los pseudoelementos para decoración y pequeñas pistas visuales.