ejer3-ejer1.html

 

📚 EXPLICACIÓN DETALLADA DE CÓMO FUNCIONA

La arquitectura Flexbox (visualizada)

text
PÁGINA COMPLETA:
┌────────────────────────────────────────────────────────┐
│  BODY (fondo gris, borde rojo, padding 20px)          │
│  ┌──────────────────────────────────────────────────┐  │
│  │  .cards-container (display: flex)                │  │
│  │  ┌──────────┐  ┌──────────┐  ┌──────────┐      │  │
│  │  │ Tarjeta1 │  │ Tarjeta2 │  │ Tarjeta3 │      │  │
│  │  │          │  │          │  │          │      │  │
│  │  │ Header   │  │ Header   │  │ Header   │      │  │
│  │  │──────────│  │──────────│  │──────────│      │  │
│  │  │ Body     │  │ Body     │  │ Body     │      │  │
│  │  │ (flex:1) │  │ (flex:1) │  │ (flex:1) │      │  │
│  │  │──────────│  │──────────│  │──────────│      │  │
│  │  │ Footer   │  │ Footer   │  │ Footer   │      │  │
│  │  └──────────┘  └──────────┘  └──────────┘      │  │
│  │                                                  │  │
│  └──────────────────────────────────────────────────┘  │
└────────────────────────────────────────────────────────┘

El secreto de flex: 1 en .card-body

Esta es la propiedad MÁS IMPORTANTE del diseño. Sin ella:

text
❌ SIN flex:1 (los footers quedan desalineados):
┌─────────┐  ┌─────────┐  ┌─────────┐
│ Header  │  │ Header  │  │ Header  │
├─────────┤  ├─────────┤  ├─────────┤
│ Body    │  │ Body    │  │ Body    │
│ (poco   │  │ (poco   │  │ (MUCHO  │
│ texto)  │  │ texto)  │  │ texto)  │
├─────────┤  ├─────────┤  ├─────────┤
│ Footer  │  │ Footer  │  │ texto   │
└─────────┘  └─────────┘  │ extra   │
                          ├─────────┤
                          │ Footer  │
                          └─────────┘
text
✅ CON flex:1 (todos los footers a la misma altura):
┌─────────┐  ┌─────────┐  ┌─────────┐
│ Header  │  │ Header  │  │ Header  │
├─────────┤  ├─────────┤  ├─────────┤
│         │  │         │  │ Body    │
│ Body    │  │ Body    │  │ con     │
│ se      │  │ se      │  │ MUCHO   │
│ expande │  │ expande │  │ texto   │
├─────────┤  ├─────────┤  ├─────────┤
│ Footer  │  │ Footer  │  │ Footer  │ ← ¡Todos igual!
└─────────┘  └─────────┘  └─────────┘

🧠 MÉTODO PARA APRENDER Y MEMORIZAR

Técnica 1: La "Regla de los 3 niveles"

Memoriza este patrón que se repite en TODOS los diseños con tarjetas:

NivelElementoPropiedades claveFrase para recordar
Nivel 1Contenedor padredisplay: flex
justify-content: center
gap: 20px
"Papá flex centra y separa"
Nivel 2Tarjetadisplay: flex
flex-direction: column
width: 300px
"Tarjeta apila y tiene ancho"
Nivel 3Body de tarjetaflex: 1"Body se come el espacio ★"

Técnica 2: Asociaciones visuales (mnemotecnia)

text
display: flex        → 🦸‍♂️ "El superpoder que ordena"
justify-content      → 📏 "Regla horizontal" (izquierda, centro, derecha)
align-items          → 📐 "Escuadra vertical" (arriba, centro, abajo, estirar)
gap                  → ⬜ "Hueco entre los dedos"
flex-direction       → 🧱 "Dirección de los ladrillos" (row = fila, column = columna)
flex: 1              → 🍕 "Se come la porción que sobra"
border-radius        → 🔘 "Esquinas redondas como pastilla"
box-shadow           → 🌑 "Sombra que da profundidad"

Técnica 3: El método de "construcción por capas" (memoriza este orden)

text
CAPA 1: RESET UNIVERSAL (siempre igual)
* { margin:0; padding:0; box-sizing: border-box; }

CAPA 2: BODY (fondo y espacio)
body { background-color: #f0f0f0; padding: 20px; }

CAPA 3: CONTENEDOR PADRE (organiza horizontalmente)
.contenedor {
    display: flex;
    justify-content: center;
    gap: 20px;
}

CAPA 4: TARJETA (organiza verticalmente)
.tarjeta {
    display: flex;
    flex-direction: column;
    width: 300px;
}

CAPA 5: DISTRIBUCIÓN INTERNA (clave)
.header { /* sin propiedad especial */ }
.body   { flex: 1; }  ← ¡LA MÁS IMPORTANTE!
.footer { /* sin propiedad especial */ }

Técnica 4: Práctica de "5 minutos diarios" (plan de una semana)

DíaActividadTiempo
LunesEscribe el RESET de memoria (margin:0; padding:0; box-sizing:border-box)5 min
MartesEscribe el contenedor padre (display:flex; justify-content:center; gap:20px)5 min
MiércolesEscribe la tarjeta (display:flex; flex-direction:column; width:300px)5 min
JuevesEscribe el body con flex:1 (¡la propiedad clave!)5 min
ViernesEscribe TODO el código desde cero sin mirar15 min
SábadoCrea 3 tarjetas diferentes (cambia colores, tamaños, contenido)20 min
DomingoExplica en voz alta cómo funciona a alguien más15 min

Técnica 5: Preguntas de autoevaluación

Responde estas preguntas con tus propias palabras:

  1. ¿Qué pasa si elimino flex: 1 del .card-body?

    • Respuesta: Los footers de las tarjetas quedarían a diferentes alturas, desalineados

  2. ¿Qué hace justify-content: center en el contenedor?

    • Respuesta: Centra horizontalmente todas las tarjetas dentro del contenedor

  3. ¿Para qué sirve gap: 20px?

    • Respuesta: Crea un espacio de 20px ENTRE cada tarjeta

  4. ¿Qué diferencia hay entre justify-content y align-items?

    • Respuesta: justify-content alinea en el eje PRINCIPAL (horizontal con row), align-items alinea en el eje CRUZADO (vertical con row)

  5. ¿Por qué usamos box-sizing: border-box?

    • Respuesta: Para que el padding y border se incluyan dentro del ancho total, facilitando el diseño

Técnica 6: El "esqueleto mental" que debes memorizar

css
/* Memoriza este patrón - es la BASE de todos los diseños con tarjetas */

/* 1. RESET */
* { margin:0; padding:0; box-sizing: border-box; }

/* 2. CONTENEDOR PADRE */
.contenedor {
    display: flex;           /* Activa flex */
    justify-content: center; /* Centra horizontal */
    gap: 20px;              /* Espacio entre tarjetas */
}

/* 3. TARJETA */
.tarjeta {
    display: flex;           /* Activa flex interno */
    flex-direction: column;  /* Apila vertical */
    width: 300px;           /* Ancho fijo */
}

/* 4. CUERPO EXPANDIBLE */
.tarjeta-body {
    flex: 1;  /* ← CLAVE: se expande */
}

Técnica 7: La prueba del "lápiz y papel"

Dibuja este diagrama en un papel sin mirar el código:

text
┌─────────────────────────────────────────────────┐
│  BODY (fondo gris, borde rojo, padding 20)      │
│  ┌───────────────────────────────────────────┐  │
│  │  .cards-container                         │  │
│  │  display: flex                            │  │
│  │  justify-content: center                  │  │
│  │  gap: 20px                                │  │
│  │  ┌─────────┐  ┌─────────┐  ┌─────────┐   │  │
│  │  │ Card 1  │  │ Card 2  │  │ Card 3  │   │  │
│  │  │ flex    │  │ flex    │  │ flex    │   │  │
│  │  │ column  │  │ column  │  │ column  │   │  │
│  │  │         │  │         │  │         │   │  │
│  │  │ Header  │  │ Header  │  │ Header  │   │  │
│  │  ├─────────┤  ├─────────┤  ├─────────┤   │  │
│  │  │ Body    │  │ Body    │  │ Body    │   │  │
│  │  │ flex:1  │  │ flex:1  │  │ flex:1  │   │  │
│  │  ├─────────┤  ├─────────┤  ├─────────┤   │  │
│  │  │ Footer  │  │ Footer  │  │ Footer  │   │  │
│  │  └─────────┘  └─────────┘  └─────────┘   │  │
│  └───────────────────────────────────────────┘  │
└─────────────────────────────────────────────────┘

Técnica 8: Las 7 líneas de CSS que debes saber de memoria

css
/* REPITE ESTAS 7 LÍNEAS TODOS LOS DÍAS */
* { margin: 0; padding: 0; box-sizing: border-box; }           /* Línea 1 */
body { background-color: #f0f0f0; padding: 20px; }             /* Línea 2 */
.container { display: flex; justify-content: center; gap: 20px; } /* Línea 3 */
.card { display: flex; flex-direction: column; width: 300px; } /* Línea 4 */
.card-header { background-color: #f8f9fa; padding: 10px; }     /* Línea 5 */
.card-body { padding: 10px; flex: 1; }                         /* Línea 6 ★ */
.card-footer { border-top: 1px solid #dee2e6; padding: 10px; } /* Línea 7 */

🎯 Resumen final

Lo que DEBES memorizar hoy:

  1. flex: 1 es la propiedad más importante → hace que el body se expanda

  2. display: flex en el padre → organiza tarjetas horizontalmente

  3. flex-direction: column en la tarjeta → apila header, body, footer

  4. justify-content: center → centra horizontalmente

  5. gap: 20px → espacio entre tarjetas

Ejercicio de memorización final:

Escribe este código en un papel 5 veces seguidas:

css
.card-body {
    flex: 1;  /* Hace que el body ocupe el espacio restante */
}

Repite esta línea en voz alta 10 veces: "Flex uno se come el espacio, alinea los footers con buen tino" 🚀

html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"> <!-- Define la codificación UTF-8 para soportar caracteres especiales (ñ, tildes, emojis) -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- Hace la página responsive en dispositivos móviles -->
    <title>Document</title> <!-- Título que aparece en la pestaña del navegador -->
</head>
<style>
    /* ============================================================
       RESET UNIVERSAL - Elimina márgenes y paddings por defecto
       ============================================================ */
    * {
        margin: 0;           /* Elimina el margen EXTERNO predeterminado de TODOS los elementos HTML */
        padding: 0;          /* Elimina el padding INTERNO predeterminado de TODOS los elementos HTML */
        box-sizing: border-box; /* Hace que el ancho/alto TOTAL incluyan padding y border, no solo el contenido */
        /* Ejemplo: un div con width:100px + padding:10px tendrá ancho TOTAL = 100px (no 120px) */
    }

    /* ============================================================
       ESTILOS DEL BODY - Cuerpo principal de la página
       ============================================================ */
    body {
        background-color: #f0f0f0; /* Color gris claro de fondo para toda la página */
        border: 5px solid red;     /* Borde rojo temporal (ÚTIL PARA DEPURACIÓN: muestra los límites exactos del body) */
        padding: 20px;             /* Espacio interno de 20px alrededor de TODO el contenido, separa del borde rojo */
    }

    /* ============================================================
       CONTENEDOR PRINCIPAL DE TARJETAS (PADRE FLEX)
       ============================================================ */
    .cards-container {
        display: flex;              /* Activa Flexbox para alinear las tarjetas horizontalmente */
        justify-content: center;    /* Centra horizontalmente TODAS las tarjetas como grupo dentro del contenedor */
        gap: 20px;                  /* Espacio de 20px ENTRE cada tarjeta (no en los bordes externos) */
        align-items: stretch;       /* Hace que TODAS las tarjetas tengan la MISMA altura (la del más alto) */
        /* stretch es el valor por defecto, pero lo escribimos explícitamente para claridad */
    }

    /* ============================================================
       TARJETA INDIVIDUAL (HIJO FLEX)
       ============================================================ */
    .card-uno {
        background-color: white;    /* Fondo blanco para cada tarjeta (contrasta con fondo gris del body) */
        margin-top: 20px;           /* Margen superior de 20px separa las tarjetas del borde superior del contenedor */
        display: flex;              /* Activa Flexbox DENTRO de la tarjeta para organizar su contenido interno */
        flex-direction: column;     /* Organiza el contenido VERTICALMENTE (header arriba, body medio, footer abajo) */
        width: 300px;               /* Ancho fijo de 300px para TODAS las tarjetas (uniformidad) */
        border-radius: 12px;        /* Bordes redondeados de 12px en las 4 esquinas (aspecto moderno) */
        box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* Sombra: desplazamiento X=0, Y=2px, difuminado=5px, color negro 10% opaco */
    }

    /* ============================================================
       HEADER DE LA TARJETA (Parte superior - Título)
       ============================================================ */
    .card-header {
        background-color: #f8f9fa;  /* Color gris muy claro (casi blanco) para el fondo del header */
        border-bottom: 1px solid #dee2e6; /* Línea divisoria inferior: 1px sólido gris claro (separa header de body) */
        padding: 10px;              /* Espacio interno de 10px alrededor del contenido del header */
    }

    /* ============================================================
       BODY DE LA TARJETA (Parte central - CONTENIDO PRINCIPAL)
       ============================================================ */
    .card-body {
        padding: 10px;              /* Espacio interno de 10px alrededor del contenido del body */
        flex: 1;                    /* ¡PROPIEDAD CLAVE! Hace que el body ocupe TODO el espacio disponible */
        /* flex:1 equivale a: flex-grow: 1, flex-shrink: 1, flex-basis: 0% */
        /* Esto significa: el body se EXPANDE para ocupar el espacio ENTRE header y footer */
    }

    /* ============================================================
       FOOTER DE LA TARJETA (Parte inferior - Botones/Enlaces)
       ============================================================ */
    .card-footer {
        border-top: 1px solid #dee2e6; /* Línea divisoria superior: 1px sólido gris claro (separa body de footer) */
        padding: 10px;                 /* Espacio interno de 10px alrededor del contenido del footer */
        background-color: #f8f9fa;     /* Color gris muy claro para el fondo del footer (coincide con header) */
    }

    /* ============================================================
       NOTA: Faltan estilos para mejorar la experiencia:
       - Los enlaces <a> no tienen estilo (aparecen como texto azul subrayado por defecto)
       - No hay efecto hover en los botones/enlaces
       - El footer debería tener display:flex para que el botón ocupe todo el ancho
       
       Para mejorarlo, agregarías:
       
       .card-footer {
           display: flex;  /* Para alinear el contenido */
       }
       
       a {
           text-decoration: none;  /* Quitar subrayado */
           background-color: #007bff;  /* Fondo azul */
           color: white;  /* Texto blanco */
           padding: 8px;  /* Espacio interno */
           border-radius: 6px;  /* Bordes redondeados */
           text-align: center;  /* Centrar texto */
           flex: 1;  /* Ocupar todo el espacio */
       }
       
       a:hover {
           background-color: #0056b3;  /* Azul más oscuro al pasar el mouse */
       }
       ============================================================ */
</style>
<body>
    <div class="cards-container">
        <!-- TARJETA 1: Secretaria -->
        <div class="card-uno">
            <div class="card-header">
               <h3>Secretaria</h3> <!-- Título de la cabecera -->
            </div>
            <div class="card-body">
              <p>Iniciar sesion</p> <!-- Texto de instrucción en el cuerpo -->
            </div>
            <div class="card-footer">
                <a>Ingresar</a> <!-- Enlace de ingreso (sin href por ahora) -->
            </div>
        </div>

        <!-- TARJETA 2: Secretaria (idéntica a la primera) -->
        <div class="card-uno">
            <div class="card-header">
               <h3>Secretaria</h3>
            </div>
            <div class="card-body">
              <p>Iniciar sesion</p>
            </div>
            <div class="card-footer">
                <a>Ingresar</a>
            </div>
        </div>

        <!-- TARJETA 3: Secretaria (idéntica a la primera) -->
        <div class="card-uno">
            <div class="card-header">
               <h3>Secretaria</h3>
            </div>
            <div class="card-body">
              <p>Iniciar sesion</p>
            </div>
            <div class="card-footer">
                <a>Ingresar</a>
            </div>
        </div>
    </div>
</body>
</html>


Comentarios

Entradas más populares de este blog

Tutorial de CSS: De Cero a Estilizar tu Primera Página Web

layouts

Proyecto Práctico: Tarjeta de Perfil