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>
| Atributo | Qué hace | ¿Obligatorio? | Ejemplo |
|---|---|---|---|
src | URL de la página a mostrar | Sí | src="https://…" |
title | Describe el contenido — obligatorio por accesibilidad | Sí (buenas prácticas) | title="Mapa del liceo" |
width / height | Dimensiones (mejor con CSS para responsivo) | No | width="560" |
allowfullscreen | Permite pantalla completa | No | booleano |
allow | Permisos específicos del iframe | No | allow="autoplay; …" |
loading="lazy" | Carga diferida: no carga hasta acercarse — mejora el rendimiento | No (recomendado) | loading="lazy" |
referrerpolicy | Qué información de referencia se envía al cargar | No | strict-origin-when-cross-origin |
sandbox | Restringe lo que puede hacer el iframe, por seguridad | No | sandbox="allow-scripts" |
frameborder | Borde del iframe ("0" = sin borde) — en HTML5 se prefiere CSS | No | frameborder="0" |
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ámetro | Efecto |
|---|---|
?autoplay=1 | Reproduce al cargar (requiere &mute=1) |
?mute=1 | Inicia silenciado |
?start=N / ?end=N | Empieza/termina en el segundo N (¡como los cortes de video de los módulos anteriores!) |
?controls=0 | Oculta los controles del reproductor |
?loop=1&playlist=VIDEO_ID | Repite 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>
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
Arrastrá las tarjetas para reconstruir un iframe de YouTube completo, en el orden en que se escribe. Tocá «Verificar».
Arrastrá cada atributo a la categoría que le corresponde. ¡Todas las tarjetas tienen lugar!
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>
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.
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.
¡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
titledescriptivo yloading="lazy" allowfullscreendonde 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.
📦 <form> · el contenedor
| Atributo | Qué hace | Valor por defecto | Ejemplo |
|---|---|---|---|
action | URL a donde se envían los datos. Vacío = recarga la misma página | la página actual | action="/enviar" |
method | Cómo viajan los datos: "get" (en la URL, visible) o "post" (en el cuerpo, más seguro) | get | method="post" |
name | Nombre del formulario para identificarlo desde JavaScript | — | name="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.
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>
<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:
| type | Qué crea | Detalles clave |
|---|---|---|
text | Texto de una línea | placeholder, maxlength, minlength, value, required, disabled, readonly, autocomplete |
email | Campo de email | Valida el formato solo y muestra teclado de email en celulares |
password | Contraseña | Oculta los caracteres; acepta minlength |
number | Solo números | min, max, step |
date | Selector de fecha | Calendario nativo del navegador |
submit | Botón de envío | value define el texto del botón |
reset | Botón de limpieza | Vacía todos los campos del formulario |
button | Botón genérico | Sin acción propia: se controla con JavaScript |
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
| Atributo | Qué hace | Valor por defecto | Ejemplo |
|---|---|---|---|
name | Obligatorio para que el dato se envíe: es el nombre del dato | — | name="email" |
id | Para vincular el campo con su <label> | — | id="email" |
required | Campo obligatorio (booleano) | no requerido | required |
disabled | Campo deshabilitado (booleano) | habilitado | disabled |
readonly | Solo lectura (booleano) | editable | readonly |
placeholder | Texto guía gris (¡no reemplaza al label!) | — | placeholder="Ej: Ana" |
value | Valor por defecto del campo | vacío | value="Uruguay" |
autocomplete | Permite o no el autocompletado del navegador | on | autocomplete="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.
⚙️ 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
Arrastrá las tarjetas para dejar las partes de un formulario en el orden correcto de escritura. Tocá «Verificar».
Arrastrá el type correcto a cada caso. ⚠️ Atención: hay opciones trampa que no van en ningún hueco.
Para escribir el correo electrónico → ________ Para una contraseña oculta → ________ Para elegir la fecha de nacimiento → ________ Para la edad (solo números) → ________
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>
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.
Consigna: a este formulario de contacto le faltan piezas. Seguí los comentarios marcados con ✏️ y completalo. Ejecutá para verlo y descargá tu solución.
¡Formulario de registro completo! Creá desde cero un formulario de registro con estos campos:
- Nombre y apellido (
type="text") - 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>
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ón | Múltiple | Única |
| Agrupación | Mismo name (opcional) | Mismo name (obligatorio) |
| Valor | Cada uno tiene su value | Cada uno tiene su value |
| Por defecto | checked | checked |
📜 <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>:
value— lo que se envía al servidor- El texto visible va entre las etiquetas
selected— la opción elegida por defectodisabled— la opción no se puede elegir
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>
<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).
<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…).
<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).
⚙️ 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
Arrastrá las tarjetas para dejar las líneas en el orden correcto de un formulario con fieldset y legend. Tocá «Verificar».
Arrastrá el elemento correcto a cada caso de uso. ⚠️ Atención: hay opciones trampa.
"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" → ________
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>
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.
Consigna: esta encuesta escolar está incompleta. Seguí los comentarios marcados con ✏️ y agregá los elementos avanzados que faltan. Ejecutá y descargá tu solución.
¡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.
Formatos de favicon
| Formato | Características |
|---|---|
| .ico | El original; funciona en todos los navegadores. Puede contener varios tamaños (16×16, 32×32, 48×48) en un solo archivo. |
| .png | El más usado hoy. Simple y ligero. Requiere especificar el tamaño. |
| .svg | Escalable: perfecto para cualquier tamaño. Soporte moderno. |
| .webp | Formato moderno, muy eficiente, soporte creciente. |
🔗 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
Arrastrá las etiquetas del head y ordenalas de la más imprescindible a la más opcional, según la teoría. Tocá «Verificar».
Arrastrá cada etiqueta del head a su categoría. ¡Todas tienen lugar!
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>
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.
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.
¡El head profesional! Construí desde cero una página mínima cuyo <head> esté completo de verdad:
- Charset, viewport y título descriptivo
meta descriptionpara 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/
- 📁 css/
👈 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.
- 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á".
| Ruta | Significado | Ejemplo |
|---|---|---|
archivo.html | En la misma carpeta | href="contacto.html" |
carpeta/archivo.html | En una subcarpeta | src="imagenes/foto.jpg" |
../archivo.html | Subir una carpeta | href="../index.html" |
../../archivo.html | Subir dos carpetas | href="../../index.html" |
/archivo.html | Desde la raíz del sitio | href="/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
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
Arrastrá las tarjetas para ordenar la estructura del sitio de mayor a menor jerarquía. Tocá «Verificar».
Arrastrá cada ruta a su tipo. ¡Todas las tarjetas tienen lugar!
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("");
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.
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.
¡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>) idyclassaplicados 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
requireden los campos obligatorios
🛤️ Flujo de trabajo obligatorio · 8 pasos
🗺️ Planificá tu sitio: ¿cuántas páginas? ¿qué contenido tiene cada una?
🗂️ Diseñá el árbol de carpetas: dónde van los archivos, cómo se llaman.
🖼️ Hacé el mockup de cada página antes de codear.
💻 Comenzá con index.html — estructura semántica primero, luego el contenido.
📋 Creá contacto.html — copiá la estructura base y agregá el formulario.
🔗 Verificá que todos los links del menú usen rutas relativas correctas.
👁️ Ejecutá, previsualizá y revisá tu checklist.
⬇️ Descargá tu trabajo (las dos páginas).
💻 Tu sitio: dos archivos, dos editores
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.
No encontramos resultados para tu búsqueda. Probá con otra palabra. 🔎