Duración estimada: 2 horas
Objetivos de aprendizaje
- Usar position: fixed para elementos que permanecen visibles al hacer scroll
- Definir y consumir variables CSS (custom properties) con var()
- Aplicar pseudo-clases estructurales: :nth-child(), :first-child, :last-child
- Usar backdrop-filter para efectos visuales de desenfoque
- Entender object-fit y object-position para controlar el encuadre de imágenes
Sesión 10 - Corrección de la Actividad MWC
Contenidos de la Sesión
Esta sesión se dedicó a la corrección y revisión de la actividad MWC de la sesión anterior (session09). Se recogieron los trabajos entregados, se mostraron algunos ejemplos de clase y se comentaron estrategias para mejorar la implementación y dominar la maquetación.
Se trabajó sobre dos ejemplos reales entregados por alumnos:
| Código original (from) | Código mejorado (to) |
|---|---|
example-1/from/ | example-1/to/ |
example-2/from/ | example-2/to/ |
Se fue modificando el código de ambos ejemplos en directo, explicando las decisiones de maquetación y las posibles mejoras. Los temas principales fueron: Flexbox, Box Model, position: fixed, variables CSS y las pseudo-clases :nth-child(), :first-child y :last-child.
1. position: fixed — Cabecera fija en pantalla
position: fixed saca al elemento del flujo normal del documento y lo posiciona relativo a la ventana del navegador. El elemento permanece visible aunque el usuario haga scroll.
header {
position: fixed;
top: 0;
width: 100%;
}
Important
Al fijar el header con position: fixed, este deja de ocupar espacio en el flujo del documento. Es necesario añadir un margen superior al contenido siguiente para que no quede oculto bajo la cabecera.
main {
margin-block: 100px; /* compensa la altura del header fijo */
}
| Valor | Descripción |
|---|---|
static | Posicionamiento normal (por defecto) |
relative | Se desplaza relativo a su posición original, sin salir del flujo |
absolute | Se posiciona relativo al ancestro posicionado más cercano |
fixed | Se posiciona relativo a la ventana; no se mueve con el scroll |
sticky | Se comporta como relative hasta que llega a un umbral, luego fija |
Propiedades que trabajan junto con position (excepto static):
top,right,bottom,left— desplazamiento desde cada bordez-index— capas de apilamiento (valores más altos aparecen por encima)
2. Variables CSS (custom properties)
Las variables CSS permiten definir valores reutilizables en toda la hoja de estilos. Se declaran con el prefijo -- dentro de un selector (normalmente :root para que sean globales) y se usan con la función var().
:root {
--color-primario: rgba(44, 44, 45, 0.252);
--color-de-fondo: rgb(243, 243, 243);
}
body {
background-color: var(--color-de-fondo);
}
header {
background-color: var(--color-primario);
}
button {
background-color: var(--color-primario);
}
Ventajas:
- Cambiar el valor de la variable lo actualiza en todos los lugares donde se usa.
- Facilita la creación de temas (modo oscuro/claro).
- Mejora la legibilidad del código al dar nombre semántico a los valores.
Note
Las variables CSS son sensibles a mayúsculas/minúsculas: --Color-Primario y --color-primario son variables diferentes.
3. backdrop-filter — Efecto de desenfoque
La propiedad backdrop-filter aplica efectos visuales (como desenfoque) al área detrás de un elemento. Es ideal para crear cabeceras translúcidas con efecto “cristal esmerilado”.
header {
position: fixed;
background-color: rgba(44, 44, 45, 0.252); /* fondo semitransparente */
backdrop-filter: blur(25px); /* desenfoca lo que hay detrás */
}
Tip
Para que backdrop-filter sea visible, el fondo del elemento debe ser semitransparente (usar rgba o hsla con opacidad < 1).
4. Pseudo-clases estructurales: :nth-child(), :first-child, :last-child
Las pseudo-clases estructurales permiten seleccionar elementos según su posición dentro del padre, sin necesidad de añadir clases extra en el HTML.
:first-child y :last-child
Seleccionan el primer y el último hijo de un contenedor, respectivamente.
/* el primer elemento de la lista sin borde superior */
li:first-child {
border-top: none;
}
/* el último elemento sin borde inferior */
li:last-child {
border-bottom: none;
}
:nth-child(n)
Permite seleccionar elementos según una fórmula. El parámetro puede ser:
| Expresión | Selecciona |
|---|---|
:nth-child(1) | El primer elemento (igual que :first-child) |
:nth-child(2) | El segundo elemento |
:nth-child(2n) | Los elementos pares (2, 4, 6…) |
:nth-child(2n+1) | Los elementos impares (1, 3, 5…) |
:nth-child(odd) | Los elementos impares (equivalente a 2n+1) |
:nth-child(even) | Los elementos pares (equivalente a 2n) |
:nth-child(-n+3) | Los tres primeros elementos |
Ejemplo del ejemplo-1 de la sesión — filas de tabla con colores alternos (zebra stripes):
tr:nth-child(2n) {
background-color: rgb(219, 219, 219); /* filas pares con fondo gris */
}
Ejemplo del ejemplo-1 de la sesión — destacar las dos primeras tarjetas de ponentes:
.gente > div:nth-child(1),
.gente > div:nth-child(2) {
border: 2px solid gold;
background-color: rgb(251, 248, 225);
outline: 4px dashed gold;
outline-offset: 5px;
box-shadow: 0 0 30px -5px gold;
}
5. outline y outline-offset
outline es similar a border pero no ocupa espacio en el box model; se dibuja por fuera del borde sin afectar al layout. outline-offset controla la separación entre el borde del elemento y el contorno.
.destacado {
outline: 4px dashed gold;
outline-offset: 5px; /* espacio entre el borde y el contorno */
}
Note
A diferencia de border, outline no tiene propiedades independientes para cada lado (outline-top, etc.). Se aplica de forma uniforme alrededor del elemento.
6. object-position — Controlar el recorte de imágenes
Cuando se usa object-fit: cover, la imagen se recorta para llenar el contenedor. object-position permite indicar qué parte de la imagen debe quedar visible.
.gente img {
width: 100%;
height: 234px;
object-fit: cover;
object-position: top; /* muestra la parte superior de la imagen */
}
| Valor | Descripción |
|---|---|
center (defecto) | Centra la imagen en el recorte |
top | Muestra la parte superior |
bottom | Muestra la parte inferior |
left, right | Desplaza la imagen a izquierda/derecha |
50% 20% | Posición exacta en X e Y |
7. overflow: hidden — Recorte de contenido desbordado
overflow: hidden oculta cualquier parte del contenido que sobresalga de los límites del elemento. Es muy útil para que las imágenes no rompan el border-radius de las tarjetas.
.gente > div {
border-radius: 6px;
overflow: hidden; /* la imagen no sobresale de las esquinas redondeadas */
}
8. Repaso de Flexbox y mejoras en el layout
Durante la corrección se revisaron varias estrategias de Flexbox aplicadas a los ejemplos:
Shorthand flex en los elementos del hero
.hero > * {
flex: 1 1 50%; /* crece, se encoge, tamaño base del 50% */
}
Esto es equivalente a:
.hero > * {
flex-grow: 1;
flex-shrink: 1;
flex-basis: 50%;
}
align-self para posicionar el botón
.herotext {
display: flex;
flex-direction: column;
gap: 1.5rem;
align-items: flex-start;
}
button {
align-self: flex-end; /* el botón se alinea al final del eje secundario */
}
Distribución del footer con flex-grow
.footer {
display: flex;
gap: 1em;
}
.footer > * {
flex-grow: 1;
flex-basis: 33%; /* cada columna ocupa un tercio */
}
Agenda con dos columnas flexibles
.agenda {
display: flex;
border: 1px solid rgb(200, 200, 200);
}
.agenda-times {
flex: 1; /* columna estrecha */
border-right: 1px solid rgb(200, 200, 200);
}
.agenda-events {
flex: 3; /* columna ancha (3 veces la anterior) */
}
9. Estructura de los ejemplos de la sesión
Example-1
Versión original entregada por un alumno (from) y código mejorado en clase (to).
from
to
example-1/
├── from/ — Código original del alumno
│ ├── index.html
│ ├── reset.css
│ ├── style.css
│ └── images/
└── to/ — Código mejorado en clase
├── index.html
├── reset.css
├── style.css
└── images/
Principales mejoras introducidas:
- Cabecera fija con
position: fixedy efectobackdrop-filter: blur() - Variables CSS con
:root - Tarjetas de ponentes con
overflow: hiddenyobject-position: top - Primeras dos tarjetas destacadas con
:nth-child(1)y:nth-child(2) - Filas de tabla con colores alternos con
:nth-child(2n) - Botón con
align-self: flex-end
Example-2
from
to
example-2/
├── from/ — Código original del alumno
│ ├── index.html
│ ├── reset.css
│ ├── style.css
│ └── (imágenes)
└── to/ — Código mejorado en clase
├── index.html
├── reset.css
├── style.css
└── img/
Principales mejoras introducidas:
- Footer con
ulen columna (flex-direction: column) para los enlaces - Clase auxiliar
ul.flex-rowpara la fila de iconos de redes sociales flex: 0 0 autoen loslipara que no se estiren ni encojan
Resumen
En esta sesión hemos repasado y ampliado:
- ✅ Revisión práctica de la actividad MWC con corrección en directo
- ✅
position: fixedpara fijar la cabecera en la parte superior de la pantalla - ✅ Variables CSS (
--variable: valoryvar()) para centralizar los colores - ✅
backdrop-filter: blur()para crear efectos de cristal esmerilado - ✅ Pseudo-clases
:first-child,:last-childy:nth-child(n)para seleccionar elementos por posición - ✅
outlineyoutline-offsetpara añadir contornos sin afectar al layout - ✅
object-positionpara controlar qué parte de una imagen queda visible al recortar - ✅
overflow: hiddenpara que las imágenes no rompan elborder-radius - ✅ Mejoras en la distribución con
flex,align-selfyflex-grow
Lo más importante:
Important
position: fixedrequiere compensar el espacio conmargin-blocken el contenido siguiente- Las variables CSS se declaran en
:rootcon--nombre: valory se usan convar(--nombre) :nth-child(2n)selecciona los elementos pares (ideal para zebra stripes en tablas)outlineno afecta al box model, al contrario queborderobject-positionsólo tiene efecto cuando se usa junto conobject-fit
Recursos Adicionales
- MDN - position
- MDN - Using CSS custom properties (variables)
- MDN - backdrop-filter
- MDN - :nth-child()
- MDN - :first-child
- MDN - :last-child
- MDN - outline
- MDN - object-position
- MDN - overflow
- CSS Tricks - A Complete Guide to Flexbox
Ejercicios prácticos
-
1. Cabecera fija con efecto glassmorphism
Crea una cabecera de página con position: fixed, fondo semitransparente y backdrop-filter: blur() para conseguir efecto de cristal.
-
2. Sistema de variables CSS
Refactoriza una hoja de estilos existente definiendo una paleta de colores, tipografías y espaciados como variables CSS en :root.
Checklist final
Al terminar esta sesión deberías ser capaz de:
- Sé usar position: fixed y entiendo respecto a qué se posiciona
- Puedo definir variables CSS en :root y usarlas con var(--nombre)
- Sé seleccionar elementos con :nth-child() y variantes
- Entiendo cómo funciona backdrop-filter y en qué navegadores está soportado
- Controlo el recorte de imágenes con object-fit: cover y object-position