Organizando y escalando CSS

La primera hoja de estilos en un nuevo proyecto es un placer escribir. Después de unos pocos cientos de líneas, algo cambia: cambias el color de un botón y otros tres botones cambian también, un encabezado se niega a moverse hasta que pegues !important junto a él, y cada nueva regla parece que podría romper una antigua. El CSS en sí sigue siendo correcto. Lo que se ha agotado es la estructura que lo sostiene, y esa estructura, no la sintaxis, es lo que decide si una hoja de estilos se mantiene manejable a mil líneas o a cien mil.
Por qué CSS se vuelve difícil de escalar
CSS es global por defecto. Cada regla que escribes puede alcanzar cualquier elemento coincidente en cualquier lugar de la página. Escribe p { color: navy; } y cada párrafo en todo el proyecto se vuelve azul marino, aunque no tenías intención. En una página pequeña eso es conveniente. A medida que el proyecto crece, es la raíz de la mayoría de los problemas.
El problema aparece como reglas que colisionan. Dos hojas de estilos apuntan a p, o una regla general y una específica se aplican al mismo elemento, y ahora tienes que averiguar cuál gana. Viste la maquinaria que decide esto en cómo funciona CSS: el navegador resuelve conflictos por especificidad y orden. Escalar CSS bien es principalmente sobre no crear esos conflictos en primer lugar.
/* Una regla global alcanzando cada párrafo en la página */
p {
color: navy;
}
/* Una segunda regla, en otro lugar, compitiendo por los mismos elementos */
.notice p {
color: crimson; /* gana dentro de .notice: más específica */
}Mantén la especificidad baja y plana
El hábito más útil es estilizar con clases, principalmente una clase a la vez. Una clase como .card es rápida de aplicar, reutilizable, e indolora de sobrescribir más tarde si lo necesitas, porque una sola clase es un nivel bajo y suave de especificidad.
El problema viene de dos cosas: ids y largas cadenas de selectores. Un id como #header es mucho más difícil de sobrescribir que una clase, y una cadena como .sidebar ul li a está vinculada a una estructura exacta. Prefiere una clase sencilla que puedas poner donde quieras:
/* Preferir: una sola clase, baja y plana */
.nav-link {
color: navy;
}
/* Evitar: un id, difícil de sobrescribir después */
#nav-link {
color: navy;
}
/* Evitar: una cadena profunda, frágil y especificidad más alta */
.sidebar nav ul li a {
color: navy;
}.card o .nav-link. Una sola clase es rápida de reutilizar e indolora de sobrescribir más tarde, que es exactamente lo que quieres. Aléjate de ids como #header y cadenas largas como .sidebar ul li a, porque ambas son mucho más difíciles de cambiar. Una convención de nomenclatura
Una vez que estás estilizando con clases, la siguiente pregunta es cómo llamarlas. Nombres como .blue o .thing2 se caen rápido, porque no dicen nada sobre para qué es la clase. Una convención de nomenclatura es una forma acordada de nombrar clases para que el nombre te diga qué hace una clase y dónde pertenece.
La ampliamente utilizada se llama BEM, que significa Block, Element, Modifier. Un bloque es un componente como una tarjeta. Un elemento es una parte dentro de él, escrito con dos guiones bajos. Un modificador es una variación, escrito con dos guiones:
/* Bloque: el componente en sí */
.card { }
/* Elemento: una parte del bloque, dos guiones bajos */
.card__title { }
.card__body { }
/* Modificador: una variante del bloque, dos guiones */
.card--featured { }<article class="card card--featured">
<h2 class="card__title">Taller de fin de semana</h2>
<p class="card__body">Una breve introducción al diseño de página.</p>
</article>.card, un elemento dentro de él como .card__title con dos guiones bajos, y una variante como .card--featured con dos guiones. No tienes que usar BEM, pero elige un esquema consistente y cúmplelo. Estructurando los archivos
A medida que una hoja de estilos crece, un archivo largo se vuelve difícil de mover. La solución común es dividir CSS en algunas carpetas por lo que hacen las reglas: estilos base (los valores predeterminados para elementos simples como body y encabezados), componentes (las tarjetas, botones y otras piezas), y utilidades (minúsculos ayudantes de un propósito único como una clase de espaciado o alineación de texto).
Un detalle importa cuando divides archivos: el orden en que los cargas. Cuando dos reglas tienen la misma especificidad, la que viene después gana, así que una hoja de estilos cargada después puede sobrescribir una anterior. Carga tus archivos de más general a más específico:
/* main.css: el orden corre de menos a más específico */
@import "base/reset.css"; /* valores predeterminados de elemento */
@import "base/typography.css";
@import "components/card.css"; /* piezas autocontenidas */
@import "components/button.css";
@import "utilities/spacing.css"; /* cargadas última para que puedan sobrescribir */
@import "utilities/text.css";Haciendo la cascada explícita
Todo hasta ahora mantiene la cascada manejable por convención: especificidad baja, buenos nombres, orden de archivo cuidadoso. Hay más aquí a medida que profundizas, y vale la pena conocer la dirección del viaje. CSS moderno te permite tomar control del ordenamiento directamente en lugar de confiar en dónde sucede estar un archivo, y te da formas de mantener la cascada predecible a medida que más personas trabajan en la misma hoja de estilos. Encontrarás estas herramientas a medida que tus proyectos crecen, y los hábitos anteriores son lo que te prepara para ellos.

