¿Qué es la cascada CSS?

Herencia, Estructura, Especificidad, Alcance y procedencia


Uno de los conceptos más importantes de CSS, y a la vez uno de los conceptos más desconocidos (o malentendidos) es el denominado concepto de la Cascada de CSS. De hecho, la cascada es un tema muy importante, ya que es la C inicial de las siglas CSS.

En algunos casos, el concepto de cascada —aunque importantísimo— puede resultar muy avanzado como para verlo en un tema de introducción. Si estás en una fase muy inicial de aprendizaje y aún no conoces bien HTML/CSS, te aconsejo aprender primero las bases de CSS.

¿Qué es la Cascada CSS?

Cuando hablamos de la Cascada CSS nos referimos al algoritmo (conjunto de reglas y normas) que tiene el navegador para aplicar estilos CSS a un elemento HTML. No es tan sencillo como la mayoría cree, ya que hay múltiples casos (¡muchísimos!) donde pueden existir ambigüedades, y el navegador debe resolverlas para saber que estilo debe aplicar primero y cuál después.

Imagina que tenemos enlazados dos archivos .css mediante una etiqueta <link> y en cada uno tenemos un mismo selector .text aplicando colores diferentes. ¿Cuál de los dos se aplicará finalmente? Quizás pienses que el último que haya sido definido. A veces, esto es cierto, pero muchas otras veces no.

La cascada participa mediante diferentes y variados mecanismos:

Cascada CSS

Para entender toda esta cantidad de información, este minicurso lo separaremos en varias categorías:

  • 1️⃣ Herencia: Los estilos CSS se pueden heredar y resetear.
  • 2️⃣ Estructura: Si hay un conflicto de estilos, depende mucho de la estructura CSS.
  • 3️⃣ Especificidad: Cuanto más específico un selector, mayor prioridad de aplicar estilos.
  • 4️⃣ Alcance: Podemos definir hasta donde queremos que se apliquen los estilos.

Cada uno de estos temas se cubrirá en varias categorías y lo explicaremos en detalle. Aún así, vamos a hacer un pequeño resumen antes de empezar, para tener claro que es cada punto.

Herencia

En CSS, el código que escribes y sus propiedades CSS se aplican al elemento que haces referencia en su selector. Sin embargo, existe un mecanismo denominado Herencia que permite que ciertas propiedades se puedan heredar de un elemento HTML hacia sus elementos HTML hijos.

Herencia CSS

Existen propiedades que tienen herencia y propiedades que no, además de mecanismos para forzarla o incluso es frecuente encontrar packs de reseteos para anular estilos que vienen por defecto en los navegadores y suelen ser problemáticos a la hora de desarrollar.

Estructura

A la hora de escribir nuestro código CSS debemos tener claro que dicho código tiene una cierta estructura. Dependiendo de varios detalles de esa estructura, el código puede contener conflictos donde 2 o más elementos tienen estilos que se contradicen y el navegador debe saber resolver ese conflicto.

Estructura y conflictos de CSS

En CSS, un detalle muy conocido es la posibillidad de añadir el texto !important al final de un valor para forzar al navegador a darle prioridad a ese estilo sobre otros. Sin embargo, esto es una forma muy burda de resolver el problema, ya que muy probablemente estés añadiendo varios problemas más.

Especificidad

La Especificidad CSS es una de las partes más importantes de la Cascada de CSS, y también de las más desconocidas. Aprender como el navegador calcula la especificidad y resuelve estos conflictos, te da la capacidad de entender como funciona CSS.

Control de especificidad

Además, estos conflictos son muy comunes en CSS, y existen formas mucho más limpias de resolverlos sin tener que recurrir a un !important, donde potencialmente añadimos problemas adicionales. Por ejemplo:

  • 1️⃣ Reducir especificidad: El combinador :where() nos permite escribir CSS con una especificidad muy baja, ideal para casos en los que sabemos que posteriormente necesitaremos sobreescribirla.

  • 2️⃣ Capas de cascada: La regla @layer nos permite crear capas (como las que tiene Photoshop) para aislar los estilos en diferentes capas y no tener problemas de especificidad CSS.

Alcance

Una característica deseable en CSS es poder controlar el alcance que tienen tus estilos, es decir, a que elementos HTML afectan. Tradicionalmente, CSS siempre ha tenido una naturaleza global, por lo que es una característica que existía de forma nativa.

Sin embargo, en las últimas versiones de CSS se han añadido mecánicas interesantes para gestionarlo. Además, el ecosistema de frameworks Javascript ha añadido formas no nativas de gestionarlo desde hace años.

Alcance (Scope) de CSS

  • 1️⃣ Limitar scope: Mediante la regla @scope podemos delimitar el alcance de los elementos HTML a los que van a afectas nuestros estilos.

  • 2️⃣ Encapsulación DOM: Tanto con Javascript, cómo sólo con HTML, se puede crear una encapsulación del DOM para limitar el alcance, utilizando Shadow DOM.

  • 3️⃣ Usando Javascript (mediante mecanismos no nativos) se han inventado metodologías, nomenclaturas o estrategias para controlar el alcance de estilos sin necesidad de soporte por parte del navegador.

¿Quién soy yo?

Soy Manz, vivo en Tenerife (España) y soy streamer partner en Twitch y profesor. Me apasiona el universo de la programación web, el diseño y desarrollo web y la tecnología en general. Aunque soy full-stack, mi pasión es el front-end, la terminal y crear cosas divertidas y locas.

Puedes encontrar más sobre mi en Manz.dev