Ciencias de la Computación · Ceibal · Capítulo 3
🖼️ iframe
Sección 1 de 7

Una ventana dentro de tu página

Un iframe es como una ventanita que muestra otra página adentro de la tuya: así se incrustan mapas, videos de YouTube y más.

¿Qué es un <iframe>?

Un <iframe> es como una ventana dentro de tu página que muestra otra página web. Es como poner una televisión dentro de otra televisión — cada una tiene su propio contenido. Su nombre viene de Inline Frame (marco en línea).

Usos más comunes: embeber videos de YouTube, mapas de Google Maps, formularios externos, presentaciones de Google Slides y contenido de redes sociales.

Los atributos de <iframe>

AtributoQué hace¿Obligatorio?Ejemplo
srcURL de la página a mostrarsrc="https://…"
titleDescribe el contenido — obligatorio por accesibilidadSí (buenas prácticas)title="Mapa del liceo"
width / heightDimensiones (mejor con CSS para responsivo)Nowidth="560"
allowfullscreenPermite pantalla completaNobooleano
allowPermisos específicos del iframeNoallow="autoplay; …"
loading="lazy"Carga diferida: no carga hasta acercarse — mejora el rendimientoNo (recomendado)loading="lazy"
referrerpolicyQué información de referencia se envía al cargarNostrict-origin-when-cross-origin
sandboxRestringe lo que puede hacer el iframe, por seguridadNosandbox="allow-scripts"
frameborderBorde del iframe ("0" = sin borde) — en HTML5 se prefiere CSSNoframeborder="0"
🔐 El atributo sandbox es la "jaula de seguridad": sin valores bloquea casi todo, y se le dan permisos de a uno: allow-scripts (puede ejecutar JavaScript), allow-same-origin (se trata como del mismo sitio), allow-forms (puede enviar formularios).

📺 Caso práctico: YouTube, línea por línea

<!-- Ejemplo 1 · el iframe típico de YouTube -->
<iframe
  width="560" height="315"          <!-- tamaño 16:9 -->
  src="https://www.youtube.com/embed/VIDEO_ID"  <!-- /embed/, no /watch -->
  title="Reproductor de video de YouTube"   <!-- accesibilidad -->
  allow="accelerometer; autoplay; clipboard-write;
         encrypted-media; gyroscope; picture-in-picture"
  referrerpolicy="strict-origin-when-cross-origin"
  allowfullscreen>                       <!-- botón pantalla completa -->
</iframe>

Parámetros de la URL (van después del VIDEO_ID, el primero con ? y los siguientes con &):

ParámetroEfecto
?autoplay=1Reproduce al cargar (requiere &mute=1)
?mute=1Inicia silenciado
?start=N / ?end=NEmpieza/termina en el segundo N (¡como los cortes de video de los módulos anteriores!)
?controls=0Oculta los controles del reproductor
?loop=1&playlist=VIDEO_IDRepite el video (loop necesita el playlist con el mismo ID)

🗺️ Caso práctico: Google Maps

En Google Maps: botón "Compartir" → "Insertar un mapa" → copiás el iframe generado. Trae src (una URL larguísima con las coordenadas), width, height, style="border:0", allowfullscreen, loading="lazy" y referrerpolicy.

<!-- Ejemplo 2 · esqueleto del iframe de Google Maps -->
<iframe
  src="https://www.google.com/maps/embed?pb=…"
  width="600" height="450"
  style="border:0;"
  title="Ubicación del liceo en el mapa"
  loading="lazy"
  allowfullscreen>
</iframe>
⚠️ No todos los sitios permiten ser mostrados dentro de un iframe. Muchos tienen protecciones (X-Frame-Options) que lo impiden. Si tu iframe aparece en blanco, probablemente el sitio no lo permite.

📱 Iframe responsivo: la técnica del 56,25%

Un iframe con width="560" fijo se desborda en celulares. La solución clásica: un contenedor que reserva la proporción 16:9 y el iframe que lo llena por completo.

<!-- Ejemplo 3 · técnica responsiva completa -->
<div style="position: relative;
            padding-bottom: 56.25%;  /* 9÷16 = 0.5625 → 16:9 */
            height: 0;">
  <iframe
    src="https://www.youtube.com/embed/VIDEO_ID"
    title="Video responsivo"
    style="position: absolute; top: 0; left: 0;
           width: 100%; height: 100%; border: 0;"
    allowfullscreen></iframe>
</div>

¿Por qué funciona? El padding-bottom: 56.25% se calcula sobre el ancho del contenedor: la caja siempre mide 16:9, sea cual sea el ancho de la pantalla. El iframe, en position: absolute, se estira para llenarla al 100%.

⚙️ Sintaxis en acción

<!-- Probá embeber una página que -->
<!-- sí permite iframes: -->
<iframe
  src="https://www.openstreetmap.org/export/embed.html?bbox=-56.21,-34.92,-56.13,-34.88"
  width="100%" height="220"
  title="Mapa de Montevideo"
  loading="lazy">
</iframe>

🎬 Video de referencia

📺 Video por TodoCode · todocodeacademy.com

🎮 Actividades de comprensión — tocá para desplegar
🧩 Actividad 1 · Armá el iframe de YouTube

Arrastrá las tarjetas para reconstruir un iframe de YouTube completo, en el orden en que se escribe. Tocá «Verificar».

🎯 Actividad 2 · ¿Seguridad, apariencia o comportamiento?

Arrastrá cada atributo a la categoría que le corresponde. ¡Todas las tarjetas tienen lugar!

sandbox referrerpolicy width / height frameborder loading="lazy" allowfullscreen
🔐 Seguridad
🎨 Apariencia
⚙️ Comportamiento
✏️ Actividad 3 · Completá el iframe

Completá los espacios amarillos: el atributo de la URL, el de accesibilidad y el de pantalla completa. Tocá «Verificar».

<iframe
  ="https://www.youtube.com/embed/abc123"
  ="Video del proyecto de ciencias"
  >
</iframe>
🧠 Actividad 4 · Múltiple opción

Leé cada pregunta y elegí la opción correcta. Vas a recibir una explicación con cada respuesta. No podés cambiar tu respuesta, así que pensala bien.

⌨️ Actividad 5a · Reto Práctico BÁSICO

Consigna: a este iframe de YouTube le faltan los parámetros de la URL. Seguí los comentarios marcados con ✏️ y completalos (el VIDEO_ID de ejemplo es dQw4w9WgXcQ). Como acá no carga YouTube real, lo importante es que la URL quede bien escrita; al descargar podés probarla en tu navegador.

🚀 Actividad 5b · Reto Práctico AVANZADO

¡Página con embeds responsivos! Creá desde cero una página con DOS iframes responsivos usando la técnica del 56,25%.

  • Uno de YouTube (URL /embed/ con al menos 2 parámetros)
  • Uno de mapa (podés usar la URL de OpenStreetMap de la sección de sintaxis)
  • Ambos con title descriptivo y loading="lazy"
  • allowfullscreen donde corresponda

Autoevaluación — marcá lo que cumpliste:

La planilla digital

Los formularios son la forma en que la web te escucha: campos donde el usuario escribe, elige y envía información.

¿Qué es un formulario HTML?

Un formulario HTML es como una planilla en papel — tiene campos para completar, y cuando apretás "Enviar", esa información va a algún lado (un servidor, un email, etc.).

Usos: registro de usuarios, contacto, búsqueda, login, encuestas, compras online.

💡 Aclaración importante: el formulario HTML solo define la estructura visual. Para que los datos viajen de verdad se necesita un servidor o un servicio externo. En este módulo nos concentramos en la estructura.

📦 <form> · el contenedor

AtributoQué haceValor por defectoEjemplo
actionURL a donde se envían los datos. Vacío = recarga la misma páginala página actualaction="/enviar"
methodCómo viajan los datos: "get" (en la URL, visible) o "post" (en el cuerpo, más seguro)getmethod="post"
nameNombre del formulario para identificarlo desde JavaScriptname="contacto"

Analogía get vs post: get es como gritar los datos en voz alta (van en la barra de direcciones, a la vista de todos); post es como entregarlos en un sobre cerrado.

⚠️ Nunca uses method="get" para contraseñas o datos sensibles: aparecen en la barra de direcciones del navegador.

🏷️ <label> · la etiqueta del campo

Usar <label> es obligatorio por accesibilidad: los lectores de pantalla lo necesitan para anunciar qué es cada campo. Hay dos formas de vincularlo:

<!-- Ejemplo 1 · forma A: for + id (la más usada) -->
<label for="nombre">Nombre:</label>
<input type="text" id="nombre" name="nombre">

<!-- forma B: envolver el input -->
<label>Nombre:
  <input type="text" name="nombre">
</label>
💡 Un <label> bien vinculado también agranda el área clickeable — el usuario puede hacer clic en el texto del label para activar el campo. ¡Probalo en el demo de abajo!

⌨️ <input> · los campos, tipo por tipo

El elemento <input> (¡void, sin cierre, del Módulo 1!) cambia de personalidad según su type:

typeQué creaDetalles clave
textTexto de una líneaplaceholder, maxlength, minlength, value, required, disabled, readonly, autocomplete
emailCampo de emailValida el formato solo y muestra teclado de email en celulares
passwordContraseñaOculta los caracteres; acepta minlength
numberSolo númerosmin, max, step
dateSelector de fechaCalendario nativo del navegador
submitBotón de envíovalue define el texto del botón
resetBotón de limpiezaVacía todos los campos del formulario
buttonBotón genéricoSin acción propia: se controla con JavaScript
⚠️ El campo password oculta los caracteres visualmente, pero los datos no están encriptados hasta que el formulario viaja por HTTPS.

📝 <textarea> · texto multilínea

A diferencia de <input type="text">, el <textarea> acepta varias líneas y tiene etiqueta de cierre. Su contenido por defecto va ENTRE las etiquetas, no en un atributo value.

<!-- Ejemplo 2 -->
<label for="mensaje">Tu mensaje:</label>
<textarea id="mensaje" name="mensaje"
          rows="4" cols="40"
          placeholder="Escribí acá…"></textarea>
<!-- el redimensionado se controla con CSS:
     resize: none | both | vertical | horizontal -->

🌍 Atributos comunes a todos los campos

AtributoQué haceValor por defectoEjemplo
nameObligatorio para que el dato se envíe: es el nombre del datoname="email"
idPara vincular el campo con su <label>id="email"
requiredCampo obligatorio (booleano)no requeridorequired
disabledCampo deshabilitado (booleano)habilitadodisabled
readonlySolo lectura (booleano)editablereadonly
placeholderTexto guía gris (¡no reemplaza al label!)placeholder="Ej: Ana"
valueValor por defecto del campovacíovalue="Uruguay"
autocompletePermite o no el autocompletado del navegadoronautocomplete="off"
<!-- Ejemplo 3 · campo completo y accesible -->
<label for="correo">Email:</label>
<input type="email" id="correo" name="correo"
       placeholder="tu@email.com" required>

🧪 Probá un formulario REAL (sin envío)

Este formulario funciona de verdad: completalo y tocá «Enviar». No envía nada a ningún servidor — intercepta el envío y te muestra abajo los datos que capturó, con el name de cada campo.

📋 Demo: formulario de contacto

⚙️ Sintaxis en acción

<!-- Formulario mínimo completo -->
<form action="" method="post">
  <label for="usuario">Usuario:</label>
  <input type="text" id="usuario"
         name="usuario" required>

  <label for="clave">Contraseña:</label>
  <input type="password" id="clave"
         name="clave" minlength="8">

  <input type="submit" value="Ingresar">
</form>

🎬 Videos de referencia

📺 Video 1 · por TodoCode · todocodeacademy.com

📺 Video 2 · por TodoCode · todocodeacademy.com

🎮 Actividades de comprensión — tocá para desplegar
🧩 Actividad 1 · Armá el formulario básico

Arrastrá las tarjetas para dejar las partes de un formulario en el orden correcto de escritura. Tocá «Verificar».

🎯 Actividad 2 · El type correcto para cada caso

Arrastrá el type correcto a cada caso. ⚠️ Atención: hay opciones trampa que no van en ningún hueco.

type="email" type="password" type="date" type="number" type="texto" type="clave"
Para escribir el correo electrónico → ________
Para una contraseña oculta → ________
Para elegir la fecha de nacimiento → ________
Para la edad (solo números) → ________
✏️ Actividad 3 · Completá el formulario

Completá los espacios amarillos: el tipo del campo, el atributo que vincula con el label, y el atributo sin el cual el dato no se envía. Tocá «Verificar».

<form action="" method="post">
  <label ="correo">Email:</label>
  <input type="" id="correo"
         ="correo" required>
  <input type="" value="Enviar">
</form>
🧠 Actividad 4 · Múltiple opción

Leé cada pregunta y elegí la opción correcta. Vas a recibir una explicación con cada respuesta. No podés cambiar tu respuesta, así que pensala bien.

⌨️ Actividad 5a · Reto Práctico BÁSICO

Consigna: a este formulario de contacto le faltan piezas. Seguí los comentarios marcados con ✏️ y completalo. Ejecutá para verlo y descargá tu solución.

🚀 Actividad 5b · Reto Práctico AVANZADO

¡Formulario de registro completo! Creá desde cero un formulario de registro con estos campos:

  • Nombre y apellido (type="text")
  • Email
  • Contraseña con minlength="8"
  • Fecha de nacimiento
  • Botón de enviar y botón de limpiar (type="reset")

Todos los campos con su <label> vinculado por for/id, con name, y los obligatorios con required.

Autoevaluación — marcá lo que cumpliste:

Cuando el usuario elige entre opciones

Botones, casillas, listas desplegables: las herramientas para que el usuario elija sin tener que escribir.

Además de los campos de texto, los formularios tienen elementos especiales para cuando el usuario debe elegir entre opciones. Acá vemos los tres más importantes: casillas de verificación, botones de opción y listas desplegables.

☑️ checkbox · selección múltiple

Cuándo usar: cuando el usuario puede elegir varias opciones a la vez. Como marcar varias opciones en una encuesta — podés tildar todas las que quieras.

Cómo agrupar: todos con el mismo name pero diferente value. Atributos: name, value, checked (booleano: marcado por defecto), disabled.

<!-- Ejemplo 1 · grupo de checkboxes de intereses -->
<label><input type="checkbox" name="interes" value="deportes"> Deportes</label>
<label><input type="checkbox" name="interes" value="musica" checked> Música</label>
<label><input type="checkbox" name="interes" value="games"> Videojuegos</label>
💡 El value del checkbox es lo que se envía al servidor cuando está marcado. Si no tiene value, se envía "on" por defecto.

🔘 radio · selección única

Cuándo usar: cuando el usuario solo puede elegir UNA opción de un grupo. Como las preguntas de múltiple opción en un examen — solo podés marcar una respuesta.

Regla clave: todos los radio del mismo grupo DEBEN tener el mismo name. Eso los vuelve excluyentes: marcar uno desmarca los demás. El value es diferente en cada uno.

<!-- Ejemplo 2 · grupo de radio: turno -->
<label><input type="radio" name="turno" value="matutino" checked> Matutino</label>
<label><input type="radio" name="turno" value="vespertino"> Vespertino</label>
Checkbox ☑️Radio 🔘
SelecciónMúltipleÚnica
AgrupaciónMismo name (opcional)Mismo name (obligatorio)
ValorCada uno tiene su valueCada uno tiene su value
Por defectocheckedchecked

📜 <select> y <option> · lista desplegable

Cuándo usar: lista larga de opciones donde mostrar todas como radio ocuparía mucho espacio. Como el menú desplegable para elegir tu país al registrarte en un sitio.

Atributos de <select>: name, id, required, disabled, multiple (selección múltiple con Ctrl/Cmd), size (cuántas opciones mostrar a la vez).

Atributos de <option>:

Con <optgroup label="…"> agrupás opciones con un título (ej: países por continente).

<!-- Ejemplo 3 · select con optgroup -->
<label for="pais">País:</label>
<select id="pais" name="pais" required>
  <optgroup label="América del Sur">
    <option value="uy" selected>Uruguay</option>
    <option value="ar">Argentina</option>
  </optgroup>
  <optgroup label="Europa">
    <option value="es">España</option>
  </optgroup>
</select>
💡 Si el <option> no tiene value, se envía el texto visible. Siempre es mejor definir el value explícitamente.

🔳 <button> · el botón mejorado

¿Diferencia con <input type="submit">? <button> puede contener HTML adentro (texto + emoji + lo que quieras). Tipos: type="submit" (envía), type="reset" (limpia), type="button" (sin acción: para JavaScript).

⚠️ Un <button> dentro de un <form> sin type definido actúa como type="submit" por defecto. Esto puede causar envíos accidentales del formulario. ¡Definí el type siempre!

🗃️ <fieldset> y <legend> · agrupar campos

<fieldset> agrupa campos relacionados con un borde visual; <legend> es el título del grupo y aparece sobre el borde.

Cuándo usarlo: en formularios largos con varias secciones (datos personales, datos de envío…).

Accesibilidad: los lectores de pantalla anuncian la <legend> antes de cada campo del grupo. Es el "<section> de los formularios".

🧪 Formulario completo de ejemplo (¡funcional!)

Una encuesta real con TODO lo visto en las secciones 3 y 4. Completala y tocá «Enviar»: vas a ver abajo exactamente qué datos capturó (sin enviar nada a ningún lado).

📋 Demo: encuesta del liceo

Datos personales
Preferencias

¿Qué talleres te interesan? (podés marcar varios)

¿En qué turno preferís? (una sola opción)

⚙️ Sintaxis en acción

<!-- Encuesta con fieldset + legend -->
<form>
  <fieldset>
    <legend>Preferencias</legend>

    <label><input type="checkbox"
      name="gusto" value="futbol">
      Fútbol</label>

    <label><input type="radio"
      name="turno" value="am">
      Mañana</label>

    <button type="submit">Enviar 🚀</button>
  </fieldset>
</form>
🎮 Actividades de comprensión — tocá para desplegar
🧩 Actividad 1 · Armá el formulario agrupado

Arrastrá las tarjetas para dejar las líneas en el orden correcto de un formulario con fieldset y legend. Tocá «Verificar».

🎯 Actividad 2 · El elemento justo para cada caso

Arrastrá el elemento correcto a cada caso de uso. ⚠️ Atención: hay opciones trampa.

checkbox radio <select> <fieldset> <div> type="multi"
"Marcá TODOS los talleres que te interesan" → ________
"Elegí UN solo turno" → ________
"Elegí tu país (lista de 190 opciones)" → ________
"Agrupar los campos de datos personales" → ________
✏️ Actividad 3 · Completá el select

Completá los espacios amarillos: la etiqueta de cada opción, el atributo de lo que se envía y el atributo de la opción por defecto. Tocá «Verificar».

<select name="materia">
  < ="cs"
          >Ciencias de la Computación</option>
  <option value="mat">Matemática</option>
</select>
🧠 Actividad 4 · Múltiple opción

Leé cada pregunta y elegí la opción correcta. Vas a recibir una explicación con cada respuesta. No podés cambiar tu respuesta, así que pensala bien.

⌨️ Actividad 5a · Reto Práctico BÁSICO

Consigna: esta encuesta escolar está incompleta. Seguí los comentarios marcados con ✏️ y agregá los elementos avanzados que faltan. Ejecutá y descargá tu solución.

🚀 Actividad 5b · Reto Práctico AVANZADO

¡Inscripción a un evento! Creá desde cero el formulario de inscripción a un evento que te guste (torneo, recital, jornada de juegos…). Debe tener DOS <fieldset> con su <legend>:

  • "Datos personales": nombre, email, fecha de nacimiento — todos con label vinculado y required
  • "Preferencias": un grupo de checkbox, un grupo de radio con el mismo name, y un select con al menos 4 option

Cerrá con botones de enviar y limpiar usando <button> con type explícito.

Autoevaluación — marcá lo que cumpliste:

La firma visual de tu sitio

Pequeños detalles (el iconito de la pestaña, los datos del head) que hacen que tu sitio se vea profesional y prolijo.

⭐ ¿Qué es un favicon?

El favicon es el pequeño ícono que aparece en la pestaña del navegador, al lado del título de la página. Es la "firma visual" de tu sitio. También aparece en favoritos, en el historial, en la pantalla de inicio de los celulares y hasta en resultados de búsqueda.

↑ La de la izquierda se reconoce al instante entre veinte pestañas abiertas. La de la derecha… es una más del montón.

Formatos de favicon

FormatoCaracterísticas
.icoEl original; funciona en todos los navegadores. Puede contener varios tamaños (16×16, 32×32, 48×48) en un solo archivo.
.pngEl más usado hoy. Simple y ligero. Requiere especificar el tamaño.
.svgEscalable: perfecto para cualquier tamaño. Soporte moderno.
.webpFormato moderno, muy eficiente, soporte creciente.
💡 El tamaño recomendado mínimo es 16×16 px para la pestaña. Para pantallas retina y móviles, usar 32×32 o 192×192.

🔗 Vincular el favicon en el <head>

<!-- Ejemplo 1 · de más simple a más completa -->

<!-- Forma mínima: favicon.ico en la raíz del sitio -->
<link rel="icon" href="favicon.ico">

<!-- PNG con tamaño especificado -->
<link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png">

<!-- SVG moderno -->
<link rel="icon" type="image/svg+xml" href="favicon.svg">

<!-- Para dispositivos Apple (iOS): ícono en pantalla de inicio -->
<link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png">

<!-- Para Android / PWA -->
<link rel="manifest" href="site.webmanifest">

Para un sitio básico, basta con la primera o segunda forma. Las demás son refinamientos para celulares y aplicaciones web.

🗺️ El mapa completo del <head>

El <head> es como el DNI de tu página — contiene toda la información sobre ella pero el usuario no la ve directamente. Lo que sí ve son las consecuencias: el título en la pestaña, el favicon, los estilos.

¿Qué hace cada grupo? Las Open Graph controlan cómo se ve el link de tu página al compartirlo en redes (título, descripción e imagen de la tarjetita). El defer en los scripts le dice al navegador: "descargá el script mientras leés el HTML, pero ejecutalo recién al final" — así la página no se traba.

<!-- Ejemplo 2 · head completo de una página real -->
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Club de Astronomía · Inicio</title>
  <meta name="description" content="Observaciones, charlas y salidas del club">
  <link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png">
  <link rel="stylesheet" href="css/estilos.css">
</head>
<!-- Ejemplo 3 · Open Graph: la "tarjetita" al compartir -->
<meta property="og:title" content="Club de Astronomía">
<meta property="og:description" content="Mirá el cielo con nosotros">
<meta property="og:image" content="https://misitio.com/imagenes/banner.jpg">

⚙️ Sintaxis en acción

<!-- El simulador renderiza solo el body, -->
<!-- así que probá el head COMPLETO -->
<!-- descargándolo y abriéndolo: -->
<!-- al descargar, mirá la pestaña -->
<!-- del navegador: título y favicon. -->
<head>
  <meta charset="UTF-8">
  <title>¡Mirá la pestaña!</title>
  <link rel="icon"
    href="https://claude.ai/favicon.ico">
</head>
🎮 Actividades de comprensión — tocá para desplegar
🧩 Actividad 1 · Del head: de obligatorio a opcional

Arrastrá las etiquetas del head y ordenalas de la más imprescindible a la más opcional, según la teoría. Tocá «Verificar».

🎯 Actividad 2 · Cada etiqueta a su categoría

Arrastrá cada etiqueta del head a su categoría. ¡Todas tienen lugar!

meta description meta author og:title og:image link rel="icon" apple-touch-icon link rel="stylesheet" Google Fonts
🔍 SEO
📣 Redes
⭐ Favicon
🎨 Estilos
✏️ Actividad 3 · Completá el head

Completá los espacios amarillos: la codificación, la etiqueta del título y los dos atributos del favicon. Tocá «Verificar».

<head>
  <meta ="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <>Mi sitio</title>
  <link ="icon" ="favicon.ico">
</head>
🧠 Actividad 4 · Múltiple opción

Leé cada pregunta y elegí la opción correcta. Vas a recibir una explicación con cada respuesta. No podés cambiar tu respuesta, así que pensala bien.

⌨️ Actividad 5a · Reto Práctico BÁSICO

Consigna: a este head le faltan piezas clave. Seguí los comentarios marcados con ✏️ y completalo. Después descargá la página y abrila para ver el título y el favicon en la pestaña.

🚀 Actividad 5b · Reto Práctico AVANZADO

¡El head profesional! Construí desde cero una página mínima cuyo <head> esté completo de verdad:

  • Charset, viewport y título descriptivo
  • meta description para SEO
  • Favicon vinculado en 3 formatos (ico, png con sizes, svg — las rutas pueden ser inventadas, lo que importa es la sintaxis)
  • Una fuente de Google Fonts con su preconnect + stylesheet (podés copiar la estructura desde fonts.google.com o desde el ejemplo de la teoría)

Autoevaluación — marcá lo que cumpliste:

De una página a un sitio completo

📚 ¿Qué es un sitio multipágina?

Un sitio web es como un libro — tiene varias páginas, pero todas comparten la misma tapa y la misma estructura. Cada página HTML es un capítulo diferente. Técnicamente, un sitio es una colección de archivos HTML (más CSS, JS e imágenes) organizados en carpetas.

El archivo principal siempre se llama index.html — es la "página de entrada". Es como la recepción de un edificio: lo primero que ve el visitante.

🌳 El árbol de carpetas (¡interactivo!)

Tocá cualquier archivo del árbol para ver qué rol cumple y cómo referenciarlo desde otro archivo con una ruta relativa:

  • 📁 mi-sitio/
    • 📁 css/
    • 📁 js/
    • 📁 imagenes/

👈 Elegí un archivo del árbol

Acá vas a ver qué rol cumple ese archivo dentro del sitio y un ejemplo real de cómo referenciarlo desde otro archivo usando una ruta relativa.

💡 Nombrar archivos y carpetas siempre en minúsculas, sin espacios ni tildes. Usar guiones - en lugar de espacios. Los servidores Linux distinguen mayúsculas: Logo.png y logo.png son archivos distintos.

🧭 Rutas relativas vs. absolutas

Ruta absoluta: la URL completa desde el origen. Ej: https://misitio.com/imagenes/logo.png. Siempre funciona desde cualquier lugar, pero depende del dominio.

Ruta relativa: relativa a la ubicación del archivo actual. Es como dar indicaciones desde donde estás parado: "andá una cuadra para atrás y doblá".

RutaSignificadoEjemplo
archivo.htmlEn la misma carpetahref="contacto.html"
carpeta/archivo.htmlEn una subcarpetasrc="imagenes/foto.jpg"
../archivo.htmlSubir una carpetahref="../index.html"
../../archivo.htmlSubir dos carpetashref="../../index.html"
/archivo.htmlDesde la raíz del sitiohref="/index.html"
<!-- Ejemplo 1 · recorridos típicos en el árbol de arriba -->
Estás en index.html y querés el logo:
<img src="imagenes/logo.png">      → entrar a la subcarpeta

Estás en css/estilos.css y querés el logo:
url("../imagenes/logo.png")        → subir 1 y entrar a imagenes/

Estás en contacto.html y querés volver al inicio:
<a href="index.html">Inicio</a>   → misma carpeta

🔗 El menú de navegación entre páginas

El mismo <nav> (¡Módulo 2!) se repite en todas las páginas del sitio. El problema: si las páginas están en carpetas distintas, las rutas del menú cambian. Soluciones: usar rutas desde la raíz (/) cuando sea posible, o mantener rutas relativas coherentes.

<!-- Ejemplo 2 · menú que funciona en las 3 páginas (todas en la raíz) -->
<nav>
  <a href="index.html" class="activo">Inicio</a>
  <a href="acerca.html">Acerca de</a>
  <a href="contacto.html">Contacto</a>
</nav>
<!-- buena práctica: class="activo" marca la página actual -->

🚪 index.html y el comportamiento de las carpetas

Si una URL termina en / (carpeta), el servidor busca automáticamente index.html adentro. Ej: misitio.com/blog/ carga misitio.com/blog/index.html. Por eso la convención es nombrar la página principal de cada sección como index.html.

<!-- Ejemplo 3 · la magia del index -->
misitio.com/          → carga  misitio.com/index.html
misitio.com/blog/     → carga  misitio.com/blog/index.html
misitio.com/galeria/  → carga  misitio.com/galeria/index.html
⚠️ Las rutas relativas dependen de DESDE DÓNDE se abre el archivo. Si abrís el HTML directamente desde tu computadora (doble clic → file://), las rutas pueden comportarse diferente que en un servidor. Siempre probá en un servidor local o en vivo.

⚙️ Sintaxis en acción

<!-- Menú multipágina con página activa -->
<nav>
  <a href="index.html"
     class="activo">Inicio</a> |
  <a href="galeria/index.html">Galería</a> |
  <a href="contacto.html">Contacto</a>
</nav>

<!-- Imagen en subcarpeta -->
<img src="imagenes/logo.png"
     alt="Logo del sitio">
🎮 Actividades de comprensión — tocá para desplegar
🧩 Actividad 1 · Armá la jerarquía del sitio

Arrastrá las tarjetas para ordenar la estructura del sitio de mayor a menor jerarquía. Tocá «Verificar».

🎯 Actividad 2 · ¿Qué tipo de ruta es?

Arrastrá cada ruta a su tipo. ¡Todas las tarjetas tienen lugar!

https://misitio.com/logo.png https://ceibal.edu.uy/foto.jpg imagenes/foto.jpg ../index.html contacto.html /index.html /css/estilos.css
🌍 Absoluta
📍 Relativa
🏠 Desde la raíz
✏️ Actividad 3 · Completá las rutas

Mirá el árbol de carpetas de la teoría y completá las rutas. Recordá: los dos archivos HTML están en la raíz de mi-sitio/, y el CSS está en la carpeta css/. Tocá «Verificar».

<!-- Estás editando index.html (en la raíz) -->

<!-- el logo está en la carpeta imagenes/ -->
<img src="" alt="Logo">

<!-- la página de contacto está al lado de index -->
<a href="">Contacto</a>

<!-- Ahora estás editando css/estilos.css -->
<!-- y querés usar el banner de imagenes/ -->
background: url("");
🧠 Actividad 4 · Múltiple opción

Leé cada pregunta y elegí la opción correcta. Vas a recibir una explicación con cada respuesta. No podés cambiar tu respuesta, así que pensala bien.

⌨️ Actividad 5a · Reto Práctico BÁSICO

Consigna: este menú de navegación tiene las rutas vacías. Con el árbol de carpetas en los comentarios como guía, completá cada href y el src del logo. Ejecutá y descargá tu solución.

🚀 Actividad 5b · Reto Práctico AVANZADO

¡Arquitecta/o de sitios! Diseñá la estructura de carpetas completa de un sitio de 4 páginas (inicio, galería, blog, contacto).

  • Primero, documentala: escribí el árbol de carpetas como comentario HTML al inicio (con la sintaxis de ├── y └── como en la teoría)
  • Después, escribí el HTML completo de la página de inicio (index.html) con estructura semántica y un menú de navegación funcional con rutas relativas correctas a las otras 3 páginas según TU árbol

Autoevaluación — marcá lo que cumpliste:

¡Este es el reto final! 🚀
Un sitio web multipágina con todo lo aprendido en los tres módulos.

🎯 MISIÓN: Mi Primer Sitio Web Completo

Vas a crear la estructura completa de un sitio web sobre un tema que elijas (un hobby, un deporte, tu banda favorita, un juego…). El sitio debe tener al menos 2 páginas HTML:

📄 Página 1 — index.html (Inicio):

  • Estructura HTML completa y válida
  • <head> con charset, viewport, título, descripción SEO y favicon vinculado
  • Estructura semántica completa (<header>, <nav>, <main>, <footer>)
  • Menú de navegación con links a todas las páginas usando rutas relativas
  • Al menos una sección con contenido multimedia (<video>, <audio> o <iframe>)
  • id y class aplicados correctamente
  • Comentarios explicativos en cada sección semántica

📄 Página 2 — contacto.html (Contacto):

  • Misma estructura semántica y menú de navegación que index.html
  • Formulario completo con: <fieldset> y <legend>, campos de texto, email, select, checkbox o radio, textarea y botón de envío
  • Todos los campos con <label> correctamente vinculado
  • Atributo required en los campos obligatorios

🛤️ Flujo de trabajo obligatorio · 8 pasos

1

🗺️ Planificá tu sitio: ¿cuántas páginas? ¿qué contenido tiene cada una?

2

🗂️ Diseñá el árbol de carpetas: dónde van los archivos, cómo se llaman.

3

🖼️ Hacé el mockup de cada página antes de codear.

4

💻 Comenzá con index.html — estructura semántica primero, luego el contenido.

5

📋 Creá contacto.html — copiá la estructura base y agregá el formulario.

6

🔗 Verificá que todos los links del menú usen rutas relativas correctas.

7

👁️ Ejecutá, previsualizá y revisá tu checklist.

8

⬇️ Descargá tu trabajo (las dos páginas).

💻 Tu sitio: dos archivos, dos editores

📄 index.html · Editor de Código
👁️ Previsualización de index.html
📄 contacto.html · Editor de Código
👁️ Previsualización de contacto.html
✅ Checklist de autoevaluación

Antes de entregar, revisá tu trabajo y marcá cada punto que cumpliste:

📖 Glosario interactivo del Capítulo 3

Tocá cualquier tarjeta para girarla y ver su definición, un ejemplo y el link a la sección donde se explica. Usá el buscador para filtrar.