Selectores funcionales: :is(), :where(), :not() y patrones combinados

Aprende a reducir repetición, controlar especificidad y construir selectores mantenibles con :is(), :where() y :not(), combinándolos con estados y estructura real.

Los selectores funcionales reducen duplicación y hacen el CSS más legible cuando hay muchas variantes de un mismo patrón.

<code>:is()</code> agrupa selectores y conserva la especificidad más alta del grupo; <code>:where()</code> agrupa con especificidad 0.

<code>:not()</code> excluye casos concretos para evitar clases adicionales y reglas duplicadas.

  • Usa cada uno con intención: agrupar, resetear especificidad o excluir.
  • <code>:is()</code> simplifica listas repetidas. En lugar de escribir <code>header a, main a, footer a</code>, puedes escribir <code>:is(header, main, footer) a</code>.
  • <code>:where()</code> tiene especificidad 0, ideal para estilos base que no deben competir con clases de componentes.
  • <code>:not()</code> evita ramas duplicadas cuando quieres aplicar una regla general excepto unos pocos casos.
  • <code>:is()</code>: agrupa sin repetir prefijos.

Qué resuelve cada selector funcional

Usa cada uno con intención: agrupar, resetear especificidad o excluir.

<code>:is()</code> simplifica listas repetidas. En lugar de escribir <code>header a, main a, footer a</code>, puedes escribir <code>:is(header, main, footer) a</code>.

<code>:where()</code> tiene especificidad 0, ideal para estilos base que no deben competir con clases de componentes.

<code>:not()</code> evita ramas duplicadas cuando quieres aplicar una regla general excepto unos pocos casos.

  • <code>:is()</code>: agrupa sin repetir prefijos.
  • <code>:where()</code>: base fácil de sobrescribir.
  • <code>:not()</code>: exclusión explícita y mantenible.

Estrategia de especificidad

Evita guerras de especificidad desde el diseño del selector.

Si una regla es fundacional (tipografía base, espaciados por defecto), usa <code>:where()</code> para no bloquear overrides posteriores.

Reserva <code>:is()</code> para agrupaciones de selectores equivalentes dentro de componentes o layouts.

Combina con clases de utilidad para estados: <code>.is-active</code>, <code>.is-disabled</code>, y deja que el selector funcional reduzca repetición estructural.

CSS
54

Selectores funcionales: :is(), :where(), :not() y patrones combinados

Aprende a reducir repetición, controlar especificidad y construir selectores mantenibles con :is(), :where() y :not(), combinándolos con estados y estructura real.

Código del tema: display: grid; gap: 1rem;

📘 Teoría

Qué resuelve cada selector funcional

Usa cada uno con intención: agrupar, resetear especificidad o excluir.

:is() simplifica listas repetidas. En lugar de escribir header a, main a, footer a, puedes escribir :is(header, main, footer) a.

:where() tiene especificidad 0, ideal para estilos base que no deben competir con clases de componentes.

:not() evita ramas duplicadas cuando quieres aplicar una regla general excepto unos pocos casos.

  • :is(): agrupa sin repetir prefijos.
  • :where(): base fácil de sobrescribir.
  • :not(): exclusión explícita y mantenible.
Patrones típicos
:is(header, main, footer) a {
  color: #1d4ed8;
}

:where(article, section) h2 {
  margin-top: 0;
}

.button:not(.button--primary, .button--danger) {
  background: #e2e8f0;
  color: #0f172a;
}

Estrategia de especificidad

Evita guerras de especificidad desde el diseño del selector.

1

Si una regla es fundacional (tipografía base, espaciados por defecto), usa :where() para no bloquear overrides posteriores.

2

Reserva :is() para agrupaciones de selectores equivalentes dentro de componentes o layouts.

3

Combina con clases de utilidad para estados: .is-active, .is-disabled, y deja que el selector funcional reduzca repetición estructural.

Base baja + override claro
:where(.card, .panel, .sheet) h3 {
  font-size: 1.125rem;
  line-height: 1.35;
}

.card.featured h3 {
  font-size: 1.25rem;
}

🧪 Aprende probando

Ejemplo Demo: agrupar sin duplicar Refactoriza selectores repetidos con :is() y aplica base con :where().

🏁 Retos

Reto Reto: exclusión con :not() Aplica un estilo neutro a todos los botones salvo primary y danger.

🧰 Recursos

Test

Comprueba tus conocimientos con un test sobre CSS.

Test de CSS

¿Qué es esto?

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

Esta la hice en febrero de 2026 para facilitar el aprendizaje de mis alumnxs. Aprender desarrollo web practicando. La idea es que crezca semanalmente con nuevos temas, tests y retos.

Inspirado en MDN, en W3Schools, en Codepen, en el crack de Manz y en mil sitios de documentación sobre desarrollo web. Quería aportar además de bloques teóricos con ejemplos, la gamificación de los retos y el sistema de test que ya tenía en culTest .

Si te gustó, si no te gustó, si quieres saludarme, o invitarme a 🍻 no dudes en escribirme en cristianeslava@gmail.com .