Saltar al contenido
Curso de CSS
Todos los cursos Ir al ejercicio →

Selectores y especificidad

  • ⏱ 40 minutos
  • 📶 Nivel: principiante
  • 🧩 Incluye ejercicio

💡 🎯 Al terminar esta lección podrás…

  • Elegir elementos con combinadores y selectores de atributo.
  • Aplicar estilos según estados y posiciones con pseudoclases.
  • Crear decoraciones con pseudoelementos.
  • Calcular la especificidad y escribir CSS fácil de mantener.

1.Selectores básicos

SelectorElige…Ejemplo
UniversalTodos los elementos* { … }
ElementoTodas las etiquetas de ese tipop { … }
ClaseElementos con class="aviso".aviso { … }
IdentificadorEl elemento con id="portada"#portada { … }
AgrupaciónVarios selectores con una sola reglah1, h2, h3 { … }
Elemento + claseSolo los p con esa clasep.aviso { … }
Varias clasesElementos con ambas clases.boton.grande { … }

💡 Consejo · Clases, no ids

Los id deben ser únicos y tienen mucha especificidad, lo que dificulta sobrescribirlos. Para dar estilo, usa clases. Reserva los id para enlaces ancla y para JavaScript.

2.Combinadores: relaciones entre elementos

Los combinadores te permiten elegir un elemento por su posición respecto a otros:

CombinadorSignificaEjemploElige…
(espacio)Descendiente (cualquier nivel)nav aTodos los a dentro de un nav
>Hijo directoul > liSolo los li que son hijos directos del ul
+Hermano inmediatoh2 + pEl p justo después de un h2
~Cualquier hermano posteriorh2 ~ pTodos los p posteriores al h2 (mismo padre)
✏️ Combinadores

Observa que el párrafo 3 es negrita pero no azul: es descendiente, pero no hijo directo.

3.Selectores de atributo

Eligen elementos según sus atributos. Son perfectos para formularios y enlaces, y evitan tener que inventar clases:

SelectorElige…
[disabled]Elementos que tienen el atributo
[type="email"]Atributo con ese valor exacto
[href^="https"]El valor empieza con…
[href$=".pdf"]El valor termina con…
[href*="ejemplo"]El valor contiene…
[class~="a"]Una palabra de la lista de clases
✏️ Enlaces externos y PDF

4.Pseudoclases: estados y posiciones

Una pseudoclase (con un solo :) elige un elemento en cierto estado o posición, sin necesitar una clase en el HTML:

PseudoclaseCuándo se aplica
:hoverEl cursor está encima
:focus / :focus-visibleEl elemento tiene el foco (:focus-visible solo con teclado)
:activeMientras se pulsa
:visited / :linkEnlace visitado / no visitado
:checked, :disabled, :requiredEstados de los campos de formulario
:valid / :invalidEl campo cumple (o no) su validación
:first-child, :last-childPrimer / último hijo de su padre
:nth-child(n)Por posición: 2, odd, even, 3n, n+2
:not(selector)Todo lo que no coincide con el selector
:is(a, b) y :where(a, b)Agrupa selectores sin repetir (:where no añade especificidad)
:has(selector)El elemento que contiene algo (el «selector padre»)
✏️ Estados y posiciones

📌 Nota · :has()

:has() es relativamente nuevo, pero ya funciona en todos los navegadores modernos. Permite cosas que antes necesitaban JavaScript, como estilizar una tarjeta según lo que contiene.

5.Pseudoelementos

Un pseudoelemento (con ::) elige una parte de un elemento o crea una decorativa:

PseudoelementoElige…
::before / ::afterContenido generado antes / después (requiere content)
::first-lineLa primera línea de un texto
::first-letterLa primera letra (capitulares)
::markerLa viñeta o el número de una lista
::placeholderEl texto de ayuda de un campo
::selectionEl texto seleccionado por la persona
✏️ Decoraciones con CSS

⚠️ Importante · content y accesibilidad

El texto generado con content no siempre lo leen los lectores de pantalla y no se puede seleccionar. Úsalo solo para decoración, nunca para información importante.

6.Especificidad: cómo se calcula

Cuando dos reglas apuntan al mismo elemento, gana la de mayor especificidad. Se calcula como tres números, de más a menos importante:

ColumnaCuenta…Ejemplos
AIdentificadores (#id)#portada → 1,0,0
BClases, atributos y pseudoclases.aviso, [type], :hover → 0,1,0
CElementos y pseudoelementosp, ::before → 0,0,1
SelectorEspecificidad
p0,0,1
.aviso0,1,0
p.aviso0,1,1
nav ul li a0,0,4
.menu .item:hover0,3,0
#portada1,0,0
#portada .titulo1,1,0

Se comparan columna a columna de izquierda a derecha, no se suman como un número. Así, un solo id (1,0,0) gana a cien clases (0,100,0).

✏️ ¿Quién gana?

Calcula la especificidad de cada regla en papel antes de mirar el resultado. Después quita el !important y vuelve a predecir.

7.Estrategia para mantener la especificidad baja

BEM en un ejemplo
.tarjeta { padding: 1rem; border: 1px solid #ddd; }
.tarjeta__titulo { font-size: 1.2rem; }
.tarjeta--destacada { border-color: #4f46e5; }

Con BEM cada selector tiene una sola clase (especificidad 0,1,0), así que el orden manda y nunca hay sorpresas.

8.Errores frecuentes

📒 Apuntes para llevar

  • Elementos, clases (.), ids (#), universal (*) y agrupación con comas son la base.
  • Combinadores: espacio (descendiente), > (hijo), + (hermano inmediato), ~ (hermanos posteriores).
  • Los selectores de atributo ([type="email"], [href^="https"]) estilizan sin añadir clases.
  • Las pseudoclases (:hover, :focus-visible, :nth-child(), :not(), :has()) eligen por estado o posición.
  • Los pseudoelementos (::before, ::after, ::first-letter, ::marker) eligen partes o crean decoración; ::before y ::after necesitan content.
  • Especificidad = (ids, clases/atributos/pseudoclases, elementos), comparada de izquierda a derecha.
  • Mantén la especificidad baja: clases, nombres por función y BEM.
  • Usa !important solo como último recurso.

9.Glosario

TérminoSignificado
CombinadorSímbolo que relaciona dos selectores (espacio, >, +, ~).
PseudoclaseEstado o posición de un elemento (:hover, :first-child).
PseudoelementoParte de un elemento o contenido generado (::before).
EspecificidadPeso de un selector para decidir qué regla gana.
BEMConvención de nombres: Bloque__Elemento--Modificador.
:has()Pseudoclase que elige un elemento según lo que contiene.
contentPropiedad que define el texto o imagen de ::before y ::after.
Selector de atributoSelector que elige por atributos y sus valores.

🧠 Comprueba lo aprendido

Elige una respuesta en cada pregunta. Verás al instante si acertaste y por qué.

¿Qué elige ul > li?

¿Cuál tiene mayor especificidad?

Escribes .caja::before { color: red; } y no aparece nada. ¿Qué falta?

¿Qué elige a[href$=".pdf"]?

¿Cuál es la especificidad de #menu .item:hover?

Tu progreso se guarda en este navegador y se refleja en el índice del curso.

💡 🚀 ¡Ahora te toca!

La práctica fija lo aprendido. Pasa al ejercicio de esta lección.

Ir al ejercicio