Tres horas. Media hora para aprender a clasificar un problema de CSS antes de tocarlo, y dos horas y media construyendo una interfaz desconocida, reparando una hoja rota y cerrando la entrega de la unidad.
Hoy · Hoja de ruta
- 1. Aprende: Cómo se traduce una interfaz nueva a seis tipos de decisión, y cómo se diagnostica una página que se ve mal en lugar de rehacerla.
- 2. Haz: Construye una interfaz desde cero, repara una hoja de estilos rota clasificando cada fallo, y pasa la auditoría final a tu sitio.
- 3. Entrega: El sitio, la tabla forense, la matriz de revisión y la defensa.
Antes de empezar · 5 minutos, sin apuntes
- ¿Qué diferencia hay entre una transición y una transformación?
- Si una regla no aparece en DevTools, ¿qué causas revisarías? ¿Y si aparece tachada?
- Explica la diferencia entre corregir la causa y añadir una excepción.
Se explica
25 minutos · conceptos y demostración
Las dos mitades de la sesión son la misma habilidad vista de los dos lados: clasificar un problema antes de escribir código, y clasificar un fallo antes de corregirlo. Quien no clasifica, prueba cosas.
Dónde estábamos y dónde estamos
- UD1 · estructura, semántica, contenido, formularios, accesibilidad
- UD2 · presentación, Flexbox, Grid, responsive, componentes
- = un sitio web estático completo
Antes de tocar CSS, clasifica
Ante una interfaz que no has visto, la pregunta no es qué propiedad usar: es de qué tipo es cada problema. Son seis, y no todas las zonas necesitan las seis.
| Zona | Flujo normal | Tamaño | Espacio | Flexbox/Grid | Responsive | Estado |
|---|---|---|---|---|---|---|
| Navegación | ||||||
| Destacado | ||||||
| Catálogo | ||||||
| Botonera |
Dejar una zona en flujo normal también es una decisión, y muchas veces es la correcta.
Un ejemplo de cómo se razona una casilla: las tarjetas de un catálogo se repiten en filas y columnas y su número debe depender del espacio, lo cual apunta a Grid con una plantilla adaptable. Dentro de cada tarjeta, imagen, texto y acción forman una relación en una dimensión, así que puede bastar el flujo normal o un Flexbox. Se resuelve cada nivel por separado.
Diagnosticar, no rehacer
Recibirás una página que se ve mal. La tentación es borrarlo todo y empezar de cero, y es exactamente lo que no vas a poder hacer en un trabajo: el CSS que te toque arreglar será de otro, tendrá años y funcionará en sitios que no puedes romper.
- ¿Qué esperaba ver y qué veo?
- Inspeccionar el elemento concreto que falla
- ¿Qué reglas le llegan? ¿Cuáles están tachadas?
- ¿Es un problema de selector, de cascada, de caja o de layout?
- Corregir la causa, no el síntoma
El paso 4 es el que ahorra tiempo. Los cuatro tipos de problema se buscan en sitios distintos:
| Tipo | Síntoma | Dónde mirar |
|---|---|---|
| Selector | La regla no aparece en Styles | El nombre de la clase, la sintaxis, que el archivo cargue |
| Cascada | La regla aparece tachada | Especificidad y orden |
| Caja | El tamaño no es el que escribiste | Layout: box model, box-sizing, padding |
| Layout | Los elementos no se colocan bien | Los inspectores de Flexbox y de Grid |
Las cuatro pestañas
| Pestaña | Para qué |
|---|---|
| Elements | El árbol real, ya construido por el navegador |
| Styles | Las reglas que llegan al elemento, en orden, con las derrotadas tachadas |
| Computed | El valor final de cada propiedad, ya resuelto todo |
| Layout | El box model dibujado, y los inspectores de Grid y Flexbox |
Un procedimiento resuelve la mitad de los casos: en Styles, las casillas contiguas a cada declaración la desactivan en vivo. Desactivar propiedades una a una hasta que el problema desaparece te dice cuál era la culpable en veinte segundos, sin tocar el archivo.
La distinción que ahorra la mitad del trabajo
Si la regla no aparece en Styles, es de selector: una errata en la clase, un error de sintaxis en la regla anterior, o la hoja que no carga. Si aparece tachada, es de cascada: sí seleccionó el elemento y perdió el conflicto.
Son dos diagnósticos distintos y se buscan en sitios distintos. Confundirlos es la causa más habitual de perder una tarde.
Revisar el CSS de otra persona
Un compañero revisará tu proyecto. No evaluará si le gustan tus colores: eso no es revisable. Revisará lo técnico, y lo hará con el formato de la UD1: qué, por qué y qué harías tú.
| Aspecto | Problema encontrado | Propuesta |
|---|---|---|
| Responsive | El menú desborda a 360 px | Permitir flex-wrap o cambiar la disposición |
| Grid | Columnas fijas de 300 px | Usar minmax() con auto-fit |
| Imágenes | Se deforman en las tarjetas | Revisar dimensiones y añadir object-fit |
| Foco | No es visible en los botones | Definir un :focus-visible |
| CSS | Un color repetido catorce veces | Convertirlo en custom property |
| Cascada | Un !important en la cabecera |
Bajar la especificidad del selector que gana |
No todas las sugerencias tienen por qué ser correctas. Aprender a evaluar una revisión también forma parte del ejercicio, y rechazar una observación justificándola bien puntúa igual que aceptarla. La regla de la UD1 sigue vigente: se revisa el código, no a la persona.
Se trabaja
150 minutos · interfaz nueva, hoja rota y cierre del proyecto
Los dos primeros pasos construyen; el tercero y el cuarto reparan. Los dos últimos cierran la unidad.
Paso 1 · Clasifica antes de escribir · 15 min
Recibes una captura y el HTML semántico de una página de actividades. La interfaz contiene una cabecera con navegación, un bloque destacado, un catálogo de tarjetas, una botonera de filtros y un aviso final. No recibes ninguna pista sobre las propiedades.
Rellena la tabla de seis decisiones de la explicación, zona por zona, antes de escribir una sola línea de CSS. Cuando la tengas, contrasta dos casillas con un compañero: si no coincidís, las dos posturas tienen que poder defenderse.
Paso 2 · Construye y defiende la interfaz · 45 min
Se entrega el HTML y una hoja con variables, tipografía y el box model ya preparados. Faltan deliberadamente la distribución del catálogo, el comportamiento de la navegación y los estados de los controles. Completa primero esas tres decisiones y comprueba cada una en DevTools antes de continuar.
La solución debe cumplir estos requisitos sin framework:
- El contenido conserva una anchura legible y espacios coherentes.
- La navegación funciona en una línea cuando cabe y no desborda cuando deja de caber.
- El catálogo decide automáticamente cuántas columnas entran.
- Las imágenes conservan proporción y encajan sin deformarse.
- Los filtros y enlaces tienen estados de interacción y foco visibles.
- No existe scroll horizontal entre 320 px y 1600 px.
- Cada media query responde a una rotura que puedes señalar.
Al terminar, cambia un requisito: el orden de la navegación, la anchura mínima de tarjeta o la dirección de un componente. Predice el resultado, haz el cambio mínimo y explícalo. Una interfaz bien decidida absorbe ese cambio en pocos minutos.
Paso 3 · Quita el !important · 10 min
#main .listado div.card.producto {
margin-left: 37px !important;
}
Esta regla funciona. Di tres cosas que están mal en ella, y cómo quedaría bien.
Ver respuesta
1 · El !important. Esconde un conflicto en vez de resolverlo, y obliga a que cualquier ajuste futuro sea otro !important.
2 · La especificidad. Un id, dos clases, dos elementos y una clase más: ese selector no se puede sobrescribir con nada razonable. Con .producto bastaría.
3 · El número mágico. 37px no sale de ninguna decisión: sale de mirar una pantalla. Colocar mediante margin-left es además síntoma de que falta un sistema de layout: si es separación entre elementos de una lista, es gap.
Quedaría en algo así como .producto { } sin margen, y un gap en el contenedor.
Paso 4 · CSS forense · 40 min
Recibirás una página cuya hoja de estilos contiene fallos deliberados de todos los tipos:
- La hoja no carga en una de las páginas.
- Un selector escrito con una errata, que no selecciona nada.
- Una regla con especificidad innecesaria que impide ajustar nada.
- Un
!importantpuesto para tapar el problema anterior. - Un elemento que desborda horizontalmente.
- Un
widthfijo en píxeles que rompe en móvil. - Un Grid con columnas fijas que genera pistas demasiado estrechas.
- Un Flexbox sin
flex-wrapcuyo contenido no cabe. - Una imagen deformada.
position: absoluteusado para maquetar una zona entera.- El foco invisible por un
outline: none. - Un color repetido catorce veces.
- Dos media queries que se contradicen.
Tu trabajo:
- Localiza los problemas.
- Clasifica cada uno en selector, cascada, caja o layout. Esa columna es la que se evalúa.
- Corrígelos atacando la causa.
- Explica las tres correcciones más importantes.
| Fallo | Tipo | Cómo lo detectaste | Causa real | Corrección |
|---|---|---|---|---|
Estoy atascado · no sé por dónde empezar
Por lo que afecta a más cosas. Si la hoja no carga en una página, todo lo demás que veas ahí es ruido: arréglalo primero y vuelve a mirar.
Después, los desbordamientos, porque suelen tener una única causa que produce muchos síntomas. En último lugar, los detalles de cascada, que son locales.
Regla general de la sesión: si la regla no aparece en Styles es de selector; si aparece tachada es de cascada. Esa distinción te ahorra la mitad del trabajo.
Paso 5 · La auditoría final · 20 min
Recorre las cinco listas sobre tu propio sitio. Cada línea que no puedas marcar es trabajo pendiente de hoy.
Organización
- Existe una hoja externa y ninguna página tiene estilos en línea.
- Los nombres de clase describen el papel del elemento, no su aspecto.
- El archivo está ordenado y no hay reglas duplicadas.
- Los valores repetidos son variables con nombres que dicen su papel.
Cascada
- No hay
!important, salvo enprefers-reduced-motion. - Los selectores no son más específicos de lo necesario.
- No das estilo con
id. - Sabes explicar, de cualquier elemento, qué regla está ganando.
Caja y tipografía
box-sizing: border-boxestá declarado globalmente.paddingymarginse usan con una finalidad clara, y la separación entre elementos esgap.- No hay anchuras rígidas que rompan en pantallas pequeñas.
- Hay jerarquía visual, el texto es legible y el
line-heightes razonable. - Los tamaños no dependen exclusivamente de píxeles.
Layout y responsive
- Flexbox donde el problema es de una dimensión, Grid donde hay filas y columnas.
- No se maqueta con
position: absoluteni con tablas. - El sitio funciona a 320, 375, 768, 1024 y 1440 px.
- No hay scroll horizontal en ninguna anchura.
- Cada breakpoint responde a un problema del contenido que puedes nombrar.
- Las imágenes se adaptan y ninguna está deformada.
Accesibilidad y calidad
- El foco es visible en todo lo interactivo.
- Los enlaces se distinguen sin depender solo del color.
- El contraste de texto llega a 4.5:1.
- El sitio se puede recorrer entero con el teclado.
- Se respeta
prefers-reduced-motion. - El CSS pasa el validador sin errores relevantes.
- El HTML sigue validando: no lo has roto para conseguir un efecto.
Paso 6 · Revisión por pares y cierre de la entrega · 20 min
Intercambia el proyecto y rellena la matriz de revisión con el formato qué / por qué / qué harías. Después recibe la tuya y decide qué aceptas, justificando lo que rechaces.
Se entrega:
- A · El sitio. El mismo de la UD1, convertido en una web completa: diseño coherente entre las cuatro páginas, variables CSS para las decisiones repetidas, Flexbox y Grid donde corresponda, navegación adaptable, catálogo responsive, formulario con estilo propio, imágenes adaptables, estados
:hovery:focus-visible, al menos una transición con una finalidad, y media queries solo donde hagan falta. - B · La tabla forense del paso 4, con la columna de tipo de problema.
- C · La matriz de revisión del proyecto de tu compañero.
- D · Tus decisiones, en media página: las tres decisiones de layout de las que estés más seguro, y por qué.
Dedica los últimos minutos a preparar la defensa. Tres minutos y cuatro preguntas:
- Enseña una parte de tu sitio que se adapte sin media query, y explica por qué no la necesita.
- ¿Dónde has puesto un breakpoint y qué te dijo el contenido que lo pusieras ahí?
- Enseña un sitio donde dudaste entre Flexbox y Grid, y por qué elegiste lo que elegiste.
- ¿Has tenido que tocar el HTML de la UD1? Si sí, ¿dónde y por qué?
La defensa incluye una prueba en vivo: se te pedirá un cambio pequeño sobre tu propio CSS. Convertir un Grid de tres columnas en dos, cambiar el eje de un Flexbox, hacer que el menú funcione a 360 px, o quitar un !important sin romper nada. Si no puedes hacerlo, no controlas el código que has entregado.
| Criterio de evaluación | Puntos |
|---|---|
| Responsive: adaptación fluida y breakpoints justificados | 2 |
| Layout con Grid | 1,5 |
| Layout con Flexbox | 1,5 |
| Sistema visual: variables, tipografía y espaciado | 1,5 |
Calidad de la cascada: selectores y ausencia de !important |
1,5 |
| Accesibilidad visual: foco, contraste y movimiento | 1 |
| Imágenes adaptables | 1 |
No puntúa que el sitio sea vistoso. Puntúa que aguante: que siga funcionando cuando cambia el contenido, cuando cambia la pantalla y cuando lo usa alguien que no ve la tuya.
Ampliación si has completado el trabajo
Primero termina la entrega. Los dos retos apuntan a lo que viene después de esta unidad: componentes que deciden por su propio espacio, y leer un diseño ajeno.
Reto 1 · El componente que no pregunta por la pantalla
Una media query pregunta por el viewport. Una container query pregunta por el espacio del contenedor del componente, que no es lo mismo: la misma tarjeta puede aparecer en una columna estrecha de la portada y en el ancho completo de la ficha.
.zona-producto {
container-type: inline-size;
}
@container (width >= 35rem) {
.producto { grid-template-columns: 1fr 2fr; }
}
- Coge tu tarjeta de producto y colócala en dos sitios de anchuras muy distintas de tu sitio.
- Resuélvela primero con una media query y anota qué falla: en una pantalla ancha, la tarjeta de la columna estrecha recibe la disposición ancha aunque no le quepa.
- Reescríbela con una container query y comprueba que ahora cada copia decide por su cuenta.
- Explica en tres líneas por qué una media query no podía resolver esto, por muchos breakpoints que le pusieras.
- Como segunda parte, reescribe un único componente con CSS anidado, donde
&representa al selector exterior. Limita el anidamiento a uno o dos niveles y comprueba con DevTools que no has creado selectores más específicos de lo necesario. Anota qué especificidad tenían antes y después.
Reto 2 · Copiar un diseño es leerlo
Recibirás la captura de una interfaz pequeña, sin su código, y tendrás que reproducirla con HTML y CSS.
El objetivo no es la coincidencia píxel a píxel. Antes de escribir nada, contesta por escrito sobre la captura:
- ¿Qué está agrupado con qué? Dibuja las cajas que ves, aunque no tengan borde.
- ¿Qué está alineado con qué? Las alineaciones invisibles son las que delatan la cuadrícula.
- ¿Qué espacios se repiten? Si encuentras tres medidas repetidas, ese es su sistema de espaciado.
- ¿Qué zonas son Grid y cuáles Flexbox? Justifica cada una con la regla de una o dos dimensiones.
- ¿Cuál es la jerarquía visual y con qué está construida: tamaño, peso, color o espacio?
Después constrúyela. Al terminar, compara tu respuesta 3 con las variables que has acabado escribiendo: si coinciden, has leído bien el diseño.
Cierre
5 minutos · comprobación y recuerdo
Lista de verificación de la entrega
- Las cuatro páginas pasan la auditoría completa.
- El HTML sigue validando y no lo has retorcido por motivos visuales.
- No has usado ningún framework CSS.
- La tabla forense está entregada con la columna de tipo de problema.
- Has revisado el proyecto de un compañero y decidido qué aceptas de la suya.
- Puedes hacer un cambio pequeño sobre tu propio CSS delante de alguien.
Antes de cerrar · 3 minutos, sin mirar
- ¿Qué seis tipos de decisión separas antes de escribir CSS?
- ¿Qué distingue un problema de selector de uno de cascada?
- ¿Para qué sirven las casillas junto a cada declaración en Styles?
- ¿Por qué no se arregla una página rota rehaciéndola de cero?
- ¿Qué se revisa en el CSS de otra persona, y qué no?
- ¿Qué diferencia hay entre una media query y una container query?
Ver respuestas
1 · Flujo normal, tamaño, espacio, distribución, comportamiento responsive y estado.
2 · Si la regla no aparece en Styles, no ha seleccionado nada: es de selector o de sintaxis. Si aparece tachada, sí seleccionó y perdió: es de cascada.
3 · Para desactivar propiedades en vivo y localizar cuál causa el problema sin tocar el archivo.
4 · Porque en un trabajo real el CSS es de otro, tiene años y funciona en sitios que no puedes romper. El segundo motivo es que rehacer el código no identifica dónde estaba el defecto.
5 · Se revisa lo técnico: cascada, responsive, accesibilidad, organización. No se revisa si gustan los colores.
6 · La media query pregunta por el viewport; la container query, por el espacio disponible del contenedor del componente.
Microprueba semanal 6 · 10 minutos
Individual, sin IA y sin apuntes. Trabajas sobre una interfaz desconocida.
- Identifica un problema de selector, uno de cascada y uno de layout.
- Corrige la causa con el CSS mínimo y justifica cada decisión.
- Realiza un cambio responsive nuevo sin copiar tu proyecto.