ejer-03-card-flex
Explicación de cómo funciona
Estructura visual de una tarjeta
Cada tarjeta .card-uno es un contenedor Flexbox en columna que organiza tres secciones:
Header (cabecera): Título o encabezado
Body (cuerpo): Contenido principal que se expande automáticamente gracias a
flex: 1Footer (pie): Contiene el botón/enlace, también organizado con Flexbox
El secreto: flex: 1 en .card-body
Hace que el cuerpo ocupe todo el espacio sobrante entre header y footer
Si una tarjeta tiene poco texto y otra mucho, ambas se ven equilibradas porque el cuerpo se estira
Sin esta propiedad, los footers quedarían desalineados (uno más arriba que otro)
Botones y enlaces unificados
.btn-ingresarse aplica tanto a<a>como a<button>En el footer,
display: flex+flex: 1en el botón hace que ocupe todo el ancho
🧠 Método para aprender y memorizar
1. Aprende haciendo (proyectos pequeños)
Repite este código escribiéndolo a mano línea por línea
Modifica colores, tamaños, espaciados y observa los cambios
Crea 5 tarjetas similares con diferentes contenidos
2. Memoriza conceptos clave (no líneas sueltas)
| Concepto | Significado | Cómo recordarlo |
|---|---|---|
display: flex | Activa el modo flexible | "Flex = flexible, organiza hijos" |
flex: 1 | Ocupa espacio sobrante | "El 1 significa 'una parte del pastel'" |
flex-direction: column | Organiza verticalmente | "Columna = arriba a abajo" |
justify-content: center | Centra horizontal | "Justificar = alinear" |
gap: 20px | Espacio entre elementos | "Gap = hueco" |
3. Técnica de "bloques lógicos"
Divide el CSS en estos 5 bloques y APRENDE UNO POR DÍA:
Reset universal (
* { margin:0; padding:0; ... })Layout contenedor (
.cards-containercon flex)Estructura tarjeta (
.card-uno+ header/body/footer)Botones e interacciones (
.btn-ingresar+ hover)Componentes específicos (estadísticas, subtítulos)
4. Asociaciones visuales (mnemotecnia)
box-sizing: border-box→ "La caja incluye el borde, como una pizza con borde incluido"flex: 1→ "El pulpo que estira sus tentáculos para llenar el espacio"cursor: pointer→ "La manita que dice '¡clícame!'"
5. Práctica activa diaria (15 minutos)
/* Reto: Cada día modifica algo */
/* Día 1: Cambia el color azul del botón a verde */
/* Día 2: Aumenta el gap entre tarjetas a 40px */
/* Día 3: Agrega un borde redondeado más grande */
/* Día 4: Añade una nueva tarjeta con otro contenido */6. Herramientas de depuración (aprende usándolas)
Abre Inspeccionar elemento (F12) en el navegador
Activa/desactiva
flex: 1para VER cómo cambia todoDale a los elementos bordes de colores temporales (
border: 2px solid red) para ver sus dimensiones reales
7. Regla mnemotécnica para propiedades Flexbox
"MAYO JEFE AL" (para recordar las propiedades principales):
Margin / Padding (separación interna/externa)
Align-items (alineación vertical)
Justify-content (alineación horizontal)
Flex-direction (dirección)
Gap (espacios)
Wrap (ajuste de líneas)
📝 Plan de estudio recomendado (1 semana)
Lunes: Escribe el reset universal y body. Comprende qué hace cada línea.
Martes: Crea el
.cards-containery una sola tarjeta. Experimenta conjustify-content.Miércoles: Añade header, body, footer. Introduce
flex: 1en body. Observa cómo se alinean los footers.Jueves: Estiliza botones y añade
hover. Prueba con<a>y<button>.Viernes: Crea los componentes adicionales (estadísticas, subtítulos).
Sábado: Construye una página nueva desde cero usando solo lo que recuerdas.
Domingo: Mezcla todo: crea 6 tarjetas diferentes con distintos contenidos.
La clave está en la repetición espaciada: hacer pequeños ejercicios cada día > estudiar 5 horas un solo día. ¡Tú puedes! 🚀
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <!-- Define la codificación de caracteres UTF-8 para soportar caracteres especiales --> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- Hace que la página sea responsive en móviles --> <title>Document</title> <!-- Título de la página que aparece en la pestaña del navegador --> </head> <style> /* ============================================ RESETEO BÁSICO (Universal) ============================================ */ * { margin: 0; /* Elimina todo margen exterior por defecto de todos los elementos */ padding: 0; /* Elimina todo relleno interior por defecto de todos los elementos */ box-sizing: border-box; /* Hace que el ancho/alto incluyan bordes y rellenos, no solo el contenido */ } /* ============================================ ESTILOS DEL CUERPO DE LA PÁGINA ============================================ */ body { background-color: #f0f0f0; /* Color gris claro de fondo para toda la página */ border: 5px solid red; /* Borde rojo de 5px para visualizar los límites del body */ padding: 20px; /* Espacio interno de 20px alrededor del contenido del body */ } /* ============================================ CONTENEDOR PRINCIPAL DE TARJETAS (FLEXBOX) ============================================ */ .cards-container { display: flex; /* Activa Flexbox para alinear las tarjetas horizontalmente */ justify-content: center; /* Centra las tarjetas horizontalmente dentro del contenedor */ gap: 20px; /* Espacio de 20px entre cada tarjeta */ /* align-items: stretch; (Comentado) Si se activa, hace que todas las tarjetas tengan la misma altura */ } /* ============================================ ESTILO BASE DE CADA TARJETA ============================================ */ .card-uno { background-color: white; /* Fondo blanco para cada tarjeta */ margin-top: 20px; /* Margen superior de 20px separa tarjetas de bordes superiores */ display: flex; /* Activa Flexbox DENTRO de la tarjeta para organizar header, body, footer verticalmente */ flex-direction: column; /* Organiza los hijos en columna (vertical: header arriba, body medio, footer abajo) */ width: 300px; /* Ancho fijo de 300px para todas las tarjetas */ border-radius: 12px; /* Bordes redondeados de 12px para un aspecto moderno */ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* Sombra sutil: desplazamiento X 0, Y 2px, difuminado 5px, color negro 10% opaco */ } /* ============================================ CABECERA DE LA TARJETA ============================================ */ .card-header { background-color: #f8f9fa; /* Color gris muy claro para el fondo de la cabecera */ border-bottom: 1px solid #dee2e6; /* Línea divisoria inferior gris de 1px */ padding: 10px; /* Espacio interno de 10px alrededor del contenido de la cabecera */ } /* ============================================ CUERPO PRINCIPAL DE LA TARJETA (ZONA FLEXIBLE) ============================================ */ .card-body { padding: 10px; /* Espacio interno de 10px alrededor del contenido del cuerpo */ flex: 1; /* ¡PROPIEDAD CLAVE! Hace que el body ocupe TODO el espacio disponible entre header y footer. Si el contenido es poco, se estira para empujar el footer abajo. Equivale a: flex-grow: 1, flex-shrink: 1, flex-basis: 0% */ } /* ============================================ PIE DE TARJETA (FOOTER) ============================================ */ .card-footer { border-top: 1px solid #dee2e6; /* Línea divisoria superior gris de 1px */ padding: 10px; /* Espacio interno de 10px alrededor del contenido del footer */ background-color: #f8f9fa; /* Fondo gris claro igual que el header para consistencia visual */ display: flex; /* Activa Flexbox dentro del footer para alinear el botón/enlace horizontalmente */ } /* ============================================ BOTÓN / ENLACE DE INGRESO (Estilo uniforme para button y a) ============================================ */ .btn-ingresar { flex: 1; /* Hace que el botón o enlace ocupe TODO el espacio disponible dentro del footer */ width: 100%; /* Ancho completo del contenedor padre (por si flex falla) */ padding: 8px; /* Espacio interno: 8px arriba/abajo, 8px izquierda/derecha */ background-color: #007bff; /* Color azul primario (Bootstrap blue) para el fondo del botón */ color: white; /* Texto en color blanco para máximo contraste sobre fondo azul */ border: none; /* Elimina el borde predeterminado que traen los botones HTML */ border-radius: 6px; /* Bordes ligeramente redondeados de 6px para suavizar el diseño */ cursor: pointer; /* Cambia el cursor a "mano" al pasar por encima (indica elemento clickeable) */ transition: background-color 0.3s; /* Transición suave de 0.3 segundos al cambiar color de fondo */ text-align: center; /* Centra el texto horizontalmente dentro del botón */ } /* ============================================ ESTILOS PARA ENLACES <a> (Hipervínculos) ============================================ */ a { text-decoration: none; /* Elimina el subrayado predeterminado que los navegadores ponen a los enlaces */ width: 100%; /* Asegura que el enlace ocupe todo el ancho disponible de su contenedor (el footer) */ } /* ============================================ EFECTO HOVER PARA BOTÓN (al pasar el mouse) ============================================ */ .btn-ingresar:hover { background-color: #0056b3; /* Cambia el fondo azul a un azul más oscuro cuando el mouse está encima */ } /* ============================================ ESTILOS PARA CONTENEDOR DE ESTADÍSTICAS ============================================ */ .stats-container { display: flex; /* Activa Flexbox para poner los dos cuadros de estadísticas uno al lado del otro */ justify-content: space-around; /* Distribuye el espacio uniformemente alrededor de cada ítem */ gap: 10px; /* Espacio de 10px entre cada ítem de estadística */ } /* ============================================ CADA ÍTEM DE ESTADÍSTICA (caja individual) ============================================ */ .stat-item { text-align: center; /* Centra el texto dentro de cada ítem (número y etiqueta) */ flex: 1; /* Hace que cada ítem ocupe el mismo espacio (se reparten el ancho equitativamente) */ background-color: #e9ecef; /* Fondo gris claro para destacar las estadísticas */ padding: 10px; /* Espacio interno de 10px alrededor del contenido del ítem */ border-radius: 8px; /* Bordes redondeados de 8px para cada ítem */ } /* ============================================ NÚMERO GRANDE DE LA ESTADÍSTICA ============================================ */ .stat-number { font-size: 24px; /* Tamaño de fuente grande de 24px para destacar el número */ font-weight: bold; /* Negrita para que el número resalte aún más */ color: #007bff; /* Color azul igual que el botón para mantener consistencia de diseño */ } /* ============================================ ETIQUETA DE LA ESTADÍSTICA ============================================ */ .stat-label { font-size: 12px; /* Tamaño de fuente pequeño de 12px para la descripción */ color: #6c757d; /* Color gris oscuro para que no compita con el número grande */ margin-top: 5px; /* Margen superior de 5px para separar la etiqueta del número */ } /* ============================================ ESTILO PARA SUBTÍTULO DE ROL (Inicie Sesión) ============================================ */ .rol-subtitulo { font-size: 14px; /* Tamaño de fuente mediano de 14px */ color: #28a745; /* Color verde para diferenciarlo de otros textos */ text-align: center; /* Centra el texto horizontalmente */ margin: 10px 0; /* Margen vertical de 10px (arriba y abajo), márgenes horizontales 0 */ } </style> <body> <!-- Contenedor principal que agrupa todas las tarjetas y las alinea con Flexbox --> <div class="cards-container"> <!-- Tarjeta para Secretaria: Muestra un rol específico --> <div class="card-uno"> <div class="card-header"> <h3>Secretaria</h3> <!-- Título de la cabecera --> </div> <div class="card-body"> <div class="rol-subtitulo">Inicie Sesión</div> <!-- Subtítulo con instrucción --> </div> <div class="card-footer"> <!-- Enlace estilizado como botón que lleva a login-doctor.php --> <a href="login-doctor.php" class="btn-ingresar">Ingresar</a> </div> </div> <!-- Tarjeta de ejemplo simple (segunda tarjeta, sin contenido significativo) --> <div class="card-uno"> <div class="card-header"> sotelo <!-- Texto simple en lugar de encabezado --> </div> <div class="card-body"> saul <!-- Texto simple en el cuerpo --> </div> <div class="card-footer"> suastegui <!-- Texto simple en el pie --> </div> </div> <!-- Tarjeta para Doctor: Similar a la primera pero con botón en lugar de enlace --> <div class="card-uno"> <div class="card-header"> <h3>Doctor</h3> <!-- Título de la cabecera --> </div> <div class="card-body"> <div class="rol-subtitulo">Inicie Sesión</div> <!-- Mismo subtítulo --> </div> <div class="card-footer"> <!-- Botón que al hacer clic muestra alerta --> <button class="btn-ingresar" onclick="alert('Acceso Doctor')">Ingresar</button> </div> </div> <!-- Tarjeta para Estadísticas: Muestra datos numéricos --> <div class="card-uno"> <div class="card-header"> <h3>Estadísticas</h3> <!-- Título relativo a datos estadísticos --> </div> <div class="card-body"> <!-- Contenedor con dos estadísticas: usuarios y visitantes --> <div class="stats-container"> <div class="stat-item"> <div class="stat-number">44</div> <!-- Número grande --> <div class="stat-label">User Registrations</div> <!-- Etiqueta descriptiva --> </div> <div class="stat-item"> <div class="stat-number">65</div> <div class="stat-label">Unique Visitors</div> </div> </div> </div> <div class="card-footer"> <!-- Botón de acceso general --> <button class="btn-ingresar" onclick="alert('Acceso General')">Ingresar</button> </div> </div> </div> </body> </html>

Comentarios
Publicar un comentario