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.
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:
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
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.
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.
Hasta ahora seleccionabas por etiqueta, clase e id.
Código del tema: a:hover::after
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.
| Selector | Nombre | Selecciona |
|---|---|---|
nav a | Descendiente | Todos los a que están dentro de nav, a cualquier profundidad. |
ul > li | Hijo directo | Los li que son hijos directos de ul. |
h2 + p | Hermano adyacente | El p que va justo después de un h2. |
h2 ~ p | Hermanos generales | Todos 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:
| Pseudoclase | Cuándo se aplica |
|---|---|
:hover | El puntero está encima. |
:focus-visible | Tiene el foco del teclado. |
:active | Se está pulsando. |
:visited | Enlace 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"). |
:target | El 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); }Un pseudoelemento (con ::) selecciona una parte de un elemento o añade contenido decorativo:
| Pseudoelemento | Qué hace |
|---|---|
::before, ::after | Añaden contenido antes o después (con content). |
::first-letter | La primera letra (capitulares). |
::first-line | La primera línea. |
::selection | El texto seleccionado por el usuario. |
::marker | La 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.
Cuando varias reglas compiten, gana la más específica. Una forma de contarla es con tres cifras (ids, clases/atributos/pseudoclases, etiquetas/pseudoelementos):
| Selector | Especificidad |
|---|---|
p | 0‑0‑1 |
.aviso | 0‑1‑0 |
nav a:hover | 0‑1‑2 |
#portada .titulo | 1‑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.