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
| Selector | Ejemplo | Selecciona |
|---|---|---|
| Universal | * | Todos los elementos |
| De tipo | p | Todos los <p> |
| De clase | .tip | Los elementos con class="tip" (entre otras) |
| De ID | #main-title | El elemento con id="main-title" |
| De atributo | [type="email"] | Los elementos cuyo atributo coincide |
| Pseudoclase | a:hover, li:first-child | Elementos en un estado o posición |
| Pseudoelemento | p::first-line, .x::before | Una parte de un elemento |
| Grupo | h1, h2, h3 | Todo lo que coincida con uno de la lista |
| Compuesto | p.tip | Un <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.
| Combinador | Sintaxis | Selecciona B cuando |
|---|---|---|
| Descendiente | A B (espacio) | B está en cualquier parte dentro de A |
| Hijo | A > B | El padre de B es A |
| Hermano adyacente | A + B | B viene justo después de A, con el mismo padre |
| Hermano general | A ~ B | B 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:
| Selector | Selecciona |
|---|---|
[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 aclass="tip". Escribe.tip. - Un espacio en un selector compuesto.
p .noteno esp.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, h3nada recibe estilo. - Selectores demasiado largos.
body div.wrapper ul li aes 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.