Duración estimada: 3 horas
Objetivos de aprendizaje
- Aplicar flex-grow para que los ítems ocupen el espacio disponible de forma proporcional
- Usar flex-basis para definir el tamaño base de un ítem antes de la distribución
- Controlar el encogimiento de ítems con flex-shrink
- Usar la propiedad shorthand flex: grow shrink basis
- Añadir interactividad visual con la pseudo-clase :hover
Sesión 09 - Actividad de Maquetación con Flexbox
Fecha: 3 de Marzo de 2026
Contenidos de la Sesión
Esta sesión se dedicó íntegramente a una actividad práctica de maquetación con el objetivo de repasar y consolidar todo lo aprendido hasta ahora: HTML5 semántico, CSS Box Model y, especialmente, CSS Flexbox.
El enunciado completo de la actividad está disponible en el repositorio:
flex-activity.md— descripción textual de la actividadflex-activity.png— captura visual de referencia
El código de ejemplo desarrollado en clase se encuentra en la carpeta del repositorio: mwc/.
1. Repaso general de Flexbox
Antes de empezar la actividad se repasaron las propiedades de Flexbox vistas en la sesión anterior:
| Propiedad | Descripción |
|---|---|
display: flex | Activa el modelo Flexbox en el contenedor |
flex-direction | Define la dirección del eje principal (row, column) |
flex-wrap | Permite que los items se envuelvan a la siguiente línea |
justify-content | Alineación en el eje principal |
align-items | Alineación en el eje secundario |
align-content | Alineación de las líneas (cuando hay flex-wrap) |
gap | Espacio entre los flex items |
order | Cambia el orden visual de un flex item |
align-self | Sobreescribe align-items para un item concreto |
2. flex-grow - Crecer para ocupar espacio disponible
flex-grow define la capacidad de un flex item para crecer y ocupar el espacio libre disponible en el contenedor. Su valor es un número sin unidades que actúa como proporción.
- Valor
0(por defecto): el item no crece. - Valor
1o superior: el item sí crece para ocupar el espacio libre.
.contenedor {
display: flex;
}
.item-a {
flex-grow: 1; /* ocupa 1 parte del espacio libre */
}
.item-b {
flex-grow: 2; /* ocupa el doble de espacio libre que item-a */
}
Ejemplo en la actividad (tarjetas de ponentes):
.ponente {
flex-grow: 1; /* cada tarjeta crece para ocupar el espacio disponible */
}
Tip
Si todos los items tienen flex-grow: 1, el espacio libre se reparte de forma equitativa entre todos ellos.
3. flex-basis - Tamaño base de un flex item
flex-basis define el tamaño inicial de un flex item antes de que se distribuya el espacio libre. Es similar a width (en ejes horizontales) o height (en ejes verticales), pero específico para Flexbox.
.item {
flex-basis: 200px; /* el item empieza con 200px de ancho */
}
.item-auto {
flex-basis: auto; /* usa el tamaño de contenido (valor por defecto) */
}
Ejemplo en la actividad (tarjetas de ponentes):
.ponente {
flex-basis: 200px; /* tamaño base de cada tarjeta */
flex-grow: 1; /* pueden crecer si hay espacio disponible */
}
Note
En la actividad no se permite usar width fija en píxeles para las columnas de las tarjetas. En su lugar, se usa flex-basis junto con flex-grow para lograr un layout flexible y adaptable.
4. flex-shrink - Encoger cuando no hay espacio
flex-shrink define la capacidad de un flex item para encogerse cuando el contenedor no tiene suficiente espacio. Es el complemento de flex-grow.
- Valor
1(por defecto): el item puede encogerse. - Valor
0: el item no se encoge (mantiene suflex-basiso tamaño declarado).
.item-fijo {
flex-shrink: 0; /* no se encoge aunque no haya espacio */
flex-basis: 300px;
}
.item-flexible {
flex-shrink: 1; /* se encoge proporcionalmente (valor por defecto) */
}
5. La propiedad shorthand flex
Las tres propiedades anteriores (flex-grow, flex-shrink y flex-basis) se pueden escribir de forma abreviada con la propiedad flex:
.item {
/* flex: flex-grow flex-shrink flex-basis */
flex: 1 1 200px;
}
/* equivale a: */
.item {
flex-grow: 1;
flex-shrink: 1;
flex-basis: 200px;
}
Valores habituales:
flex: 1; /* flex: 1 1 0% — crece, se encoge, empieza desde 0 */
flex: auto; /* flex: 1 1 auto — crece, se encoge, usa tamaño natural */
flex: none; /* flex: 0 0 auto — no crece, no se encoge */
6. Pseudo-clase :hover
La pseudo-clase :hover permite aplicar estilos a un elemento cuando el cursor del ratón está encima de él. Es muy útil para dar retroalimentación visual al usuario en botones, enlaces y tarjetas.
selector:hover {
/* estilos que se aplican al pasar el ratón */
}
Ejemplo en la actividad (botones con efecto hover):
button {
background-color: rgb(71, 71, 165);
color: white;
padding: 0.5em 1em;
border: none;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background-color: rgb(50, 50, 130); /* color más oscuro al pasar el ratón */
}
Tip
Combinar :hover con la propiedad transition permite crear efectos de cambio suaves y atractivos. Este es el bonus opcional de la actividad.
7. Estructura de la actividad: Landing Page de evento tecnológico
La actividad consistió en maquetar una landing page de un evento tecnológico con las siguientes secciones, usando HTML5 semántico y Flexbox:
Header
Logo a la izquierda y menú de navegación a la derecha:
header {
display: flex;
justify-content: space-between;
align-items: center;
}
header nav ul {
display: flex;
list-style: none;
gap: 2em;
}
Hero Section
Texto e imagen en dos columnas:
.content-flex {
display: flex;
gap: 3em;
align-items: center;
}
.content-flex > img {
flex-basis: 50%;
flex-shrink: 0;
}
Sección de Ponentes (Cards)
Cuatro tarjetas distribuidas con flex-wrap, flex-basis y flex-grow (sin width fija en píxeles):
.ponentes {
display: flex;
flex-wrap: wrap;
gap: 1em;
}
.ponente {
flex-basis: 200px;
flex-grow: 1;
}
Agenda / Horario
Dos columnas: horarios a la izquierda, descripciones a la derecha.
Footer
Tres bloques distribuidos horizontalmente:
.columns-3 {
display: flex;
justify-content: space-between;
gap: 2em;
}
.column {
flex: 1;
}
8. Ejemplo desarrollado en clase: MWC
En clase se desarrolló el HTML completo del ejemplo mwc/ (Mobile World Congress) para ilustrar la estructura y se explicaron algunos casos de maquetación con Flex. El resto del CSS se dejó como práctica para completar en casa.
Estructura del ejemplo:
mwc/
├── index.html — HTML completo con todas las secciones
├── reset.css — Reset de CSS
├── style.css — Estilos con Flexbox
└── img/ — Imágenes del proyecto
Resumen
En esta sesión hemos practicado y consolidado:
- ✅ Maquetación completa de una landing page con HTML5 semántico
- ✅ Uso de Flexbox para estructurar todos los bloques del layout
- ✅
flex-growpara que los items ocupen el espacio disponible de forma proporcional - ✅
flex-basiscomo tamaño inicial de los flex items (alternativa flexible awidth) - ✅
flex-shrinkpara controlar cómo se encogen los items cuando falta espacio - ✅ La propiedad shorthand
flexque combinaflex-grow,flex-shrinkyflex-basis - ✅ La pseudo-clase
:hoverpara añadir interactividad visual
Lo más importante:
Important
- Usa
flex-basisen lugar dewidthfija cuando quieras que los elementos sean flexibles flex-grow: 1distribuye el espacio libre de forma equitativa entre los itemsflex: 1es la forma abreviada más habitual: crece, se encoge y empieza desde 0:hoverrequierecursor: pointeren el elemento para indicar al usuario que es interactivo
Recursos Adicionales
- MDN - flex-grow
- MDN - flex-shrink
- MDN - flex-basis
- MDN - flex (shorthand)
- MDN - :hover
- CSS Tricks - A Complete Guide to Flexbox
- Josh Comeau - An Interactive Guide to Flexbox
- Flexbox Froggy - Juego para practicar Flexbox
Ejercicios prácticos
-
1. Landing page de evento
Construye la landing page de un evento tecnológico real (MWC, Google I/O u otro) con secciones hero, características y footer, usando exclusivamente Flexbox para el layout.
-
2. Menú con hover
Crea un menú de navegación donde cada enlace cambia de color y fondo al hacer hover, usando transiciones suaves.
Checklist final
Al terminar esta sesión deberías ser capaz de:
- Entiendo cómo funciona flex-grow y para qué sirve
- Sé usar flex: 1 como forma compacta de flex-grow: 1 flex-shrink: 1 flex-basis: 0
- Puedo diseñar un layout completo de página usando solo Flexbox
- Sé aplicar estilos al hover con la pseudo-clase :hover
- Comprendo cómo flex-basis afecta al tamaño antes de crecer o encoger