card
Aquí tienes el código HTML con el CSS completamente documentado, explicando cada propiedad y su propósito en la maquetación:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Tarjeta Documentada</title> </head> <style> /* =============================================== SELECTOR UNIVERSAL - Reset inicial =============================================== Elimina los márgenes y paddings por defecto que todos los navegadores aplican a los elementos. Así partimos de una base limpia y consistente. */ *{ margin: 0; padding: 0; } /* =============================================== BODY - Contenedor principal de la página =============================================== - background-color: Define el color de fondo general (#f0f0f0 es un gris claro) - Es un elemento de bloque, por lo que ocupa todo el ancho disponible - Este color de fondo será el "lienzo" sobre el que se mostrará la tarjeta */ body{ background-color: #f0f0f0; } /* =============================================== .container - Contenedor externo (PADRE de .card) =============================================== - display: flex - Convierte este contenedor en un flex container - justify-content: center - Centra horizontalmente el elemento hijo (.card) - padding-top: 10px - Añade un pequeño espacio superior para separar la tarjeta del borde superior de la página FLUJO DE CAJAS: Aunque .card es un elemento de bloque que por defecto ocuparía todo el ancho, al estar dentro de un flex container, su comportamiento se ajusta al contexto flex. */ .container{ display: flex; justify-content: center; padding-top: 10px; } /* =============================================== .card - La tarjeta principal (PADRE de header, body, footer) =============================================== - background-color: white - Fondo blanco para destacar sobre el fondo gris - display: flex - Crea un contexto flex para sus hijos - flex-direction: column - Los hijos se colocarán en COLUMNA (uno debajo de otro) - width: 500px - Ancho fijo de la tarjeta (limita el espacio de TODOS los hijos) - border-radius: 8px - Bordes redondeados en TODAS las esquinas - box-shadow: 0 2px 5px rgba(0,0,0,0.1) - Sombra sutil para dar efecto de elevación (NOTA: Había una coma extra en rgba, la he corregido: rgba(0,0,0,0.1)) JERARQUÍA PADRE-HIJO: - El width:500px LIMITA el espacio disponible para header, body y footer - El border-radius afecta a la tarjeta, y los hijos deben adaptarse - El contexto flex permite controlar la disposición de los hijos */ .card{ background-color: white; display: flex; flex-direction: column; width: 500px; border-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); } /* =============================================== .card-header - Cabecera de la tarjeta (HIJO de .card) =============================================== - background-color: #f8f9fa - Fondo ligeramente gris para diferenciar la cabecera - border-radius: 8px 8px 0 0 - Redondea SOLO las esquinas superiores (hereda el concepto del padre pero se adapta) - padding: 20px - Espacio interno alrededor del contenido (h1) - display: flex - Convierte este elemento en flex container para centrar el h1 - align-items: center - Centra verticalmente el h1 - justify-content: center - Centra horizontalmente el h1 - border-bottom: 1px solid #dee2e6 - Línea divisoria sutil entre header y body AGRUPACIÓN VISUAL: Este div agrupa el título principal, diferenciándolo visualmente del contenido gracias a su fondo y borde inferior. */ .card-header{ background-color: #f8f9fa; border-radius: 8px 8px 0 0; padding: 20px; display: flex; align-items: center; justify-content: center; border-bottom: 1px solid #dee2e6; } /* =============================================== .card-body - Cuerpo de la tarjeta (HIJO de .card) =============================================== - padding: 30px 20px - Espacio interno: 30px arriba/abajo, 20px izquierda/derecha - background: white - Fondo blanco (aunque ya lo hereda, se especifica por claridad) - display: flex - Convierte este contenedor en flex container - flex-direction: column - Sus hijos (h2, p, button) se colocarán en columna - gap: 15px - Espacio ENTRE los hijos (h2, p y button). Fundamental para la relación visual entre elementos agrupados. AGRUPACIÓN VISUAL: Este div agrupa TODO el contenido principal. El gap:15px crea una relación uniforme entre los elementos, indicando que están relacionados pero son distintos. */ .card-body{ padding: 30px 20px; background: white; display: flex; flex-direction: column; gap: 15px; } /* =============================================== .card-body p y .card-body h2 - Elementos de texto (HIJOS de .card-body) =============================================== - width: 100% - Ocupan todo el ancho disponible del padre - text-align: center - Centran el texto horizontalmente FLUJO DE CAJAS: Aunque están dentro de un flex container, al tener width:100% se aseguran de ocupar todo el espacio horizontal, lo que contribuye a la sensación de "bloques" de texto centrados. */ .card-body p { width: 100%; text-align: center; } .card-body h2 { width: 100%; text-align: center; } /* =============================================== .card-body button - El botón (HIJO de .card-body) =============================================== - align-self: flex-start - ¡PROPIEDAD CLAVE! En un flex container con flex-direction: column, los hijos por defecto se estiran (stretch) para ocupar todo el ancho. Esta propiedad le dice al botón: "no te estires, alíneate al inicio (izquierda) y mantén tu tamaño natural". - background-color: #0d6efd - Azul primario (como Bootstrap) - color: white - Texto blanco para contraste - border: none - Quita el borde por defecto del botón - padding: 10px 20px - Espacio interno: 10px arriba/abajo, 20px izq/der - border-radius: 6px - Bordes ligeramente redondeados - cursor: pointer - Cambia el cursor a manita al pasar por encima - font-size: 16px - Tamaño de fuente legible JERARQUÍA PADRE-HIJO: El padre (.card-body) con display:flex crea el contexto que permite que align-self funcione. Sin el padre flex, align-self no tendría efecto. */ .card-body button { align-self: flex-start; background-color: #0d6efd; color: white; border: none; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-size: 16px; } /* =============================================== .card-footer - Pie de la tarjeta (HIJO de .card) =============================================== (No tiene estilos definidos en el CSS original, por lo que hereda los estilos por defecto. Al ser un div, es un elemento de bloque, por lo que ocupará todo el ancho y tendrá el fondo blanco del padre. El texto "3" aparecerá en la esquina superior izquierda por defecto.) Para mejorarlo, se podría añadir: - background-color: #f8f9fa (como el header) - padding: 15px 20px - text-align: center o border-top */ </style> <body> <!-- ESTRUCTURA DE CAJAS (Jerarquía Padre-Hijo): body (fondo gris) └── .container (flex, centra horizontalmente) └── .card (ancho 500px, fondo blanco, sombra) [PADRE] ├── .card-header (fondo gris claro, borde inferior) [HIJO] │ └── h1 (texto centrado) ├── .card-body (padding, flex columna, gap) [HIJO] │ ├── h2 (texto centrado, ancho completo) │ ├── p (texto centrado, ancho completo) │ └── button (align-self:flex-start, azul) └── .card-footer (texto "3", sin estilos) [HIJO] --> <div class="container"> <div class="card"> <div class="card-header"> <h1>Sotelo</h1> </div> <div class="card-body"> <h2>Special title treatment</h2> <p>With supporting text below as</p> <button>Go somewhere</button> </div> <div class="card-footer"> 3 </div> </div> </div> </body> </html>
Resumen de conceptos aplicados:
| Concepto | Ejemplo en el código |
|---|---|
| Maquetación de cajas | .card es la caja principal que contiene .card-header, .card-body, .card-footer |
| Flujo natural de bloques | Los div son bloques y se apilan verticalmente |
| Alteración del flujo con Flexbox | .card-body usa flex para organizar h2, p y button en columna |
| Agrupación visual | gap:15px en .card-body separa uniformemente los elementos relacionados |
| Jerarquía padre-hijo | .card define el ancho (500px) que limita a todos los hijos |
| Contexto flex | .card-body permite que align-self:flex-start funcione en el botón |
| Reset inicial | * {margin:0; padding:0} elimina estilos por defecto del navegador |
¡Excelente pregunta! Vamos a desglosar este código HTML y CSS en detalle, enfocándonos en los conceptos que mencionaste. Es una base fantástica para entender cómo funciona el diseño web.
Aquí tienes la explicación estructurada:
1. La Maquetación de Cajas
La maquetación de cajas es el proceso de dividir la interfaz en rectángulos (cajas) y luego colocar y estilizar esas cajas. En tu código, las cajas principales son:
body: Es la caja que lo contiene todo. En este caso, actúa como el fondo general de la página.div class="container": Es una caja contenedora. Su única función es centrar horizontalmente la tarjeta (card).div class="card": Esta es la caja más importante, la "tarjeta" principal. Es un rectángulo blanco con sombra que agrupa todo el contenido.div class="card-header": La primera sección de la tarjeta. Es una caja que contiene el título "Sotelo".div class="card-body": La segunda sección. Es una caja que contiene el título secundario (h2), el párrafo (p) y el botón (button).div class="card-footer": La tercera sección. Es una caja que contiene el texto "3".
Visualmente, estas cajas se apilan unas dentro de otras y unas encima de otras, formando la estructura que ves en pantalla. Es como un juego de bloques de construcción.
2. El Flujo Natural de las Cajas (Bloque vs. En Línea)
El flujo natural es cómo se colocan los elementos por defecto en una página web, sin que nosotros intervengamos demasiado. Aquí se ve una mezcla muy interesante:
Elementos de Bloque: Por defecto, ocupan todo el ancho disponible y generan un "salto de línea" después de ellos, apilándose verticalmente.
body,div(.container,.card,.card-header,.card-body,.card-footer),h1,h2,pson elementos de bloque. Por eso, aunque no hubiera CSS, el<h1>estaría encima del<div class="card-body">, y el<h2>dentro delcard-bodyestaría encima del<p>.
Elementos en Línea: Ocupan solo el espacio de su contenido y no generan saltos de línea, colocándose uno al lado del otro si hay espacio.
buttones un elemento en línea por defecto. Esto es clave: un botón, naturalmente, no quiere ocupar todo el ancho de su contenedor, solo lo necesario para su texto.
¿Cómo se comportan en tu código?
El
body,.containery.cardson bloques y se apilan verticalmente (aunque solo hay una tarjeta).Dentro de
.card, los hijos (.card-header,.card-body,.card-footer) son también bloques, por lo que se apilan verticalmente de forma natural. Esto ya nos da la estructura de tres franjas horizontales.La magia de
display: flex: El flujo natural se altera intencionadamente con Flexbox.En
.card,display: flexyflex-direction: columnhace que sus hijos (los tresdivs internos) se conviertan en elementos flexibles que se colocan en columna. Esto refuerza el apilamiento vertical, pero ahora tenemos un control mucho más fino sobre ellos.En
.card-body, el mismo principio:display: flexyflex-direction: columnconvierte al<h2>,<p>y<button>en elementos flexibles, colocándolos en columna.
3. La Agrupación de Elementos
La agrupación es la clave para crear relaciones visuales y componentes reutilizables.
.card: Es el grupo más grande. Agrupa visualmente el encabezado, el cuerpo y el pie de página. Al ponerle un fondo blanco, un borde redondeado y una sombra, le dices al usuario: "Estos tres elementos (header, body, footer) son una sola unidad, una tarjeta"..card-header: Agrupa el título principal (h1). Visualmente, al tener un fondo ligeramente gris (#f8f9fa) y una línea inferior (border-bottom), se separa del cuerpo y actúa como la "cabecera" de la tarjeta..card-body: Es el grupo más interesante. Agrupa el título secundario, la descripción y el botón. El espacio entre ellos se gestiona de manera uniforme congap: 15px. Esto crea una relación visual de "estos elementos forman el contenido principal y están relacionados". Singap, estarían pegados y parecerían un bloque de texto confuso..card-footer: Agrupa el texto "3", actuando como el cierre de la tarjeta.
4. La Jerarquía Padre-Hijo
Esta es la parte más importante del CSS. Las propiedades de un elemento padre afectan drásticamente a sus hijos.
Contención (El Padre como Límite):
El elemento
.cardtiene unwidth: 500px. Esto significa que todos sus hijos (.card-header,.card-body,.card-footer) están forzados a vivir dentro de ese ancho. Su contenido se ajustará a ese límite. El.card-headerno puede ser más ancho de 500px.El
border-radius: 8pxdel.cardafecta a las esquinas de la tarjeta. Luego, el.card-headertieneborder-radius: 8px 8px 0 0, que "recorta" las esquinas superiores. Esto es una herencia del concepto, no una propiedad heredada automáticamente, sino una adaptación para que encaje perfectamente con el padre.
Herencia (Propiedades que se transmiten):
La propiedad
color(color del texto) es heredable. Si elbodytuviera uncolor: gray;, todo el texto de la tarjeta sería gris. En tu código, no se define un color, por lo que se usa el negro por defecto del navegador.La propiedad
font-family(tipo de letra) también es heredable. Aquí no se define, pero si se definiera en elbody, todos los textos la heredarían.
El Poder de Flexbox en el Padre:
.card(padre de header, body, footer): Al serdisplay: flexconflex-direction: column, establece un contexto de formato flexible para sus hijos. Ahora, estos hijos (que antes eran simples bloques) se comportan según las reglas de Flexbox. Por ejemplo, podríamos hacer que elcard-bodycreciera para ocupar todo el espacio restante conflex-grow: 1, aunque en tu código no se hace..card-body(padre del h2, p, button): Aquí es donde vemos el impacto más claro.display: flexyflex-direction: columncolocan a los hijos en una columna.gap: 15pxes una propiedad del padre que afecta directamente el espacio entre los hijos. Es una forma muy limpia de gestionar la separación.El Caso del Botón: Por defecto, en un contenedor Flex con
flex-direction: column, los hijos se estiran para ocupar todo el ancho del contenedor (el eje transversal). Si no se hiciera nada, el botón (que es un elemento en línea) se convertiría en un "flex item" y se estiraría, ocupando los 500px de ancho, lo cual visualmente es horrible.La Solución
align-self: flex-start: Esta propiedad se aplica al hijo (el botón), pero solo tiene sentido porque el padre (.card-body) es un contenedor flex.align-selfle dice al padre: "Para este hijo en concreto, ignora la regla de estirado por defecto y alínealo al inicio del eje transversal (a la izquierda)". Así, el botón vuelve a su tamaño natural (solo el texto con supadding), solucionando el problema.
En resumen, el padre proporciona el lienzo y las reglas del juego, y los hijos se colocan y dibujan dentro de ese marco, pudiendo tener propiedades específicas que maticen o anulen las reglas generales del padre (como hace el botón).
Comentarios
Publicar un comentario