Saltar al contenido
Inicio 100 Días de Código en Python — Día 44: Fundamentos web — CSS intermedio

100 Días de Código en Python — Día 44: Fundamentos web — CSS intermedio

Nivel: Grado décimo Área: Tecnología e Informática Modalidad: Tutorial práctico Fuente: Curso "100 Days of Code: The Complete Python Pro Bootcamp" (Angela Yu, App Brewery). Contenido del Día 44 (bloque Web Foundation).

Este tutorial adapta pedagógicamente el Día 44. Las secciones 📝 Ejercicio original del curso provienen de los archivos del curso (transcripciones de las lecciones 326 a 330). Los archivos de inicio se descargan desde Udemy y no están en la carpeta, así que los fragmentos de los ejercicios originales son reconstrucciones a partir de lo que describe la profesora. Los retos 🟢🟡🟠🔴, el proyecto extra y el proyecto integrador son creaciones de esta adaptación. Las correcciones al material original aparecen como 🛠️ Nota técnica.

Nota sobre las verificaciones: el 26 de septiembre de 2026 se comprobó con Google Chrome 153 (modo headless) y Python 3.14 el comportamiento de los ejemplos marcados como "verificado": colapso de márgenes, em y rem, lighter y bolder, y el cálculo del tamaño de las cajas.


Tabla de contenidos

  1. Antes de empezar: las propiedades que más usarás
  2. Colores en CSS
  3. Propiedades de las fuentes
  4. Inspeccionar CSS con las herramientas para desarrolladores
  5. El modelo de caja: margen, relleno y borde
  6. 🚀 Proyecto del día: póster motivacional
  7. 🌟 Proyecto extra: galería de científicas y científicos colombianos
  8. 🏆 Proyecto integrador final del bloque web (Días 41 a 44)
  9. 🧩 Comprueba lo aprendido
  10. 🤖 Programar con apoyo de IA
  11. 🛠️ Correcciones técnicas al material original
  12. 📋 Matriz de trazabilidad
  13. 📦 Evidencias de aprendizaje del Día 44

0. Antes de empezar: las propiedades que más usarás

(Adaptación pedagógica.)

Ayer aprendimos dónde escribir CSS y a qué aplicarlo (selectores). Hoy aprendemos qué cambiar: colores, fuentes y espacios. Además, aprenderemos a investigar el CSS de cualquier página con las herramientas del navegador, algo que un desarrollador hace a diario.

Conexión con Python: hoy aparecen los números hexadecimales (base 16). Python los maneja de forma nativa, y lo usaremos para entender los códigos de color. También haremos cálculos de tamaños con el modelo de caja, igual que resolvíamos problemas numéricos con variables.

Este es el último día del bloque web. Al final encontrarás el proyecto integrador final, que reúne lo aprendido entre los Días 41 y 44.

Prerequisito: Día 43 (reglas CSS, CSS externo y selectores de elemento, clase e id).


1. Colores en CSS

(Fuente: 326 - CSS Colours.md)

🎯 Objetivo de aprendizaje

Aplicar colores de texto y de fondo usando nombres de color y códigos hexadecimales.

📖 Explicación conceptual

Propiedad Qué colorea
color El texto
background-color El fondo del elemento (el área que ocupa)

Colores con nombre (named colors): CSS reconoce muchos nombres, algunos "poéticos": cornflowerblue, cadetblue, dimgrey, olivedrab… La lista completa está en MDN (busca "MDN named color"). Los "niveles" de CSS que aparecen en esa tabla solo indican cuándo se agregó cada color.

Paletas profesionales: cuando quieras una combinación armoniosa, la profesora recomienda Color Hunt (colorhunt.co), con paletas hechas por diseñadores: un color para el fondo, otro para el h1, otro para los subtítulos, colores de acento…

Códigos hexadecimales: los colores de las paletas no tienen nombre, sino códigos como #5D3891. Cada color de pantalla se forma mezclando rojo, verde y azul (RGB), cada uno con un valor de 0 a 255. El código hexadecimal escribe esos tres números en base 16, con dos cifras cada uno:

Texto
#5D3891  →  5D = 93 (rojo) · 38 = 56 (verde) · 91 = 145 (azul)

🔎 Ejemplo explicado: comprobar la conversión con Python

Python
# De hexadecimal a decimal
print(int("5D", 16), int("38", 16), int("91", 16))   # 93 56 145

# De RGB a código hexadecimal
r, g, b = 93, 56, 145
print(f"#{r:02X}{g:02X}{b:02X}")                     # #5D3891
  • int(texto, 16) interpreta un texto como número en base 16.
  • :02X formatea un número en hexadecimal (X, en mayúsculas) con dos cifras, rellenando con cero (02).
  • Resultado (verificado): 93 56 145 y #5D3891, el mismo púrpura del ejemplo del curso.
CSS
body {
  background-color: antiquewhite;   /* color con nombre */
}
h2 {
  color: #5d3891;                   /* código hexadecimal: da igual si va en mayúsculas o minúsculas */
}

⚠️ Errores frecuentes

Error Qué ocurre Solución
color: 5D3891; (sin #) La declaración se ignora Los códigos hexadecimales empiezan con #
color: #5D389; (5 cifras) Código inválido: se ignora Usa 6 cifras (o la forma corta de 3, como #fff)
background: light blue; Los nombres no llevan espacios lightblue
Texto claro sobre fondo claro Se lee mal; es un problema de accesibilidad Revisa el contraste (ver Reto 3)

📝 Ejercicio original del curso: colorear un mundo en blanco y negro

  • Enunciado: el index.html solo tiene un h1 y un h2 en blanco y negro. Hay cinco pasos (TODO) que se deben seguir en orden.
  • Resultado esperado (según la solución del video):
    • Fondo del body: antiquewhite.
    • Texto del h1: whitesmoke, y también un color de fondo para el h1 (la profesora lo describe como la parte que exige "pensamiento lateral": background-color funciona en cualquier elemento y colorea solo el área que ocupa).
    • En el h1 se usan colores con nombre; en el h2, códigos hexadecimales, para practicar ambas formas.

🔍 Antes de programar

  • ¿Qué propiedad cambia el texto y cuál el fondo?
  • ¿El fondo del h1 ocupa toda la pantalla o solo su franja? Predícelo antes de probar.

Retos adicionales (creados para esta adaptación)

  • 🟢 Reto 1: toma los colores de la bandera de tu departamento o municipio, búscalos en formato hexadecimal y úsalos en una página con tres franjas (h1, h2 y p con background-color).
  • 🟡 Reto 2: escribe un programa de Python que pida tres valores RGB (validando que estén entre 0 y 255, Día 30) e imprima el código hexadecimal. Luego haz el programa inverso.
  • 🟠 Reto 3 — Accesibilidad: en DevTools, al hacer clic sobre el cuadrito de color de una propiedad color, Chrome muestra la relación de contraste con el fondo. Las pautas de accesibilidad (WCAG) piden al menos 4.5:1 para texto normal. Evalúa la combinación del ejercicio original y, si no cumple, propón otra.
  • 🔴 Reto 4 — Pensamiento computacional: elige una paleta de Color Hunt para el sitio de tu grupo (proyecto integrador) y escribe una tabla que asigne una función a cada color (fondo, títulos, texto, acento). Justifica por qué el color de acento no se usa para párrafos largos.

2. Propiedades de las fuentes

(Fuente: 327 - Font Properties.md)

🎯 Objetivo de aprendizaje

Controlar el tamaño, el grosor, la familia tipográfica y la alineación del texto, y elegir unidades adecuadas.

🧠 ¿Qué aprenderemos?

font-size (px, pt, em, rem y tamaños con nombre), font-weight, font-family con respaldo genérico, Google Fonts y text-align.

📖 Explicación conceptual

font-size: el tamaño

Unidad Qué es Tipo
px (píxel) 1/96 de pulgada ≈ 0,26 mm Fija
pt (punto) 1/72 de pulgada ≈ 0,35 mm. Es la unidad de Word: "tamaño 12" son 12 pt Fija
em Relativa al tamaño de fuente del padre Relativa
rem Relativa al tamaño de fuente de la raíz (html) Relativa
x-large, large… Tamaños con nombre Palabras clave

(El curso explica que se usan pulgadas porque muchas medidas del diseño web vienen de la tradición de la imprenta.)

em contra rem, con el ejemplo del curso:

HTML
<body>
  <h1>Título</h1>
  <footer>
    <h2>Pie de página</h2>
  </footer>
</body>
  • footer { font-size: 20px; } y h2 { font-size: 2em; } → el h2 mide 2 × 20 = 40 px. Si el footer pasa a 80 px, el h2 pasa a 160 px.
  • Con h2 { font-size: 2rem; } el tamaño del footer no importa: solo depende del html. Si el html tiene el tamaño por defecto (16 px), el h2 mide 32 px (verificado).

Recomendación del curso: usa rem. Con em, cuando hay elementos dentro de elementos dentro de elementos, es muy difícil saber "de qué padre" depende el tamaño. rem es más predecible.

font-weight: el grosor

  • Palabras clave: normal (equivale a 400) y bold (700).
  • Números: de 100 (muy delgada) a 900 (muy gruesa). Solo se ven diferencias si la fuente tiene esos grosores disponibles.
  • Relativos al padre: lighter y bolder.

🛠️ Nota técnica: el video dice que lighter y bolder "restan o suman 100". No es así: siguen una tabla de equivalencias. Verificado en Chrome 153: si el padre tiene 400, bolder da 700 y lighter da 100; si el padre tiene 700, lighter da 400.

font-family: el tipo de letra

CSS
h1 { font-family: Helvetica, sans-serif; }
p  { font-family: "Times New Roman", serif; }
  • Se escribe una lista: primero la fuente deseada y al final una familia genérica de respaldo, que se usa si la primera no está instalada (Helvetica viene en Mac, no en muchos Windows).
  • Las fuentes con varias palabras van entre comillas.
  • Familias genéricas: serif (con "patitas" en los bordes de las letras, como Times New Roman), sans-serif (sin patitas, como Arial), monospace (todas las letras con el mismo ancho, como una máquina de escribir o un editor de código), cursive (tipo manuscrita) y fantasy (decorativa). Su aspecto exacto depende del computador y el navegador.

Fuentes personalizadas con Google Fonts (fonts.google.com):

  1. Elige una fuente y los grosores que necesitas (por ejemplo, Regular 400 o Bold 700).
  2. Copia el código <link> que te da Google y pégalo en el <head> del HTML (fuera del elemento <style>).
  3. Copia la regla CSS (font-family: "Nombre", respaldo;) y aplícala al selector que quieras.

Así, cualquier persona verá esa fuente aunque no la tenga instalada, porque su navegador la descarga de Google.

text-align: la alineación

Valores: left, right, center, justify y los "lógicos" start y end. En idiomas que se escriben de derecha a izquierda (como el árabe), start es la derecha; en español, la izquierda. Por eso start y end son más flexibles.

⚠️ Errores frecuentes

Error Qué ocurre Solución
font-size: 20; (sin unidad) Se ignora Siempre con unidad: 20px, 1.25rem
font-family: Times New Roman; sin comillas Funciona a veces, pero es frágil y confuso Comillas para nombres con espacios
Olvidar la familia de respaldo Si la fuente no carga, el navegador usa su fuente por defecto, que puede no parecerse Termina siempre con serif, sans-serif, etc.
Pegar el <link> de Google Fonts dentro de <style> o en el .css La fuente no carga El <link> va en el <head> del HTML
Usar em en elementos muy anidados Los tamaños se multiplican de forma inesperada Prefiere rem

🔐 Privacidad (adaptación): al cargar una fuente desde Google, el navegador de cada visitante se conecta a los servidores de Google. Para un sitio escolar sencillo es aceptable, pero existe la alternativa de descargar la fuente y servirla desde tu propio sitio. Es un buen tema para discutir sobre datos personales.

📝 Ejercicios originales del curso

a) Demostración de tamaños (font-size.html, recursos 6.1 Font Properties). Contiene ejemplos con px, pt, em, rem y tamaños con nombre. La profesora propone cambiar el tamaño de la raíz (de xx-large a 20px, por ejemplo) y observar cómo cambia solo lo que está en rem.

b) Fuente de Google (font-family.html). Elegir una fuente en Google Fonts, pegar el <link> en el <head>, crear un h1 que diga "font-family" y aplicarle la regla CSS copiada.

c) Los TODO del index.html. Escribir el CSS debajo del ya incluido, en el <style> interno (sin cambiar el CSS existente). Según la solución del video:

  1. Cambiar el color de un elemento a coral.
  2. Hacer que el elemento con cierto id tenga el doble del tamaño de la raíz (2rem).
  3. Cambiar el grosor de un elemento a 900.
  4. Usar la fuente Caveat (Google Fonts, Regular) en un elemento, con su <link> antes del cierre del <head>, fuera del <style>, y una fuente de respaldo.
  5. Alinear un párrafo a la derecha.
  6. Cambiar el tamaño de fuente de la raíz (html) a 30px, y observar que el elemento de 2rem crece con ella.

🔍 Antes de programar

  • En el TODO 2, ¿"el doble de la raíz" se escribe con em o con rem? ¿Por qué?
  • En el TODO 6, ¿qué selector apunta a la raíz del documento?
  • ¿Qué elementos de la página cambiarán de tamaño en el TODO 6 y cuáles no? Predícelo.

Retos adicionales (creados para esta adaptación)

  • 🟢 Reto 1: crea una página con el mismo párrafo cinco veces, cada uno con una familia genérica diferente. ¿Cuál es más cómoda para leer un texto largo? ¿Cuál usarías para mostrar código?
  • 🟡 Reto 2 — Predicción: si html { font-size: 10px; }, div { font-size: 2em; } y un p dentro del div tiene font-size: 1.5em, ¿cuánto mide el texto del p? ¿Y si el p tuviera 1.5rem? Calcula y luego verifica en DevTools (pestaña Computed).
  • 🟠 Reto 3: elige en Google Fonts una fuente para títulos y otra para textos que combinen bien. Aplícalas a una página de noticias del colegio y justifica tu elección (legibilidad, estilo, grosores disponibles).
  • 🔴 Reto 4 — Pensamiento computacional: el colegio quiere que su sitio sea usable por personas con baja visión que aumentan el tamaño de letra en la configuración del navegador. Diseña un experimento para comparar una página con tamaños en px y otra en rem cambiando el tamaño de fuente en la configuración de Chrome (Configuración → Apariencia → Tamaño de fuente). Registra los resultados y saca una conclusión.

3. Inspeccionar CSS con las herramientas para desarrolladores

(Fuente: 328 - Inspecting CSS.md)

🎯 Objetivo de aprendizaje

Usar Chrome DevTools para descubrir qué estilos se aplican a un elemento, de dónde vienen y cómo probar cambios sin tocar los archivos.

📖 Explicación conceptual

Abrir DevTools:

  • Menú de los tres puntos → Más herramientas → Herramientas para desarrolladores.
  • Atajos: Ctrl + Mayús + I o F12 en Windows; Cmd + Opción + I en Mac.
  • Clic derecho sobre un elemento → Inspeccionar (además, resalta ese elemento en el HTML).
  • El botón de la flecha (arriba a la izquierda del panel) permite elegir un elemento haciendo clic sobre la página.

Pestaña Elementos → sección Estilos (Styles):

  • Muestra las reglas que se aplican al elemento seleccionado y de qué archivo vienen (por ejemplo, styles.css). Al hacer clic en el nombre del archivo, se abre su código.
  • Muchos estilos vienen del navegador: son los estilos por defecto (user agent stylesheet). Por ejemplo, todo enlace es azul por defecto.
  • Las declaraciones tachadas son las que otra regla anuló. En el ejemplo del curso, el azul por defecto del enlace está tachado porque el CSS del sitio lo cambió a blanco.
  • Con el botón + se agregan reglas; con la casilla junto a cada declaración se activan o desactivan.

¡Los cambios son temporales! Solo afectan a la copia cargada en tu navegador: no cambian el archivo original ni lo que ven otras personas. Por eso no es ilegal experimentar así (la pregunta que muchos estudiantes le hicieron a la profesora). Úsalo para probar antes de escribir el cambio en tu archivo CSS.

Pestaña Calculado (Computed): muestra el valor final de cada propiedad (por ejemplo, el color en RGB) sin la "locura" de reglas tachadas. Útil cuando no sabes qué regla está ganando.

Resumen de CSS (CSS Overview): desde los tres puntos de DevTools (no los de Chrome) → Más herramientas → CSS Overview → Capture overview. Muestra los colores de fondo, colores de texto y fuentes que usa la página. Útil para descubrir "qué fuente es esa" o "qué verde exacto es ese".

🛠️ Nota técnica: los menús de DevTools cambian entre versiones de Chrome, y el panel CSS Overview se ha presentado como función experimental. Si no lo encuentras en tu versión, usa la pestaña Computed o el selector de color de la pestaña Styles para obtener la misma información.

📝 Ejercicio original del curso: el sitio para inspeccionar

  • Sitio: appbrewery.github.io/css-inspection/ (tiene un h1, un h2 y un párrafo, y un formulario para comprobar las respuestas).
  • Preguntas:
    1. ¿Cuál es el color de fondo del body?
    2. ¿Cuál es el tamaño de fuente del h1?
    3. ¿Cuál es el grosor de fuente del h2?
    4. ¿Cuál es la familia de fuentes del párrafo?
  • Pista del curso para la pregunta 4: el valor no está aplicado directamente al párrafo: es heredado. Búscalo en la parte inferior de Styles ("Inherited from…") o en Computed.

Respuestas que da la profesora en el video (ábrelas solo para comprobar)

  1. aliceblue · 2. 3rem · 3. 500 · 4. Arial, sans-serif

⚠️ Errores frecuentes

Error Qué ocurre Solución
"Arreglé la página en DevTools y al recargar se dañó otra vez" Los cambios de DevTools no se guardan Copia las reglas que funcionaron a tu archivo .css
Buscar un estilo en el elemento equivocado La propiedad viene heredada de un padre Revisa la sección "Inherited from" o la pestaña Computed
Ignorar las reglas tachadas No entiendes por qué "tu" regla no se aplica Una regla tachada perdió contra otra: busca cuál ganó y por qué (especificidad u orden)

Retos adicionales (creados para esta adaptación)

  • 🟢 Reto 1: con DevTools, averigua la fuente y el color principal de la página web de tu colegio o de una entidad pública (por ejemplo, el Ministerio de Educación).
  • 🟡 Reto 2: cambia en vivo tres estilos de una página hasta que te guste más, toma una captura "antes y después" y escribe las reglas que agregaste.
  • 🟠 Reto 3 — Depuración: en tu proyecto del Día 43, agrega a propósito una regla que choque con otra (por ejemplo, dos colores para los h2). Usa DevTools para ver cuál está tachada y explica por qué perdió.
  • 🔴 Reto 4: crea un "cuestionario de inspección" como el del curso para tus compañeros: una página con cuatro preguntas cuyas respuestas solo se encuentran con DevTools (incluye al menos una propiedad heredada). Intercámbialo con otro grupo.

4. El modelo de caja: margen, relleno y borde

(Fuente: 329 - The CSS Box Model - Margin, Padding and Border.md)

🎯 Objetivo de aprendizaje

Explicar y aplicar el modelo de caja (width, height, padding, border, margin), calcular el tamaño total de un elemento y agrupar contenido con div.

📖 Explicación conceptual

Aunque no lo veamos, cada elemento HTML es una caja. El curso lo muestra con un sitio llamado "I Love Bacon".

Texto
┌──────────────── margin (fuera del borde, transparente) ─────────────┐
│  ┌───────────── border (el borde) ───────────────────────────────┐  │
│  │  ┌────────── padding (entre el contenido y el borde) ──────┐  │  │
│  │  │                                                         │  │  │
│  │  │            contenido: width × height                    │  │  │
│  │  │                                                         │  │  │
│  │  └─────────────────────────────────────────────────────────┘  │  │
│  └───────────────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────────┘
Propiedad Qué hace Ejemplo
width, height Ancho y alto del contenido. En px o en % (el % es relativo al contenedor) width: 50%;
border Borde: grosor, estilo y color separados por espacios border: 10px solid black;
padding Relleno dentro del borde padding: 20px;
margin Espacio fuera del borde, que separa la caja de las demás margin: 10px;

Estilos de borde: solid (continuo), dashed (discontinuo), dotted (punteado), entre otros.

Idea clave del curso: al agregar border o padding, el width y el height no cambian: el borde y el relleno se agregan hacia fuera. Por eso la caja total crece.

Tamaño total horizontal de una caja:

Texto
ancho total = width + padding izquierdo + padding derecho + borde izquierdo + borde derecho

Ejemplo del ejercicio: width: 200px; padding: 20px; border: 10px solid black; → 200 + 20 + 20 + 10 + 10 = 260 px (verificado en Chrome: offsetWidth = 260). Los márgenes se suman aparte, como espacio alrededor.

Uno, dos o cuatro valores (vale para padding, margin y border-width):

Valores Significado Ejemplo
1 Los cuatro lados padding: 10px;
2 Arriba y abajo · izquierda y derecha border-width: 20px 10px;
4 Arriba · derecha · abajo · izquierda (en el sentido de las agujas del reloj, empezando arriba) margin: 0 10px 20px 30px;

El orden importa: para quitar solo el borde superior, la regla específica va después de la general:

CSS
div {
  border: 30px solid black;
  border-top: 0px;          /* se evalúa después y anula solo el lado superior */
}

Ver el modelo de caja: en DevTools, pestaña Styles (o Computed), aparece un diagrama con margin, border, padding y contenido, donde puedes editar los valores. El curso propone practicar en appbrewery.github.io/box-model/.

El elemento div

<div> (content division, división de contenido) es una caja invisible que agrupa elementos para darles estilo o ubicarlos juntos. Por sí solo no se ve ni cambia nada, por eso se aprende hasta ahora, junto con CSS. Ejemplo del curso: una imagen con su párrafo agrupados en un div, y otro div para la segunda imagen.

Depurar cajas invisibles: la profesora recomienda la extensión de Chrome Pesticide, que dibuja el contorno de cada elemento (como "gafas de visión nocturna").

💡 Alternativa sin instalar nada (adaptación): agrega temporalmente * { outline: 1px solid red; } a tu CSS. El outline dibuja un contorno sin cambiar el tamaño de las cajas (a diferencia de border). Útil si en el colegio no se pueden instalar extensiones.

🛠️ Nota técnica — colapso de márgenes: el video dice que dos elementos con margin: 10px quedan separados 20 px. Eso es cierto en horizontal (por ejemplo, elementos uno al lado del otro), pero en vertical los márgenes superior e inferior de bloques consecutivos se colapsan: la separación es el mayor de los dos, 10 px (verificado en Chrome 153). Si una separación vertical "no suma", esta es la razón.

🛠️ Nota técnica — box-sizing: el comportamiento que explica el curso (el borde y el relleno se suman por fuera) corresponde al valor por defecto, box-sizing: content-box. Muchos proyectos modernos usan * { box-sizing: border-box; }, con el que width y height incluyen el relleno y el borde. No lo uses en los ejercicios de hoy (cambiaría los cálculos), pero conviene saber que existe.

⚠️ Errores frecuentes

Error Qué ocurre Solución
border: 10px black; (sin estilo) No aparece ningún borde: el estilo por defecto es none Incluye el estilo: 10px solid black
Confundir padding con margin El espacio aparece dentro de la caja (y se pinta con su fondo) o fuera padding = dentro del borde; margin = fuera
Olvidar que el borde suma al tamaño Las cajas no encajan "por unos píxeles" Calcula el ancho total
border-top antes de border border lo sobrescribe La regla específica va después
Márgenes por defecto del navegador Un <p> dentro de un div "se sale" o deja espacios Los p traen 1em de margen arriba y abajo (16 px por defecto, verificado). Quítalo con margin: 0 si estorba

📝 Ejercicio original del curso: tres cajas que se tocan en las esquinas

  • Enunciado: seguir los TODO del index.html "como un desarrollador que sigue las instrucciones de un cliente", hasta igualar la imagen objetivo.
  • Requisitos (según el video):
    1. Crear tres div, cada uno con su propio id, de 200 px × 200 px.
    2. Poner un párrafo dentro del primer div para ver el relleno.
    3. Primer div: 20 px de padding y un borde negro sólido de 10 px.
    4. Quitar el margen del párrafo (margin: 0), porque sus márgenes por defecto lo empujan fuera del div.
    5. Segundo div: borde de 20 px arriba y abajo y de 10 px a izquierda y derecha (forma de dos valores).
    6. Tercer div: borde de 10 px.
    7. Usar márgenes para que las cajas se toquen esquina con esquina, alineadas al píxel.
  • Pista de la profesora: se puede hacer por ensayo y error, pero es mejor calcular. El primer div mide 260 px de ancho total, así que el segundo necesita un margin-left de 260 px.

🔍 Antes de programar

  • ¿Cuánto mide de ancho total el segundo div? (Pista: 200 + borde izquierdo + borde derecho.)
  • Entonces, ¿cuánto margin-left necesita el tercero para empezar donde termina el segundo?
  • ¿Por qué no hace falta calcular nada en vertical para que las cajas queden una debajo de la otra?

Retos adicionales (creados para esta adaptación)

  • 🟢 Reto 1: crea una "tarjeta de presentación" con un div que tenga borde, relleno y margen, y dentro tu nombre y un párrafo.
  • 🟡 Reto 2 — Cálculo: una caja tiene width: 300px; padding: 15px 25px; border: 5px dashed teal; margin: 40px;. Calcula su ancho total con y sin margen. Comprueba en el diagrama de DevTools.
  • 🟠 Reto 3 — Depuración: dos párrafos tienen margin: 30px y otro estudiante esperaba 60 px entre ellos, pero mide 30 px. Explica qué pasa y propón cómo obtener 60 px.
  • 🔴 Reto 4 — Pensamiento computacional: escribe una función de Python ancho_total(width, padding, border, margin=0) que calcule el ancho ocupado por una caja (suponiendo el mismo valor en todos los lados). Úsala para resolver el ejercicio de las tres cajas y compara con tu CSS. Luego amplíala para aceptar valores distintos a izquierda y derecha.

5. 🚀 Proyecto del día: póster motivacional

(Fuente: 330 - Day 44 Project - Motivational Poster Website.md)

Problema

Los pósteres motivacionales de los años 90 tienen un formato inconfundible: fondo negro, una imagen grande con marco blanco, un título en mayúsculas con una fuente elegante y una frase debajo. En Internet también circulan versiones humorísticas. Vas a crear tu propio póster como página web.

Contexto

El curso muestra un zorro ártico con el título "POTENCIAL" ("Todos tenemos las herramientas para la grandeza dentro de nosotros"). Para el aula, puedes hacer un póster sobre la constancia en el estudio, el cuidado del ambiente, el deporte o la convivencia, con tu propia imagen.

Objetivo

Aplicar todo el bloque de CSS: colores, fuente personalizada, bordes, alineación, div y márgenes para centrar.

Requisitos funcionales (originales del curso: seis TODO)

  1. Usar la fuente personalizada de Google Libre Baskerville para imitar la tipografía de los pósteres.
  2. Poner tu propia imagen en la carpeta de imágenes (dentro de assets). Hay una imagen de ejemplo, pero la profesora recomienda usar una propia.
  3. La imagen debe tener un borde blanco de 5 px.
  4. El texto debe estar centrado (text-align).
  5. Centrar el contenido en la página ajustando márgenes. La profesora recomienda meter el h1, el párrafo y la imagen en un solo div para centrar solo el div. Pistas del curso:
    • dar al div un width de 50 %;
    • calcular el margin-left que falta para centrarlo (ver nota técnica);
    • poner la imagen con width: 100% para que llene el div;
    • agregar un margin-top en píxeles para bajarlo "a ojo".
  6. Investigar en la documentación la propiedad text-transform para que el h1 aparezca en mayúsculas sin escribirlo en mayúsculas.

Además: fondo negro y texto blanco.

🛠️ Nota técnica: la transcripción dice que con un div del 50 % "solo queda un 25 % a cada lado" y a continuación propone margin-left: 20%. Si el div ocupa el 50 %, el margen izquierdo para centrarlo es 25 % (el 50 % restante dividido entre dos). Con 20 % queda ligeramente corrido a la izquierda.

Solución de la profesora (resumen del video): los <link> de Google Fonts en el <head>; un div con una clase (un id también funcionaría, pero la clase permite reutilizar el estilo si el sitio crece); el div centrado con ancho y margen en porcentaje y margin-top: 100px; la fuente personalizada; y la imagen con borde y width: 100%.

Restricciones técnicas

  • CSS externo.
  • Un solo div contenedor con clase.
  • Sin Flexbox ni Grid (se estudian más adelante): el centrado se hace con márgenes.

Planificación

  1. Comprender: observa un póster real. ¿Qué elementos tiene y cómo están dispuestos?
  2. Entradas: tu imagen, tu título y tu frase.
  3. Proceso: estructura HTML → colores → fuente → borde → centrado → mayúsculas.
  4. Salida: una página que parezca un póster.
  5. Dividir: cada TODO es una parte.
  6. Diseñar: dibuja en papel el div y sus medidas en porcentaje.
  7. Implementar → 8. Probar → 9. Corregir → 10. Mejorar.

Construcción paso a paso

  • Versión 1 — Estructura: plantilla HTML, un div class="poster" con h1, img (con alt) y p. Enlaza el CSS y pruébalo con el fondo rojo temporal.
  • Versión 2 — Colores: fondo negro y texto blanco. ¿Qué selector usarás para el fondo de toda la página?
  • Versión 3 — Tipografía: Libre Baskerville con su respaldo serif, texto centrado y text-transform en el h1.
  • Versión 4 — La imagen: borde blanco de 5 px y width: 100%.
  • Versión final — Centrado: ancho y márgenes del div. Activa el contorno de depuración (outline) para ver dónde está la caja y quítalo al terminar.

Pruebas

Prueba Resultado esperado
Hacer la ventana más angosta y más ancha El póster sigue centrado horizontalmente
Escribir el título en minúsculas en el HTML Se sigue viendo en MAYÚSCULAS
Desconectar Internet y recargar El título se ve con una fuente serif de respaldo
Inspeccionar el div Margen izquierdo = margen derecho
Revisar el alt de la imagen Describe la imagen

🧪 Prueba y depuración

Este CSS tiene cuatro problemas. El póster aparece corrido a la izquierda, la imagen se desborda del div, el borde no se ve y el título no está en mayúsculas:

CSS
body {
  background-color: black;
  color: white;
}
.poster {
  width: 50%;
  margin-left: 20%;
  margin-top: 100px;
  text-align: center;
}
img {
  border: 5px white;
}
h1 {
  font-family: "Libre Baskerville", serif;
  text-transform: capitalize;
}

Pista: uno de los problemas no está en una línea equivocada, sino en una línea que falta.

⭐ Extensión del proyecto

  • Crea tres pósteres en la misma página reutilizando la clase .poster.
  • Consulta en MDN la forma margin: 0 auto; para centrar horizontalmente un bloque con ancho definido, y compárala con el cálculo en porcentajes. ¿Cuál es más fácil de mantener?
  • Consulta max-width para que el póster no se vea gigante en pantallas grandes.

6. 🌟 Proyecto extra: galería de científicas y científicos colombianos

(Proyecto creado para esta adaptación; no existe en el curso original.)

Situación

Para la Semana de la Ciencia, el área de Ciencias quiere una página que presente a científicas y científicos colombianos (por ejemplo, Nubia Muñoz, Rodolfo Llinás, Ángela Restrepo, Manuel Elkin Patarroyo o Francisco José de Caldas).

Requisitos

  1. Al menos cuatro tarjetas, cada una un div con la clase tarjeta, que contengan: nombre (h2), imagen con alt (con licencia libre y fuente citada), área de trabajo y un aporte importante (lista).
  2. Las tarjetas deben tener borde, relleno y margen, y el mismo tamaño.
  3. Una fuente de Google para los títulos y una familia genérica para el texto; tamaños en rem.
  4. Una paleta de colores con buen contraste (compruébalo en DevTools).
  5. Una tarjeta destacada (id) con un borde diferente.
  6. Una fuente bibliográfica por persona, enlazada.

Decisiones que debes tomar (y justificar)

  • ¿Cómo distribuyes las tarjetas usando solo márgenes y anchos? (Todavía no se usa Flexbox.)
  • ¿Qué ancho total tendrá cada tarjeta? Escribe el cálculo del modelo de caja.
  • ¿Cómo compruebas que la información es correcta? No copies datos de una IA sin verificarlos en una fuente confiable (por ejemplo, Minciencias, universidades o enciclopedias).

Casos de prueba

  • Las cuatro tarjetas miden lo mismo (compruébalo en el diagrama de caja de DevTools).
  • Al aumentar el tamaño de letra del navegador, el texto crece (gracias a rem).
  • Todas las imágenes tienen alt y todos los enlaces funcionan.

7. 🏆 Proyecto integrador final del bloque web (Días 41 a 44)

(Proyecto creado para esta adaptación. Las etapas 1 a 3 están en los tutoriales de los Días 41, 42 y 43.)

Situación problema

Muchos grupos del colegio (semillero de investigación, club de robótica, grupo de danza, comité ambiental, emisora escolar) no tienen presencia en la web. La información sobre sus actividades, sus logros y cómo unirse se pierde en grupos de chat y carteleras de papel.

Contexto

Una página web es accesible desde cualquier dispositivo, se puede enlazar desde la página institucional y permanece en el tiempo. Además, en los próximos días del curso aprenderás a leer páginas con Python (Día 45, web scraping) y a servirlas con Python (Flask, desde el Día 54): este sitio podrá convertirse en el punto de partida de esos proyectos.

Pregunta orientadora

¿Cómo podemos construir un sitio web claro, accesible y atractivo que presente un grupo o proyecto del colegio a la comunidad educativa?

Objetivo

Construir un sitio web de al menos dos páginas que presente un grupo o proyecto del colegio, usando HTML semántico y una hoja de estilos externa.

Requerimientos

Contenido y estructura (HTML, Días 41 y 42)

  1. Plantilla completa y válida en todas las páginas, con lang="es" y title descriptivo.
  2. Jerarquía de encabezados correcta (un h1 por página, sin saltos).
  3. Párrafos, al menos una lista ordenada, una desordenada y una anidada.
  4. Al menos tres imágenes con alt adecuado (o alt="" si son decorativas), guardadas en imagenes/.
  5. Navegación entre las páginas con enlaces relativos, y al menos dos enlaces externos.

Presentación (CSS, Días 43 y 44)

  1. Una sola hoja de estilos externa (css/estilos.css) compartida por todas las páginas.
  2. Uso justificado de selectores de elemento, clase e id (y, si lo necesitas, de atributo).
  3. Paleta de colores (con al menos un color hexadecimal) con contraste suficiente.
  4. Una fuente de Google con familia de respaldo; tamaños en rem.
  5. Al menos una sección agrupada en un div con borde, relleno y margen, centrada horizontalmente.

Restricciones

  • Sin CSS en línea ni interno.
  • Sin plantillas ni frameworks descargados (Bootstrap se estudia en el Día 58).
  • Sin Flexbox ni Grid: el reto es resolver la distribución con el modelo de caja.
  • Contenido verdadero y verificado; imágenes propias o con licencia libre y su fuente citada.
  • No publicar datos personales de estudiantes (nombres completos, teléfonos, fotos de menores) sin autorización.

Etapas de desarrollo

Etapa Día Producto
1. Contenido y estructura 41 index.html con encabezados, párrafos, hr y br
2. Documento completo 42 Plantilla, listas, imágenes, unete.html y enlaces
3. Hoja de estilos 43 css/estilos.css enlazado desde todas las páginas; selectores
4. Diseño visual 44 Paleta, tipografía, modelo de caja y centrado
5. Pruebas y mejora 44 Validación, pruebas de accesibilidad, correcciones

Etapa 4 (hoy):

  1. Define la paleta (Reto 4 de la sección 1) y aplícala.
  2. Agrega una fuente de Google para los títulos y usa rem en los tamaños.
  3. Agrupa el contenido principal en un div class="contenedor" con ancho definido y centrado horizontal.
  4. Da a cada sección una apariencia de "tarjeta" con borde, relleno y margen.
  5. Revisa con DevTools: contraste, reglas tachadas, diagrama de caja.

Entregables

  1. Carpeta del proyecto comprimida (index.html, unete.html, css/, imagenes/).
  2. Capturas: el sitio con CSS, el sitio sin CSS (comentando el <link>) y el validador W3C sin errores en cada página.
  3. Un documento corto (una página) con: la paleta y su justificación, el cálculo del modelo de caja de una de tus tarjetas y tres errores que encontraste y cómo los solucionaste.
  4. Una demostración de 3 minutos: navegar el sitio y explicar una regla CSS de cada tipo de selector.

Casos de prueba

# Prueba Resultado esperado
1 Validar cada página en validator.w3.org Sin errores
2 Hacer clic en todos los enlaces Ninguno lleva a una página inexistente
3 Desactivar el CSS El contenido se entiende en orden lógico
4 Leer solo los encabezados La estructura se comprende
5 Desconectar Internet Las imágenes locales cargan; la fuente usa el respaldo; se ven los alt de las imágenes externas
6 Aumentar el tamaño de letra del navegador El texto crece
7 Revisar el contraste en DevTools Al menos 4.5:1 en el texto normal
8 Usar el Narrador en la página de inicio Se entiende el propósito del grupo
9 Cambiar el color institucional en un solo lugar del CSS Cambia en todas las páginas
10 Hacer la ventana angosta El contenedor sigue centrado

Criterios técnicos de funcionamiento

Criterio Nivel básico Nivel alto
Estructura HTML Plantilla y etiquetas correctas HTML válido, jerarquía perfecta, uso justificado de cada elemento
Accesibilidad Hay alt en las imágenes alt útiles, contraste verificado, lang correcto, enlaces descriptivos
Organización del CSS Un archivo externo Reglas agrupadas y comentadas; clases reutilizables; sin repeticiones innecesarias
Selectores Usa elemento y clase Elige con criterio entre elemento, clase, id y atributo, y lo explica
Modelo de caja Hay bordes y márgenes Cálculos correctos, cajas alineadas, centrado limpio
Depuración Corrige errores cuando se los señalan Usa DevTools y el validador para encontrarlos solo, y documenta el proceso

Posibles extensiones

  • Una tercera página (galería, noticias o calendario).
  • Un formulario de inscripción de solo HTML (investiga <form>, <input> y <label> en MDN; en el curso se trabajan con Flask a partir del Día 60).
  • Un programa de Python que genere la página de "Logros" a partir de una lista de diccionarios, escribiendo el archivo HTML (conecta con el manejo de archivos del Día 24).
  • Publicar el sitio con GitHub Pages (tema del Día 70, sobre Git y GitHub), con autorización del docente.

8. 🧩 Comprueba lo aprendido

Conceptuales

  1. ¿Qué diferencia hay entre color y background-color?
  2. ¿Qué significan las seis cifras de un código como #FF8800?
  3. ¿Por qué el curso recomienda rem en lugar de em?
  4. ¿Para qué sirve la familia genérica al final de font-family?
  5. ¿Qué diferencia hay entre padding y margin? ¿Y dónde queda el border?
  6. ¿Por qué no se guardan los cambios que haces en DevTools?

Análisis de código

Calcula el ancho total de esta caja y explica cada sumando:

CSS
.aviso {
  width: 250px;
  padding: 10px 30px;
  border: 4px solid #333;
  margin: 20px;
}

Predicción

CSS
html { font-size: 16px; }
section { font-size: 20px; }
section p { font-size: 1.5em; }
section h2 { font-size: 1.5rem; }

¿Cuántos píxeles medirán el p y el h2 que están dentro de section? Comprueba en la pestaña Computed.

Depuración

CSS
h1 {
  font-family: Libre Baskerville;
  font-size: 3;
  color: #12345;
  border: 2px;
}

Encuentra cuatro problemas y corrígelos.

Modificación

En tu póster motivacional, cambia el centrado en porcentajes por margin: 0 auto; y un max-width en píxeles. Describe en qué se diferencia el comportamiento al cambiar el ancho de la ventana.

Creación

Diseña una tarjeta de "Estudiante del mes" (datos ficticios): un div centrado con foto de ejemplo (picsum.photos), nombre en una fuente de Google, logros en lista, borde de doble línea (investiga el estilo double), relleno de 1.5rem y colores con buen contraste.


9. 🤖 Programar con apoyo de IA

Recuerda el ciclo: formula el problema → inténtalo tú → consulta a la IA → lee y entiende → prueba → compara con MDN → modifica → explica con tus palabras.

Actividad 1 — Comprobar una afirmación del curso. Pregúntale a una IA: "Si dos párrafos seguidos tienen margin: 10px, ¿cuál es la distancia vertical entre ellos?". Luego compruébalo en DevTools. ¿La IA acierta? ¿Menciona el "colapso de márgenes"? Busca el tema en MDN (Mastering margin collapsing).

Actividad 2 — Revisar un cálculo. Pide a una IA que resuelva el ejercicio de las tres cajas (sección 4) y que diga el margin-left de la tercera. Antes de aceptar su número, haz tú el cálculo con la fórmula del ancho total. Si no coinciden, ¿quién se equivocó y dónde?

Actividad 3 — lighter y bolder. Pregúntale a una IA qué valor numérico da font-weight: bolder si el padre tiene 400. Compara su respuesta con la tabla de MDN (Meaning of relative weights) y con la nota técnica de la sección 2.

Actividad 4 — Diseño asistido, decisiones propias. Pide a una IA tres paletas de colores para el sitio de tu grupo. Evalúa cada una con el verificador de contraste de DevTools y elige una justificando tu decisión. La IA propone; tú decides y respondes por el resultado.


10. 🛠️ Correcciones técnicas al material original

Archivo Afirmación del curso Observación Tratamiento
327 "1 em se define como el ancho completo de la letra M" Es el origen histórico del nombre (en tipografía). En CSS, 1 em es el tamaño de fuente: en font-size, el del padre; en otras propiedades (como padding), el del propio elemento. No se mide ninguna letra Explicación de la sección 2
327 lighter y bolder restan o suman 100 Siguen una tabla: desde 400, bolder → 700 y lighter → 100; desde 700, lighter → 400 (verificado) Nota técnica de la sección 2; Actividad 3 de IA
327 Las fuentes de varias palabras "necesitan" comillas Es la práctica recomendada; técnicamente algunos nombres funcionan sin comillas, pero es frágil Tabla de errores de la sección 2
328 Panel CSS Overview en "Más herramientas" Los menús de DevTools cambian entre versiones; el panel se presentó como experimental Nota técnica de la sección 3
329 Dos elementos con margin: 10px quedan a 20 px Cierto en horizontal; en vertical los márgenes se colapsan: 10 px (verificado) Nota técnica de la sección 4; Reto 3; Actividad 1 de IA
329 El borde y el relleno no cambian width ni height Cierto con el valor por defecto box-sizing: content-box; con border-box sí se incluyen Nota técnica de la sección 4
329 Extensión Pesticide Puede no estar disponible o no poder instalarse en el colegio; alternativa: * { outline: 1px solid red; } Sección 4
330 width: 50% y margin-left: 20% para centrar Para centrar un bloque del 50 % el margen izquierdo debe ser 25 %; la propia narración dice "un 25 % a cada lado" Nota técnica de la sección 5; ejercicio 🧪

11. 📋 Matriz de trazabilidad

Contenido original Archivo de origen Concepto desarrollado Ejercicio original Reto adicional Proyecto relacionado
background-color, color, colores con nombre (MDN), Color Hunt, códigos hexadecimales y RGB (93, 56, 145) 326 Sección 1 Cinco pasos: antiquewhite, whitesmoke, fondo del h1, hexadecimales en el h2 Retos 1–4 de la sección 1 Secciones 5, 6 y 7
font-size (px, pt, em, rem, con nombre), recomendación de rem, font-weight (palabras, números, relativos), font-family con respaldo, comillas, familias genéricas, Google Fonts, text-align (incluidos start y end) 327 Sección 2 Demostración de tamaños; fuente de Google en un h1; seis TODO (coral, 2rem, 900, Caveat, derecha, raíz de 30 px) Retos 1–4 de la sección 2 Secciones 5, 6 y 7
DevTools: abrir, seleccionar elementos, Styles, estilos por defecto, archivo de origen, agregar y desactivar reglas, cambios temporales, reglas tachadas, Computed, CSS Overview 328 Sección 3 Sitio css-inspection (cuatro preguntas) Retos 1–4 de la sección 3 Sección 7
Modelo de caja: width, height (px y %), border (grosor, estilo, color), border-top, border-width de 1, 2 y 4 valores, padding, margin, diagrama en DevTools, sitio box-model, div, Pesticide 329 Sección 4 Tres cajas que se tocan en las esquinas (cálculo de 260 px) Retos 1–4 de la sección 4 Secciones 5, 6 y 7
Póster motivacional: Libre Baskerville, imagen propia en assets, borde blanco de 5 px, centrado del texto, div al 50 % con margen, imagen al 100 %, margin-top, text-transform, clase en el div 330 Sección 5 Proyecto del día (seis TODO) 🧪 y ⭐ de la sección 5 Sección 5
(No existe en el curso original) — — — Galería de científicas y científicos colombianos Sección 6
(No existe en el curso original) — — — Sitio web de un grupo del colegio: proyecto integrador final Sección 7

12. 📦 Evidencias de aprendizaje del Día 44

  • Programa de Python de conversión RGB ↔ hexadecimal (Reto 2 de la sección 1).
  • Ejercicio de colores con la evaluación de contraste (Reto 3 de la sección 1).
  • Los seis TODO de fuentes y tu predicción del TODO 6 (qué crecería al cambiar la raíz).
  • Respuestas del sitio css-inspection con capturas de dónde encontraste cada una.
  • El ejercicio de las tres cajas, con el cálculo escrito de cada margen.
  • El póster motivacional con la tabla de pruebas y el ejercicio 🧪 corregido.
  • La galería de científicos (proyecto extra).
  • El proyecto integrador final con todos sus entregables.
  • Cuaderno de errores: # olvidado en un hexadecimal, unidades faltantes, <link> de Google Fonts en el lugar equivocado, borde sin estilo, padding confundido con margin, márgenes verticales que "no suman", cambios de DevTools que se perdieron, centrado con el porcentaje equivocado.