CSS es el lenguaje que convierte una estructura HTML en una interfaz visual. No se trata solo de colores y fuentes: CSS moderno te permite controlar el layout completo de una página, gestionar espacios, responder a distintos tamaños de pantalla y crear experiencias visuales coherentes.
En este nodo aprendes el modelo mental correcto para escribir CSS profesional desde el principio.
Cada elemento HTML es una caja rectangular con cuatro capas: content, padding, border y margin. Entender este modelo es fundamental para entender por qué los elementos se posicionan como lo hacen.
/* Siempre incluye esto en tu reset */
*, *::before, *::after {
box-sizing: border-box;
} Con box-sizing: border-box, el padding y el border se incluyen dentro del ancho declarado, lo cual hace los cálculos de layout mucho más predecibles. Sin esto, un elemento de width: 200px con padding: 20px ocuparía realmente 240px.
CSS aplica estilos en un orden de prioridad. Cuando dos reglas afectan al mismo elemento, gana la de mayor especificidad. Si tienen la misma especificidad, gana la que aparece última en el código.
/* Especificidad: 0-0-1 (un elemento) */
p { color: gray; }
/* Especificidad: 0-1-0 (una clase) */
.intro { color: black; }
/* Especificidad: 1-0-0 (un ID) — evitar en CSS de componentes */
#header { color: navy; } En la práctica: usa clases (.mi-clase) para casi todo, evita IDs en CSS y nunca uses !important como solución permanente.
Flexbox es el sistema de layout más útil para alinear elementos en una fila o columna. Se activa en el contenedor padre:
.nav {
display: flex;
align-items: center; /* alineación en el eje cruzado (vertical si flex-direction: row) */
justify-content: space-between; /* distribución en el eje principal */
gap: 1rem;
}
.card-list {
display: flex;
flex-wrap: wrap; /* los elementos saltan a la siguiente fila si no caben */
gap: 1.5rem;
}
.card-list > .card {
flex: 1 1 280px; /* crece, se encoge, con base mínima de 280px */
} Eje principal vs eje cruzado. Por defecto flex-direction: row, así que el eje principal es horizontal y el cruzado vertical. justify-content controla el eje principal; align-items controla el cruzado. Cuando cambias a flex-direction: column, se invierten.
Grid es ideal cuando necesitas controlar filas y columnas a la vez. Es el sistema más potente para estructurar layouts de página completos.
/* Layout de página clásico */
.page-layout {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header"
"sidebar content"
"footer footer";
min-height: 100dvh;
gap: 0;
}
.page-header { grid-area: header; }
.page-sidebar { grid-area: sidebar; }
.page-content { grid-area: content; }
.page-footer { grid-area: footer; }
/* Grid responsivo sin media queries */
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1.5rem;
} El truco de repeat(auto-fit, minmax(280px, 1fr)) crea automáticamente tantas columnas como quepan manteniendo un mínimo de 280px por columna. No necesitas media queries para este comportamiento.
Las variables CSS (propiedades personalizadas) son la forma de mantener consistencia en todo tu diseño. Se definen en :root y se usan en cualquier lugar:
:root {
/* Colores */
--color-texto: #1a1a1a;
--color-fondo: #f8f7f4;
--color-primario: #016b70;
--color-borde: rgba(0, 0, 0, 0.1);
/* Tipografía */
--fuente-cuerpo: 'Inter', sans-serif;
--texto-base: 1rem; /* 16px */
--texto-lg: 1.25rem; /* 20px */
--texto-xl: 1.5rem; /* 24px */
/* Espaciado */
--espacio-4: 1rem; /* 16px */
--espacio-6: 1.5rem; /* 24px */
--espacio-8: 2rem; /* 32px */
/* Radio */
--radio-md: 0.5rem;
--radio-lg: 0.75rem;
}
.btn {
background: var(--color-primario);
padding: 0.75rem var(--espacio-6);
border-radius: var(--radio-md);
font-size: var(--texto-base);
color: white;
border: none;
cursor: pointer;
} El enfoque correcto es mobile-first: escribe los estilos base para móvil y luego usa min-width para ampliar el diseño en pantallas más grandes.
/* Base: móvil */
.hero {
padding: 2rem 1rem;
text-align: center;
}
.hero h1 {
font-size: 1.75rem;
}
/* Tablet: 768px+ */
@media (min-width: 768px) {
.hero {
padding: 4rem 2rem;
text-align: left;
}
.hero h1 {
font-size: 2.5rem;
}
}
/* Desktop: 1024px+ */
@media (min-width: 1024px) {
.hero {
padding: 6rem 4rem;
display: grid;
grid-template-columns: 1fr 1fr;
align-items: center;
gap: 4rem;
}
.hero h1 {
font-size: 3.5rem;
}
} Las transiciones hacen las interfaces más naturales. Sólo añádelas a elementos interactivos:
.btn {
background: var(--color-primario);
transition: background 180ms ease, transform 180ms ease, box-shadow 180ms ease;
}
.btn:hover {
background: #014d52;
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.btn:active {
transform: translateY(0);
box-shadow: none;
} CSS parece sencillo al principio y frustrante cuando los elementos no se colocan donde esperas. La frustración desaparece cuando entiendes el modelo de caja, la cascada y los dos sistemas de layout modernos: Flexbox para componentes, Grid para páginas. El resto son detalles que aprendes sobre la marcha.