1. Cómo decide el navegador qué estilo aplicar
Es frecuente que dos reglas CSS digan cosas distintas del mismo elemento: una pone el título en azul y otra en rojo. Entender cómo resuelve el navegador esos conflictos es lo que separa escribir CSS a base de prueba y error de escribirlo con intención. El algoritmo se llama cascada y tiene en cuenta, por este orden, el origen y la importancia de la regla, su especificidad y, si empatan, cuál aparece la última.
| Selector | Especificidad | Ejemplo |
|---|---|---|
| Estilo en línea (style="…") | 1, 0, 0, 0 | <p style="color:red"> |
| Identificador | 0, 1, 0, 0 | #portada |
| Clase, atributo, pseudoclase | 0, 0, 1, 0 | .destacado, [type=email], :hover |
| Elemento, pseudoelemento | 0, 0, 0, 1 | p, ::before |
| Selector universal | 0, 0, 0, 0 | * |
La especificidad se compara columna a columna: una sola clase gana a cualquier número de elementos. Por eso las guías modernas recomiendan estilar casi todo con clases, que tienen una especificidad baja y uniforme, y evitar los identificadores y el !important: cada vez que uno de ellos gana una batalla, la siguiente regla necesitará algo todavía más fuerte, y la hoja de estilos se convierte en una carrera armamentística.
2. El modelo de caja y las unidades
Para el navegador, cada elemento es una caja formada por el contenido, el relleno (padding), el borde y el margen. Por defecto, width mide solo el contenido, así que una caja de 300px con 20px de relleno ocupa en realidad 340px. Casi todos los proyectos empiezan con la misma regla para que el ancho incluya relleno y borde, que es lo que uno espera:
1*, *::before, *::after { box-sizing: border-box; }| Unidad | Relativa a | Úsala para |
|---|---|---|
| px | Nada: es fija | Bordes y detalles finos |
| rem | El tamaño de letra de la raíz (normalmente 16px) | Tamaños de texto, espaciados: respeta la configuración del usuario |
| em | El tamaño de letra del propio elemento | Relleno de botones que crece con su texto |
| % | El tamaño del contenedor | Anchos relativos |
| vw / vh / dvh | El ancho / alto de la ventana | Secciones a pantalla completa (dvh tiene en cuenta las barras del móvil) |
| fr | El espacio libre de una rejilla | Columnas de CSS Grid |
| ch | El ancho del carácter «0» | Limitar la longitud de las líneas de texto (60-75ch) |
3. Flexbox: colocar en una dimensión
Flexbox coloca elementos en una fila o una columna y reparte entre ellos el espacio sobrante. Es la herramienta ideal para las piezas de una interfaz: una barra de navegación, los botones de un formulario, una tarjeta con su imagen y su texto. Todo gira en torno a dos ejes: el principal, que marca flex-direction, y el cruzado, perpendicular a él.
Flexbox es una estantería con los libros en fila
1.barra {
2 display: flex;
3 justify-content: space-between; /* eje principal: logo a un lado, menú al otro */
4 align-items: center; /* eje cruzado: centrados en vertical */
5 gap: 1rem; /* separación entre elementos */
6 flex-wrap: wrap; /* si no caben, a la línea siguiente */
7}
8
9.buscador { flex: 1; } /* ocupa todo el espacio que sobre */4. CSS Grid: colocar en dos dimensiones
Grid trabaja con filas y columnas a la vez, como una tabla invisible sobre la que colocas los elementos. Es la herramienta para la estructura de la página (cabecera, barra lateral, contenido, pie) y para cualquier colección de elementos en rejilla. La regla práctica: Flexbox para alinear piezas dentro de un componente, Grid para el esqueleto y las rejillas.
1.pagina {
2 display: grid;
3 grid-template-columns: 250px 1fr;
4 grid-template-areas:
5 "cabecera cabecera"
6 "lateral contenido"
7 "pie pie";
8 gap: 1.5rem;
9 min-height: 100dvh;
10}
11.pagina > header { grid-area: cabecera; }
12.pagina > aside { grid-area: lateral; }
13
14/* Una rejilla que decide sola cuántas columnas caben (mínimo 220px cada una) */
15.productos {
16 display: grid;
17 grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
18 gap: 1rem;
19}La última regla es de las más útiles de CSS: repeat(auto-fill, minmax(220px, 1fr)) crea tantas columnas de al menos 220px como quepan y reparte el resto del espacio entre ellas. La rejilla se adapta a cualquier pantalla sin una sola media query.
(sin mensajes)5. Diseño adaptable (responsive)
Más de la mitad de las visitas a una web llegan desde el móvil, y Google indexa la versión móvil de las páginas. Diseñar de forma adaptable significa que una misma página se reorganiza para verse bien en cualquier tamaño de pantalla. Descansa en cuatro ideas:
- La etiqueta
<meta name="viewport" content="width=device-width, initial-scale=1">, sin la cual el móvil simula una pantalla de escritorio y lo encoge todo. - Mobile first: los estilos base son para el móvil y las media queries con
min-widthañaden cambios para pantallas mayores. Es más fácil ampliar un diseño sencillo que recortar uno complejo. - Puntos de ruptura según el contenido, no según modelos de teléfono: añade una media query donde el diseño empiece a verse mal.
- Medidas fluidas: porcentajes,
fr,max-width: 100%en las imágenes yclamp()para textos que crecen con la pantalla.
1h1 { font-size: clamp(1.75rem, 1rem + 3vw, 3rem); } /* mínimo, ideal y máximo */
2img { max-width: 100%; height: auto; }
3
4.tarjeta { display: grid; gap: 1rem; }
5@media (min-width: 40rem) {
6 .tarjeta { grid-template-columns: 200px 1fr; } /* imagen al lado del texto */
7}
8
9/* Container queries: el componente se adapta a su contenedor, no a la pantalla */
10.lateral { container-type: inline-size; }
11@container (min-width: 30rem) {
12 .tarjeta { grid-template-columns: 1fr 2fr; }
13}Prueba en dispositivos reales
6. Retos de maquetación
En estos retos editas el CSS. Las pruebas miden dónde queda cada elemento, y en los retos adaptables también comprueban cómo se ve la página a 375px (un móvil) y a 1000px.
Retos
Centra .caja en horizontal y en vertical dentro de .contenedor usando Flexbox, sin márgenes ni posiciones calculadas a mano.
Coloca las fotos de .galeria en tres columnas del mismo ancho que ocupen todo el espacio disponible, con 16px de separación entre filas y columnas. Usa CSS Grid.
Diseña las tarjetas pensando primero en el móvil: una columna por defecto, dos columnas a partir de 600px de ancho y tres a partir de 900px, siempre con 16px de separación.
En pantallas de 600px o más, el logo va a la izquierda y el menú a la derecha, en la misma línea y centrados en vertical; los enlaces del menú, en fila con 24px de separación. En pantallas más estrechas, el menú pasa debajo del logo. Usa Flexbox.