Menu

Selectores CSS: tipos, combinadores y selectores de atributo

Un selector CSS elige los elementos a los que una regla da estilo. Aprende todos los tipos de selectores, los cuatro combinadores (descendiente, hijo, hermano adyacente, hermano general), los selectores de atributo y la agrupación, y prueba selectores en vivo.

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

Qué es un selector CSS

Un selector es la parte de una regla que va antes de las llaves. Decide a qué elementos se aplican las declaraciones.

p.note { color: #2563eb; }
/* selector: p.note    declaration: color: #2563eb */

Los cinco selectores básicos cubren la mayoría de las hojas de estilo reales:

Tipos de selectores de un vistazo

SelectorEjemploSelecciona
Universal*Todos los elementos
De tipopTodos los <p>
De clase.tipLos elementos con class="tip" (entre otras)
De ID#main-titleEl elemento con id="main-title"
De atributo[type="email"]Los elementos cuyo atributo coincide
Pseudoclasea:hover, li:first-childElementos en un estado o posición
Pseudoelementop::first-line, .x::beforeUna parte de un elemento
Grupoh1, h2, h3Todo lo que coincida con uno de la lista
Compuestop.tipUn <p> que además tiene la clase

Las clases y los IDs tienen su propia página, selector de clase CSS. Las pseudoclases como :nth-child() y :not() se explican en la página de pseudoclases.

Combinadores: descendiente vs hijo

Un combinador une dos selectores según su relación en el árbol HTML. Hay cuatro.

CombinadorSintaxisSelecciona B cuando
DescendienteA B (espacio)B está en cualquier parte dentro de A
HijoA > BEl padre de B es A
Hermano adyacenteA + BB viene justo después de A, con el mismo padre
Hermano generalA ~ BB viene en algún lugar después de A, con el mismo padre

El espacio y el > son la pareja que más se confunde. El selector descendiente llega a cualquier profundidad; el selector de hijo se queda en un nivel:

Combinadores de hermanos: + y ~

Los hermanos solo miran hacia adelante. No existe un combinador de "hermano anterior", aunque :has() puede expresarlo: h2:has(+ p) selecciona un h2 al que le sigue directamente un p.

Selectores de atributo

Los corchetes seleccionan por atributos y sus valores:

SelectorSelecciona
[disabled]Tiene el atributo, con cualquier valor
[type="email"]El valor es exactamente email
[href^="https"]El valor empieza con https
[href$=".pdf"]El valor termina con .pdf
[class*="icon"]El valor contiene icon en cualquier parte
[lang|="en"]El valor es en o empieza con en-
[data-state="open" i]Coincidencia exacta, sin distinguir mayúsculas

Los selectores de atributo sobre atributos data-* son una forma limpia de dar estilo a un estado que pone JavaScript, sin inventar nombres de clase.

Prueba cualquier selector

Escribe un selector en la caja. Cada elemento que coincide recibe un contorno ámbar, y el total aparece debajo.

Prueba #demo a, ul > li, h2 ~ *, a[href^="https"], li:not(.active).

Compuesto vs descendiente: el espacio importa

p.note y p .note se diferencian en un espacio y significan cosas distintas.

Cómo leen los selectores los navegadores

Cuando varias reglas coinciden con el mismo elemento y definen la misma propiedad, gana el selector más específico y, si empatan, gana el posterior. Un ID pesa más que cualquier cantidad de clases, y una clase pesa más que cualquier cantidad de selectores de tipo; la página de !important tiene la tabla completa de especificidad.

Los grupos tienen una trampa: si cualquier selector de una lista simple es inválido, se descarta toda la regla. En a, b:unknown { } ni siquiera los enlaces reciben estilo. Envolver la lista en :is() la hace tolerante, así que :is(a, b:unknown) sigue dando estilo a los enlaces.

Errores comunes

  • Olvidar el punto o la almohadilla. tip { } apunta a un elemento <tip>, no a class="tip". Escribe .tip.
  • Un espacio en un selector compuesto. p .note no es p.note.
  • Esperar que > llegue a los nietos. Usa un espacio para cualquier profundidad.
  • Un error de escritura rompe todo un grupo. En h1, h2:hovr, h3 nada recibe estilo.
  • Selectores demasiado largos. body div.wrapper ul li a es difícil de leer y de sobrescribir. Una sola clase suele ser suficiente.

Preguntas frecuentes

¿Qué es un selector CSS?

La parte de una regla CSS que va antes de { y que indica a qué elementos se aplican las declaraciones. En p.note { color: blue; }, el selector p.note selecciona todos los <p> con la clase note.

¿Qué diferencia hay entre un espacio y > en un selector CSS?

El espacio es el combinador descendiente: nav a selecciona todos los enlaces que están en cualquier parte dentro de un nav, a cualquier profundidad. > es el combinador de hijo: nav > a selecciona solo los enlaces cuyo padre directo es el nav.

¿Qué significa + en CSS?

+ es el combinador de hermano adyacente. h2 + p selecciona un <p> que viene justo después de un <h2> con el mismo padre. ~ es más amplio: h2 ~ p selecciona todos los hermanos <p> posteriores.

¿Cómo selecciono elementos por atributo en CSS?

Pon el atributo entre corchetes: [disabled] selecciona los elementos que lo tienen, [type="email"] un valor exacto, [href^="https"] un valor que empieza con un texto, [href$=".pdf"] uno que termina con él y [class*="btn"] uno que lo contiene.

¿CSS puede seleccionar un elemento padre?

Sí, con la pseudoclase :has(), compatible con las versiones actuales de Chrome, Firefox y Safari. li:has(> a.active) selecciona los elementos de lista que contienen directamente un enlace activo.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR