Menu

Pseudoelementos ::before y ::after en CSS con ejemplos

::before y ::after insertan contenido generado como primer y último hijo de un elemento, directamente desde CSS. Aprende la propiedad content, por qué hace falta un content vacío, cómo posicionarlos, tooltips con attr(), contadores y dónde no funcionan.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

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 contentResultado
"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-quoteComillas según el idioma del elemento
none o normalSin 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. Agrega content: "".
  • Dar tamaño a un pseudoelemento inline. width y height no hacen nada hasta que pones display: block, inline-block o position: absolute.
  • Orden incorrecto con un estado. a:hover::after funciona; a::after:hover no.
  • Posición absoluta sin un padre posicionado. El pseudoelemento se alinea entonces con algún ancestro lejano. Agrega position: relative al elemento.
  • Poner contenido real en el CSS. El texto de content no 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.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR