Selectores avanzados, pseudoclases y pseudoelementos

Hasta ahora seleccionabas por etiqueta, clase e id.

Combinadores: descendiente (espacio), hijo (>), adyacente (+), hermanos (~).

Atributos: [href^="https"], [data-categoria="…"].

Pseudoclases (:) para estados y posiciones: :hover, :focus-visible, :nth-child, :not, :has, :target.

Pseudoelementos (::) para partes y adornos: ::before, ::after, ::first-letter.

  • Hasta ahora seleccionabas por etiqueta, clase e id. Con los selectores avanzados puedes dar estilo según la posición, el estado o los atributos de un elemento, sin llenar el HTML de clases.
  • SelectorNombreSelecciona nav aDescendienteTodos los a que están dentro de nav, a cualquier profundidad. ul > liHijo directoLos li que son hijos directos de ul. h2 + pHermano adyacenteEl p que va justo después de un h2. h2 ~ pHermanos generalesTodos los p que van después de un h2, con el mismo padre.
  • a[href^="https"] { /* empieza por https: enlaces externos */ } a[href$=".pdf"] { /* termina en .pdf */ } img[alt=""] { /* imágenes decorativas */ } [data-categoria="branding"] { /* atributos propios data-* */ }
  • Los atributos data-* serán muy útiles con JavaScript (por ejemplo, para filtrar proyectos por categoría, como en la lección Eventos).
  • Una pseudoclase (con :) selecciona un elemento en un estado o una posición:

Introducción

Hasta ahora seleccionabas por etiqueta, clase e id. Con los selectores avanzados puedes dar estilo según la posición, el estado o los atributos de un elemento, sin llenar el HTML de clases.

Combinadores

SelectorNombreSelecciona nav aDescendienteTodos los a que están dentro de nav, a cualquier profundidad. ul > liHijo directoLos li que son hijos directos de ul. h2 + pHermano adyacenteEl p que va justo después de un h2. h2 ~ pHermanos generalesTodos los p que van después de un h2, con el mismo padre.

Selectores de atributo

a[href^="https"] { /* empieza por https: enlaces externos */ } a[href$=".pdf"] { /* termina en .pdf */ } img[alt=""] { /* imágenes decorativas */ } [data-categoria="branding"] { /* atributos propios data-* */ }

Los atributos data-* serán muy útiles con JavaScript (por ejemplo, para filtrar proyectos por categoría, como en la lección Eventos).

Pseudoclases: estados y posiciones

Una pseudoclase (con :) selecciona un elemento en un estado o una posición:

PseudoclaseCuándo se aplica :hoverEl puntero está encima. :focus-visibleTiene el foco del teclado. :activeSe está pulsando. :visitedEnlace ya visitado. :first-child, :last-child, :nth-child(2n)Posición entre sus hermanos. :not(.destacado)Todos menos los que cumplen el selector. :has(img)Elementos que contienen algo (el "selector padre"). :targetEl elemento cuyo id coincide con el #ancla de la URL.

/* Tarjetas que contienen una imagen: sin relleno arriba */ .tarjeta:has(img) { padding-top: 0; } /* Filas alternas en una tabla */ tr:nth-child(even) { background: #f1f3f6; }

El orden de los estados de un enlace: LoVe HaTe

Pseudoelementos: partes y añadidos

Un pseudoelemento (con ::) selecciona una parte de un elemento o añade contenido decorativo:

PseudoelementoQué hace ::before, ::afterAñaden contenido antes o después (con content). ::first-letterLa primera letra (capitulares). ::first-lineLa primera línea. ::selectionEl texto seleccionado por el usuario. ::markerLa viñeta o número de una lista.

/* Capitular editorial */ .articulo p:first-of-type::first-letter { float: left; font-size: 3.5em; line-height: 0.9; margin-right: 0.1em; } /* Subrayado decorativo bajo los títulos */ h2::after { content: ""; display: block; width: 3rem; height: 4px; background: #e63946; margin-top: 0.5rem; }

⚠️ Atención. El contenido de ::before y ::after es decorativo: no lo uses para texto importante, porque no siempre lo leen los lectores de pantalla ni se puede seleccionar.

Especificidad

Cuando varias reglas compiten, gana la más específica. Una forma de contarla es con tres cifras (ids, clases/atributos/pseudoclases, etiquetas/pseudoelementos):

SelectorEspecificidad p0‑0‑1 .aviso0‑1‑0 nav a:hover0‑1‑2 #portada .titulo1‑1‑0

A igualdad, gana la última regla. El atributo style en el HTML y !important ganan a todo: evítalos, porque hacen el CSS difícil de mantener.

CSS
85

Selectores avanzados, pseudoclases y pseudoelementos

Hasta ahora seleccionabas por etiqueta, clase e id.

Código del tema: a:hover::after

📘 Teoría

Introducción

Hasta ahora seleccionabas por etiqueta, clase e id. Con los selectores avanzados puedes dar estilo según la posición, el estado o los atributos de un elemento, sin llenar el HTML de clases.

Combinadores

SelectorNombreSelecciona
nav aDescendienteTodos los a que están dentro de nav, a cualquier profundidad.
ul > liHijo directoLos li que son hijos directos de ul.
h2 + pHermano adyacenteEl p que va justo después de un h2.
h2 ~ pHermanos generalesTodos los p que van después de un h2, con el mismo padre.

Selectores de atributo

a[href^="https"]  { /* empieza por https: enlaces externos */ }
a[href$=".pdf"]   { /* termina en .pdf */ }
img[alt=""]       { /* imágenes decorativas */ }
[data-categoria="branding"] { /* atributos propios data-* */ }

Los atributos data-* serán muy útiles con JavaScript (por ejemplo, para filtrar proyectos por categoría, como en la lección Eventos).

Pseudoclases: estados y posiciones

Una pseudoclase (con :) selecciona un elemento en un estado o una posición:

PseudoclaseCuándo se aplica
:hoverEl puntero está encima.
:focus-visibleTiene el foco del teclado.
:activeSe está pulsando.
:visitedEnlace ya visitado.
:first-child, :last-child, :nth-child(2n)Posición entre sus hermanos.
:not(.destacado)Todos menos los que cumplen el selector.
:has(img)Elementos que contienen algo (el "selector padre").
:targetEl elemento cuyo id coincide con el #ancla de la URL.
/* Tarjetas que contienen una imagen: sin relleno arriba */
.tarjeta:has(img) { padding-top: 0; }

/* Filas alternas en una tabla */
tr:nth-child(even) { background: #f1f3f6; }

El orden de los estados de un enlace: LoVe HaTe

Si das estilo a varios estados de un enlace, escríbelos en este orden para que no se anulen entre sí: Link, Visited, Hover, Active (LoVe HAte), y añade :focus-visible junto a :hover.

a:link { color: #1d3557; }
a:visited { color: #6a4c93; }
a:hover, a:focus-visible { color: #e63946; }
a:active { color: #9d0208; }

Un visor sin JavaScript con :target

<a href="#obra-1">Ver cartel</a>
<div id="obra-1" class="visor">
  <img src="img/cartel.jpg" alt="Cartel del Festival de Otoño">
  <a href="#">Cerrar</a>
</div>
.visor { display: none; }
.visor:target { display: grid; place-items: center; position: fixed; inset: 0; background: rgb(0 0 0 / 0.85); }

Pseudoelementos: partes y añadidos

Un pseudoelemento (con ::) selecciona una parte de un elemento o añade contenido decorativo:

PseudoelementoQué hace
::before, ::afterAñaden contenido antes o después (con content).
::first-letterLa primera letra (capitulares).
::first-lineLa primera línea.
::selectionEl texto seleccionado por el usuario.
::markerLa viñeta o número de una lista.
/* Capitular editorial */
.articulo p:first-of-type::first-letter {
  float: left;
  font-size: 3.5em;
  line-height: 0.9;
  margin-right: 0.1em;
}

/* Subrayado decorativo bajo los títulos */
h2::after {
  content: "";
  display: block;
  width: 3rem;
  height: 4px;
  background: #e63946;
  margin-top: 0.5rem;
}

⚠️ Atención. El contenido de ::before y ::after es decorativo: no lo uses para texto importante, porque no siempre lo leen los lectores de pantalla ni se puede seleccionar.

Especificidad

Cuando varias reglas compiten, gana la más específica. Una forma de contarla es con tres cifras (ids, clases/atributos/pseudoclases, etiquetas/pseudoelementos):

SelectorEspecificidad
p0‑0‑1
.aviso0‑1‑0
nav a:hover0‑1‑2
#portada .titulo1‑1‑0

A igualdad, gana la última regla. El atributo style en el HTML y !important ganan a todo: evítalos, porque hacen el CSS difícil de mantener.

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros. culTest

La hice en febrero de 2026 para facilitar el aprendizaje de mis alumnos. La idea es aprender desarrollo web practicando y que el proyecto siga creciendo con nuevos temas, tests y retos.

Está inspirada en MDN, W3Schools, CodePen, Manz y muchos otros sitios de documentación sobre desarrollo web. Quería combinar teoría útil, ejemplos ejecutables, retos y el sistema de tests que ya tenía en culTest. culTest

Si te gustó, si no te gustó o si quieres escribirme, puedes hacerlo en cristianeslava@gmail.com