DESDE EL PRIMER ARCHIVO HASTA EL RESULTADO
Conecta JavaScript a la página que construiste.
Cada paso acumula lo anterior. Lee la explicación, observa el
resultado y prueba una modificación. El laboratorio adapta los
archivos separados a un marco aislado.
1. Crea y conecta js/app.js
2. Observa un valor en la consola
3. Selecciona elementos existentes
4. Cambia texto con textContent
5. Define un estado y una función
6. Reacciona a un evento click
7. Añade una acción de reinicio
8. Prepara una colección y una función de dibujo
9. Captura el formulario y añade una idea
10. Añade un patrón de almacenamiento con errores
Qué añadimos
Dónde va y en qué orden
Qué deberías ver
¿Qué pasa si…?
Quitar la pieza de
este paso Mover la pieza al
comienzo
Escribe antes de mirar la solución
Activar
escritura guiada
El editor conserva el programa del paso anterior. Completa la
nueva parte siguiendo el objetivo y pulsa «Aplicar mis cambios».
Observa la consola y prueba los controles de la página.
Ver una pista de código
Cargar solución para comparar
No necesitas memorizar un fragmento exacto: puede haber otras
soluciones válidas. Al cambiar de paso se carga un nuevo punto
de partida y se descartan las ediciones de este paso.
index.html · documento acumulado assets/style.css · reglas acumuladas js/app.js · instrucciones acumuladas
Aplicar mis cambios
Restablecer este paso Ancho de ejemplo
Ajustar al espacio
360 px · móvil
1100 px · escritorio
Consola y comportamiento
Ver código usado en la variante
El navegador normaliza el HTML al analizarlo. La vista previa
incrusta CSS y JavaScript; en tus archivos mantendrás sus
enlaces externos.
HTML
CSS
JavaScript
<!doctype html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Mi primera página</title>
<meta name="description" content="Mi primera página de estudio: estructura, textos, enlaces y ejemplos de HTML.">
<link rel="stylesheet" href="assets/style.css">
<script src="js/app.js" defer></script>
</head>
<body>
<header>
<h1>Mi diario de aprendizaje</h1>
<p id="mensaje">Todavía no has realizado una acción.</p>
</header>
<nav aria-label="Principal">
<a href="#temas">Temas</a>
<a href="#contacto">Contacto</a>
</nav>
<main>
<section id="temas">
<h2>Lo que quiero aprender</h2>
<p>Primero estructura, después estilo y finalmente interacción.</p>
<ol>
<li>HTML: contenido</li>
<li>CSS: presentación</li>
<li>JavaScript: interacción</li>
</ol>
<figure>
<img src="assets/tutorial-grid.svg" alt="Diagrama con tres áreas iguales" width="360" height="120">
<figcaption>Tres áreas que se pueden distribuir.</figcaption>
</figure>
<article class="lesson-card">
<h3>Mi primera ficha</h3>
<p>Una idea que puedo consultar de forma independiente.</p>
</article>
<table>
<caption>Qué aporta cada lenguaje</caption>
<thead><tr><th scope="col">Lenguaje</th><th scope="col">Función</th></tr></thead>
<tbody><tr><td>HTML</td><td>Estructura</td></tr><tr><td>CSS</td><td>Presentación</td></tr></tbody>
</table>
</section>
<section id="practica">
<h2>Mi práctica interactiva</h2>
<h3>Contador</h3>
<button id="sumar" type="button">Sumar</button>
<button id="reiniciar" type="button">Reiniciar</button>
<output id="contador" aria-live="polite">0</output>
<h3>Mi lista</h3>
<form id="tarea-form">
<label for="tarea">Una idea para practicar</label>
<input id="tarea" required>
<button type="submit">Añadir</button>
</form>
<ul id="tareas"></ul>
<details><summary>Ver una pista</summary><p>El evento cambia un dato; después actualiza la vista.</p></details>
</section>
</main>
<footer id="contacto">
<p>Un proyecto para practicar cada día.</p>
</footer>
</body>
</html>
body {
margin: 0;
padding: 24px;
font-family: system-ui, sans-serif;
line-height: 1.6;
color: #18213a;
}
* { box-sizing: border-box; }
h1 { font-size: clamp(28px, 5vw, 46px); line-height: 1.15; }
h2 { font-size: 26px; }
h3 { font-size: 20px; }
header, nav, main, footer { max-width: 1000px; margin: 0 auto 24px; }
section { margin-bottom: 32px; }
.lesson-card { padding: 24px; margin: 16px 0; border: 1px solid #cfd7e8; border-radius: 16px; background: white; }
header { background: #eef1ff; padding: 24px; border-radius: 16px; }
a { color: #233de0; }
input, button { font: inherit; padding: 10px; margin: 8px 0; }
button { background: #233de0; color: white; border: 0; border-radius: 8px; }
nav { display: flex; flex-wrap: wrap; gap: 16px; }
#temas { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; align-items: start; }
#temas > h2, #temas > p { grid-column: 1 / -1; }
img { max-width: 100%; height: auto; }
figure { margin: 16px 0; }
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #cfd7e8; padding: 10px; text-align: left; }
a:focus-visible, button:focus-visible, input:focus-visible { outline: 3px solid #b74619; outline-offset: 3px; }
@media (max-width: 700px) { #temas { grid-template-columns: 1fr; } }
.lesson-card { background: #e5edff; }
output { padding: 20px; font-size: 24px; }
li { margin: 10px 0; }
script Conectar JavaScript
<!doctype html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Mi primera página</title>
<meta name="description" content="Mi primera página de estudio: estructura, textos, enlaces y ejemplos de HTML.">
<link rel="stylesheet" href="assets/style.css">
<script src="js/app.js" defer></script>
</head>
<body>
<header>
<h1>Mi diario de aprendizaje</h1>
<p id="mensaje">Todavía no has realizado una acción.</p>
</header>
<nav aria-label="Principal">
<a href="#temas">Temas</a>
<a href="#contacto">Contacto</a>
</nav>
<main>
<section id="temas">
<h2>Lo que quiero aprender</h2>
<p>Primero estructura, después estilo y finalmente interacción.</p>
<ol>
<li>HTML: contenido</li>
<li>CSS: presentación</li>
<li>JavaScript: interacción</li>
</ol>
<figure>
<img src="assets/tutorial-grid.svg" alt="Diagrama con tres áreas iguales" width="360" height="120">
<figcaption>Tres áreas que se pueden distribuir.</figcaption>
</figure>
<article class="lesson-card">
<h3>Mi primera ficha</h3>
<p>Una idea que puedo consultar de forma independiente.</p>
</article>
<table>
<caption>Qué aporta cada lenguaje</caption>
<thead><tr><th scope="col">Lenguaje</th><th scope="col">Función</th></tr></thead>
<tbody><tr><td>HTML</td><td>Estructura</td></tr><tr><td>CSS</td><td>Presentación</td></tr></tbody>
</table>
</section>
<section id="practica">
<h2>Mi práctica interactiva</h2>
<h3>Contador</h3>
<button id="sumar" type="button">Sumar</button>
<button id="reiniciar" type="button">Reiniciar</button>
<output id="contador" aria-live="polite">0</output>
<h3>Mi lista</h3>
<form id="tarea-form">
<label for="tarea">Una idea para practicar</label>
<input id="tarea" required>
<button type="submit">Añadir</button>
</form>
<ul id="tareas"></ul>
<details><summary>Ver una pista</summary><p>El evento cambia un dato; después actualiza la vista.</p></details>
</section>
</main>
<footer id="contacto">
<p>Un proyecto para practicar cada día.</p>
</footer>
</body>
</html>
body {
margin: 0;
padding: 24px;
font-family: system-ui, sans-serif;
line-height: 1.6;
color: #18213a;
}
* { box-sizing: border-box; }
h1 { font-size: clamp(28px, 5vw, 46px); line-height: 1.15; }
h2 { font-size: 26px; }
h3 { font-size: 20px; }
header, nav, main, footer { max-width: 1000px; margin: 0 auto 24px; }
section { margin-bottom: 32px; }
.lesson-card { padding: 24px; margin: 16px 0; border: 1px solid #cfd7e8; border-radius: 16px; background: white; }
header { background: #eef1ff; padding: 24px; border-radius: 16px; }
a { color: #233de0; }
input, button { font: inherit; padding: 10px; margin: 8px 0; }
button { background: #233de0; color: white; border: 0; border-radius: 8px; }
nav { display: flex; flex-wrap: wrap; gap: 16px; }
#temas { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; align-items: start; }
#temas > h2, #temas > p { grid-column: 1 / -1; }
img { max-width: 100%; height: auto; }
figure { margin: 16px 0; }
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #cfd7e8; padding: 10px; text-align: left; }
a:focus-visible, button:focus-visible, input:focus-visible { outline: 3px solid #b74619; outline-offset: 3px; }
@media (max-width: 700px) { #temas { grid-template-columns: 1fr; } }
.lesson-card { background: #e5edff; }
output { padding: 20px; font-size: 24px; }
li { margin: 10px 0; }
console.log("app.js está funcionando");
console.log("app.js está funcionando");
console.log
<!doctype html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Mi primera página</title>
<meta name="description" content="Mi primera página de estudio: estructura, textos, enlaces y ejemplos de HTML.">
<link rel="stylesheet" href="assets/style.css">
<script src="js/app.js" defer></script>
</head>
<body>
<header>
<h1>Mi diario de aprendizaje</h1>
<p id="mensaje">Todavía no has realizado una acción.</p>
</header>
<nav aria-label="Principal">
<a href="#temas">Temas</a>
<a href="#contacto">Contacto</a>
</nav>
<main>
<section id="temas">
<h2>Lo que quiero aprender</h2>
<p>Primero estructura, después estilo y finalmente interacción.</p>
<ol>
<li>HTML: contenido</li>
<li>CSS: presentación</li>
<li>JavaScript: interacción</li>
</ol>
<figure>
<img src="assets/tutorial-grid.svg" alt="Diagrama con tres áreas iguales" width="360" height="120">
<figcaption>Tres áreas que se pueden distribuir.</figcaption>
</figure>
<article class="lesson-card">
<h3>Mi primera ficha</h3>
<p>Una idea que puedo consultar de forma independiente.</p>
</article>
<table>
<caption>Qué aporta cada lenguaje</caption>
<thead><tr><th scope="col">Lenguaje</th><th scope="col">Función</th></tr></thead>
<tbody><tr><td>HTML</td><td>Estructura</td></tr><tr><td>CSS</td><td>Presentación</td></tr></tbody>
</table>
</section>
<section id="practica">
<h2>Mi práctica interactiva</h2>
<h3>Contador</h3>
<button id="sumar" type="button">Sumar</button>
<button id="reiniciar" type="button">Reiniciar</button>
<output id="contador" aria-live="polite">0</output>
<h3>Mi lista</h3>
<form id="tarea-form">
<label for="tarea">Una idea para practicar</label>
<input id="tarea" required>
<button type="submit">Añadir</button>
</form>
<ul id="tareas"></ul>
<details><summary>Ver una pista</summary><p>El evento cambia un dato; después actualiza la vista.</p></details>
</section>
</main>
<footer id="contacto">
<p>Un proyecto para practicar cada día.</p>
</footer>
</body>
</html>
body {
margin: 0;
padding: 24px;
font-family: system-ui, sans-serif;
line-height: 1.6;
color: #18213a;
}
* { box-sizing: border-box; }
h1 { font-size: clamp(28px, 5vw, 46px); line-height: 1.15; }
h2 { font-size: 26px; }
h3 { font-size: 20px; }
header, nav, main, footer { max-width: 1000px; margin: 0 auto 24px; }
section { margin-bottom: 32px; }
.lesson-card { padding: 24px; margin: 16px 0; border: 1px solid #cfd7e8; border-radius: 16px; background: white; }
header { background: #eef1ff; padding: 24px; border-radius: 16px; }
a { color: #233de0; }
input, button { font: inherit; padding: 10px; margin: 8px 0; }
button { background: #233de0; color: white; border: 0; border-radius: 8px; }
nav { display: flex; flex-wrap: wrap; gap: 16px; }
#temas { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; align-items: start; }
#temas > h2, #temas > p { grid-column: 1 / -1; }
img { max-width: 100%; height: auto; }
figure { margin: 16px 0; }
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #cfd7e8; padding: 10px; text-align: left; }
a:focus-visible, button:focus-visible, input:focus-visible { outline: 3px solid #b74619; outline-offset: 3px; }
@media (max-width: 700px) { #temas { grid-template-columns: 1fr; } }
.lesson-card { background: #e5edff; }
output { padding: 20px; font-size: 24px; }
li { margin: 10px 0; }
console.log("app.js está funcionando");
const boton = document.querySelector("#sumar");
const salida = document.querySelector("#contador");
const mensaje = document.querySelector("#mensaje");
const boton = document.querySelector("#sumar");
const salida = document.querySelector("#contador");
const mensaje = document.querySelector("#mensaje");
querySelector const
<!doctype html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Mi primera página</title>
<meta name="description" content="Mi primera página de estudio: estructura, textos, enlaces y ejemplos de HTML.">
<link rel="stylesheet" href="assets/style.css">
<script src="js/app.js" defer></script>
</head>
<body>
<header>
<h1>Mi diario de aprendizaje</h1>
<p id="mensaje">Todavía no has realizado una acción.</p>
</header>
<nav aria-label="Principal">
<a href="#temas">Temas</a>
<a href="#contacto">Contacto</a>
</nav>
<main>
<section id="temas">
<h2>Lo que quiero aprender</h2>
<p>Primero estructura, después estilo y finalmente interacción.</p>
<ol>
<li>HTML: contenido</li>
<li>CSS: presentación</li>
<li>JavaScript: interacción</li>
</ol>
<figure>
<img src="assets/tutorial-grid.svg" alt="Diagrama con tres áreas iguales" width="360" height="120">
<figcaption>Tres áreas que se pueden distribuir.</figcaption>
</figure>
<article class="lesson-card">
<h3>Mi primera ficha</h3>
<p>Una idea que puedo consultar de forma independiente.</p>
</article>
<table>
<caption>Qué aporta cada lenguaje</caption>
<thead><tr><th scope="col">Lenguaje</th><th scope="col">Función</th></tr></thead>
<tbody><tr><td>HTML</td><td>Estructura</td></tr><tr><td>CSS</td><td>Presentación</td></tr></tbody>
</table>
</section>
<section id="practica">
<h2>Mi práctica interactiva</h2>
<h3>Contador</h3>
<button id="sumar" type="button">Sumar</button>
<button id="reiniciar" type="button">Reiniciar</button>
<output id="contador" aria-live="polite">0</output>
<h3>Mi lista</h3>
<form id="tarea-form">
<label for="tarea">Una idea para practicar</label>
<input id="tarea" required>
<button type="submit">Añadir</button>
</form>
<ul id="tareas"></ul>
<details><summary>Ver una pista</summary><p>El evento cambia un dato; después actualiza la vista.</p></details>
</section>
</main>
<footer id="contacto">
<p>Un proyecto para practicar cada día.</p>
</footer>
</body>
</html>
body {
margin: 0;
padding: 24px;
font-family: system-ui, sans-serif;
line-height: 1.6;
color: #18213a;
}
* { box-sizing: border-box; }
h1 { font-size: clamp(28px, 5vw, 46px); line-height: 1.15; }
h2 { font-size: 26px; }
h3 { font-size: 20px; }
header, nav, main, footer { max-width: 1000px; margin: 0 auto 24px; }
section { margin-bottom: 32px; }
.lesson-card { padding: 24px; margin: 16px 0; border: 1px solid #cfd7e8; border-radius: 16px; background: white; }
header { background: #eef1ff; padding: 24px; border-radius: 16px; }
a { color: #233de0; }
input, button { font: inherit; padding: 10px; margin: 8px 0; }
button { background: #233de0; color: white; border: 0; border-radius: 8px; }
nav { display: flex; flex-wrap: wrap; gap: 16px; }
#temas { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; align-items: start; }
#temas > h2, #temas > p { grid-column: 1 / -1; }
img { max-width: 100%; height: auto; }
figure { margin: 16px 0; }
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #cfd7e8; padding: 10px; text-align: left; }
a:focus-visible, button:focus-visible, input:focus-visible { outline: 3px solid #b74619; outline-offset: 3px; }
@media (max-width: 700px) { #temas { grid-template-columns: 1fr; } }
.lesson-card { background: #e5edff; }
output { padding: 20px; font-size: 24px; }
li { margin: 10px 0; }
console.log("app.js está funcionando");
const boton = document.querySelector("#sumar");
const salida = document.querySelector("#contador");
const mensaje = document.querySelector("#mensaje");
mensaje.textContent = "La página está lista para practicar.";
mensaje.textContent = "La página está lista para practicar.";
textContent
<!doctype html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Mi primera página</title>
<meta name="description" content="Mi primera página de estudio: estructura, textos, enlaces y ejemplos de HTML.">
<link rel="stylesheet" href="assets/style.css">
<script src="js/app.js" defer></script>
</head>
<body>
<header>
<h1>Mi diario de aprendizaje</h1>
<p id="mensaje">Todavía no has realizado una acción.</p>
</header>
<nav aria-label="Principal">
<a href="#temas">Temas</a>
<a href="#contacto">Contacto</a>
</nav>
<main>
<section id="temas">
<h2>Lo que quiero aprender</h2>
<p>Primero estructura, después estilo y finalmente interacción.</p>
<ol>
<li>HTML: contenido</li>
<li>CSS: presentación</li>
<li>JavaScript: interacción</li>
</ol>
<figure>
<img src="assets/tutorial-grid.svg" alt="Diagrama con tres áreas iguales" width="360" height="120">
<figcaption>Tres áreas que se pueden distribuir.</figcaption>
</figure>
<article class="lesson-card">
<h3>Mi primera ficha</h3>
<p>Una idea que puedo consultar de forma independiente.</p>
</article>
<table>
<caption>Qué aporta cada lenguaje</caption>
<thead><tr><th scope="col">Lenguaje</th><th scope="col">Función</th></tr></thead>
<tbody><tr><td>HTML</td><td>Estructura</td></tr><tr><td>CSS</td><td>Presentación</td></tr></tbody>
</table>
</section>
<section id="practica">
<h2>Mi práctica interactiva</h2>
<h3>Contador</h3>
<button id="sumar" type="button">Sumar</button>
<button id="reiniciar" type="button">Reiniciar</button>
<output id="contador" aria-live="polite">0</output>
<h3>Mi lista</h3>
<form id="tarea-form">
<label for="tarea">Una idea para practicar</label>
<input id="tarea" required>
<button type="submit">Añadir</button>
</form>
<ul id="tareas"></ul>
<details><summary>Ver una pista</summary><p>El evento cambia un dato; después actualiza la vista.</p></details>
</section>
</main>
<footer id="contacto">
<p>Un proyecto para practicar cada día.</p>
</footer>
</body>
</html>
body {
margin: 0;
padding: 24px;
font-family: system-ui, sans-serif;
line-height: 1.6;
color: #18213a;
}
* { box-sizing: border-box; }
h1 { font-size: clamp(28px, 5vw, 46px); line-height: 1.15; }
h2 { font-size: 26px; }
h3 { font-size: 20px; }
header, nav, main, footer { max-width: 1000px; margin: 0 auto 24px; }
section { margin-bottom: 32px; }
.lesson-card { padding: 24px; margin: 16px 0; border: 1px solid #cfd7e8; border-radius: 16px; background: white; }
header { background: #eef1ff; padding: 24px; border-radius: 16px; }
a { color: #233de0; }
input, button { font: inherit; padding: 10px; margin: 8px 0; }
button { background: #233de0; color: white; border: 0; border-radius: 8px; }
nav { display: flex; flex-wrap: wrap; gap: 16px; }
#temas { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; align-items: start; }
#temas > h2, #temas > p { grid-column: 1 / -1; }
img { max-width: 100%; height: auto; }
figure { margin: 16px 0; }
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #cfd7e8; padding: 10px; text-align: left; }
a:focus-visible, button:focus-visible, input:focus-visible { outline: 3px solid #b74619; outline-offset: 3px; }
@media (max-width: 700px) { #temas { grid-template-columns: 1fr; } }
.lesson-card { background: #e5edff; }
output { padding: 20px; font-size: 24px; }
li { margin: 10px 0; }
console.log("app.js está funcionando");
const boton = document.querySelector("#sumar");
const salida = document.querySelector("#contador");
const mensaje = document.querySelector("#mensaje");
mensaje.textContent = "La página está lista para practicar.";
let puntos = 0;
function mostrarPuntos() {
salida.value = puntos;
}
mostrarPuntos();
let puntos = 0;
function mostrarPuntos() {
salida.value = puntos;
}
mostrarPuntos();
let function
<!doctype html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Mi primera página</title>
<meta name="description" content="Mi primera página de estudio: estructura, textos, enlaces y ejemplos de HTML.">
<link rel="stylesheet" href="assets/style.css">
<script src="js/app.js" defer></script>
</head>
<body>
<header>
<h1>Mi diario de aprendizaje</h1>
<p id="mensaje">Todavía no has realizado una acción.</p>
</header>
<nav aria-label="Principal">
<a href="#temas">Temas</a>
<a href="#contacto">Contacto</a>
</nav>
<main>
<section id="temas">
<h2>Lo que quiero aprender</h2>
<p>Primero estructura, después estilo y finalmente interacción.</p>
<ol>
<li>HTML: contenido</li>
<li>CSS: presentación</li>
<li>JavaScript: interacción</li>
</ol>
<figure>
<img src="assets/tutorial-grid.svg" alt="Diagrama con tres áreas iguales" width="360" height="120">
<figcaption>Tres áreas que se pueden distribuir.</figcaption>
</figure>
<article class="lesson-card">
<h3>Mi primera ficha</h3>
<p>Una idea que puedo consultar de forma independiente.</p>
</article>
<table>
<caption>Qué aporta cada lenguaje</caption>
<thead><tr><th scope="col">Lenguaje</th><th scope="col">Función</th></tr></thead>
<tbody><tr><td>HTML</td><td>Estructura</td></tr><tr><td>CSS</td><td>Presentación</td></tr></tbody>
</table>
</section>
<section id="practica">
<h2>Mi práctica interactiva</h2>
<h3>Contador</h3>
<button id="sumar" type="button">Sumar</button>
<button id="reiniciar" type="button">Reiniciar</button>
<output id="contador" aria-live="polite">0</output>
<h3>Mi lista</h3>
<form id="tarea-form">
<label for="tarea">Una idea para practicar</label>
<input id="tarea" required>
<button type="submit">Añadir</button>
</form>
<ul id="tareas"></ul>
<details><summary>Ver una pista</summary><p>El evento cambia un dato; después actualiza la vista.</p></details>
</section>
</main>
<footer id="contacto">
<p>Un proyecto para practicar cada día.</p>
</footer>
</body>
</html>
body {
margin: 0;
padding: 24px;
font-family: system-ui, sans-serif;
line-height: 1.6;
color: #18213a;
}
* { box-sizing: border-box; }
h1 { font-size: clamp(28px, 5vw, 46px); line-height: 1.15; }
h2 { font-size: 26px; }
h3 { font-size: 20px; }
header, nav, main, footer { max-width: 1000px; margin: 0 auto 24px; }
section { margin-bottom: 32px; }
.lesson-card { padding: 24px; margin: 16px 0; border: 1px solid #cfd7e8; border-radius: 16px; background: white; }
header { background: #eef1ff; padding: 24px; border-radius: 16px; }
a { color: #233de0; }
input, button { font: inherit; padding: 10px; margin: 8px 0; }
button { background: #233de0; color: white; border: 0; border-radius: 8px; }
nav { display: flex; flex-wrap: wrap; gap: 16px; }
#temas { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; align-items: start; }
#temas > h2, #temas > p { grid-column: 1 / -1; }
img { max-width: 100%; height: auto; }
figure { margin: 16px 0; }
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #cfd7e8; padding: 10px; text-align: left; }
a:focus-visible, button:focus-visible, input:focus-visible { outline: 3px solid #b74619; outline-offset: 3px; }
@media (max-width: 700px) { #temas { grid-template-columns: 1fr; } }
.lesson-card { background: #e5edff; }
output { padding: 20px; font-size: 24px; }
li { margin: 10px 0; }
console.log("app.js está funcionando");
const boton = document.querySelector("#sumar");
const salida = document.querySelector("#contador");
const mensaje = document.querySelector("#mensaje");
mensaje.textContent = "La página está lista para practicar.";
let puntos = 0;
function mostrarPuntos() {
salida.value = puntos;
}
mostrarPuntos();
boton.addEventListener("click", () => {
puntos += 1;
mostrarPuntos();
console.log("Puntos:", puntos);
});
boton.addEventListener("click", () => {
puntos += 1;
mostrarPuntos();
console.log("Puntos:", puntos);
});
addEventListener Callback
<!doctype html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Mi primera página</title>
<meta name="description" content="Mi primera página de estudio: estructura, textos, enlaces y ejemplos de HTML.">
<link rel="stylesheet" href="assets/style.css">
<script src="js/app.js" defer></script>
</head>
<body>
<header>
<h1>Mi diario de aprendizaje</h1>
<p id="mensaje">Todavía no has realizado una acción.</p>
</header>
<nav aria-label="Principal">
<a href="#temas">Temas</a>
<a href="#contacto">Contacto</a>
</nav>
<main>
<section id="temas">
<h2>Lo que quiero aprender</h2>
<p>Primero estructura, después estilo y finalmente interacción.</p>
<ol>
<li>HTML: contenido</li>
<li>CSS: presentación</li>
<li>JavaScript: interacción</li>
</ol>
<figure>
<img src="assets/tutorial-grid.svg" alt="Diagrama con tres áreas iguales" width="360" height="120">
<figcaption>Tres áreas que se pueden distribuir.</figcaption>
</figure>
<article class="lesson-card">
<h3>Mi primera ficha</h3>
<p>Una idea que puedo consultar de forma independiente.</p>
</article>
<table>
<caption>Qué aporta cada lenguaje</caption>
<thead><tr><th scope="col">Lenguaje</th><th scope="col">Función</th></tr></thead>
<tbody><tr><td>HTML</td><td>Estructura</td></tr><tr><td>CSS</td><td>Presentación</td></tr></tbody>
</table>
</section>
<section id="practica">
<h2>Mi práctica interactiva</h2>
<h3>Contador</h3>
<button id="sumar" type="button">Sumar</button>
<button id="reiniciar" type="button">Reiniciar</button>
<output id="contador" aria-live="polite">0</output>
<h3>Mi lista</h3>
<form id="tarea-form">
<label for="tarea">Una idea para practicar</label>
<input id="tarea" required>
<button type="submit">Añadir</button>
</form>
<ul id="tareas"></ul>
<details><summary>Ver una pista</summary><p>El evento cambia un dato; después actualiza la vista.</p></details>
</section>
</main>
<footer id="contacto">
<p>Un proyecto para practicar cada día.</p>
</footer>
</body>
</html>
body {
margin: 0;
padding: 24px;
font-family: system-ui, sans-serif;
line-height: 1.6;
color: #18213a;
}
* { box-sizing: border-box; }
h1 { font-size: clamp(28px, 5vw, 46px); line-height: 1.15; }
h2 { font-size: 26px; }
h3 { font-size: 20px; }
header, nav, main, footer { max-width: 1000px; margin: 0 auto 24px; }
section { margin-bottom: 32px; }
.lesson-card { padding: 24px; margin: 16px 0; border: 1px solid #cfd7e8; border-radius: 16px; background: white; }
header { background: #eef1ff; padding: 24px; border-radius: 16px; }
a { color: #233de0; }
input, button { font: inherit; padding: 10px; margin: 8px 0; }
button { background: #233de0; color: white; border: 0; border-radius: 8px; }
nav { display: flex; flex-wrap: wrap; gap: 16px; }
#temas { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; align-items: start; }
#temas > h2, #temas > p { grid-column: 1 / -1; }
img { max-width: 100%; height: auto; }
figure { margin: 16px 0; }
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #cfd7e8; padding: 10px; text-align: left; }
a:focus-visible, button:focus-visible, input:focus-visible { outline: 3px solid #b74619; outline-offset: 3px; }
@media (max-width: 700px) { #temas { grid-template-columns: 1fr; } }
.lesson-card { background: #e5edff; }
output { padding: 20px; font-size: 24px; }
li { margin: 10px 0; }
console.log("app.js está funcionando");
const boton = document.querySelector("#sumar");
const salida = document.querySelector("#contador");
const mensaje = document.querySelector("#mensaje");
mensaje.textContent = "La página está lista para practicar.";
let puntos = 0;
function mostrarPuntos() {
salida.value = puntos;
}
mostrarPuntos();
boton.addEventListener("click", () => {
puntos += 1;
mostrarPuntos();
console.log("Puntos:", puntos);
});
document.querySelector("#reiniciar").addEventListener("click", () => {
puntos = 0;
mostrarPuntos();
});
document.querySelector("#reiniciar").addEventListener("click", () => {
puntos = 0;
mostrarPuntos();
});
Eventos
<!doctype html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Mi primera página</title>
<meta name="description" content="Mi primera página de estudio: estructura, textos, enlaces y ejemplos de HTML.">
<link rel="stylesheet" href="assets/style.css">
<script src="js/app.js" defer></script>
</head>
<body>
<header>
<h1>Mi diario de aprendizaje</h1>
<p id="mensaje">Todavía no has realizado una acción.</p>
</header>
<nav aria-label="Principal">
<a href="#temas">Temas</a>
<a href="#contacto">Contacto</a>
</nav>
<main>
<section id="temas">
<h2>Lo que quiero aprender</h2>
<p>Primero estructura, después estilo y finalmente interacción.</p>
<ol>
<li>HTML: contenido</li>
<li>CSS: presentación</li>
<li>JavaScript: interacción</li>
</ol>
<figure>
<img src="assets/tutorial-grid.svg" alt="Diagrama con tres áreas iguales" width="360" height="120">
<figcaption>Tres áreas que se pueden distribuir.</figcaption>
</figure>
<article class="lesson-card">
<h3>Mi primera ficha</h3>
<p>Una idea que puedo consultar de forma independiente.</p>
</article>
<table>
<caption>Qué aporta cada lenguaje</caption>
<thead><tr><th scope="col">Lenguaje</th><th scope="col">Función</th></tr></thead>
<tbody><tr><td>HTML</td><td>Estructura</td></tr><tr><td>CSS</td><td>Presentación</td></tr></tbody>
</table>
</section>
<section id="practica">
<h2>Mi práctica interactiva</h2>
<h3>Contador</h3>
<button id="sumar" type="button">Sumar</button>
<button id="reiniciar" type="button">Reiniciar</button>
<output id="contador" aria-live="polite">0</output>
<h3>Mi lista</h3>
<form id="tarea-form">
<label for="tarea">Una idea para practicar</label>
<input id="tarea" required>
<button type="submit">Añadir</button>
</form>
<ul id="tareas"></ul>
<details><summary>Ver una pista</summary><p>El evento cambia un dato; después actualiza la vista.</p></details>
</section>
</main>
<footer id="contacto">
<p>Un proyecto para practicar cada día.</p>
</footer>
</body>
</html>
body {
margin: 0;
padding: 24px;
font-family: system-ui, sans-serif;
line-height: 1.6;
color: #18213a;
}
* { box-sizing: border-box; }
h1 { font-size: clamp(28px, 5vw, 46px); line-height: 1.15; }
h2 { font-size: 26px; }
h3 { font-size: 20px; }
header, nav, main, footer { max-width: 1000px; margin: 0 auto 24px; }
section { margin-bottom: 32px; }
.lesson-card { padding: 24px; margin: 16px 0; border: 1px solid #cfd7e8; border-radius: 16px; background: white; }
header { background: #eef1ff; padding: 24px; border-radius: 16px; }
a { color: #233de0; }
input, button { font: inherit; padding: 10px; margin: 8px 0; }
button { background: #233de0; color: white; border: 0; border-radius: 8px; }
nav { display: flex; flex-wrap: wrap; gap: 16px; }
#temas { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; align-items: start; }
#temas > h2, #temas > p { grid-column: 1 / -1; }
img { max-width: 100%; height: auto; }
figure { margin: 16px 0; }
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #cfd7e8; padding: 10px; text-align: left; }
a:focus-visible, button:focus-visible, input:focus-visible { outline: 3px solid #b74619; outline-offset: 3px; }
@media (max-width: 700px) { #temas { grid-template-columns: 1fr; } }
.lesson-card { background: #e5edff; }
output { padding: 20px; font-size: 24px; }
li { margin: 10px 0; }
console.log("app.js está funcionando");
const boton = document.querySelector("#sumar");
const salida = document.querySelector("#contador");
const mensaje = document.querySelector("#mensaje");
mensaje.textContent = "La página está lista para practicar.";
let puntos = 0;
function mostrarPuntos() {
salida.value = puntos;
}
mostrarPuntos();
boton.addEventListener("click", () => {
puntos += 1;
mostrarPuntos();
console.log("Puntos:", puntos);
});
document.querySelector("#reiniciar").addEventListener("click", () => {
puntos = 0;
mostrarPuntos();
});
const ideas = [];
const lista = document.querySelector("#tareas");
function mostrarIdeas() {
lista.replaceChildren();
ideas.forEach(idea => {
const elemento = document.createElement("li");
elemento.textContent = idea;
lista.append(elemento);
});
}
mostrarIdeas();
const ideas = [];
const lista = document.querySelector("#tareas");
function mostrarIdeas() {
lista.replaceChildren();
ideas.forEach(idea => {
const elemento = document.createElement("li");
elemento.textContent = idea;
lista.append(elemento);
});
}
mostrarIdeas();
Array createElement
<!doctype html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Mi primera página</title>
<meta name="description" content="Mi primera página de estudio: estructura, textos, enlaces y ejemplos de HTML.">
<link rel="stylesheet" href="assets/style.css">
<script src="js/app.js" defer></script>
</head>
<body>
<header>
<h1>Mi diario de aprendizaje</h1>
<p id="mensaje">Todavía no has realizado una acción.</p>
</header>
<nav aria-label="Principal">
<a href="#temas">Temas</a>
<a href="#contacto">Contacto</a>
</nav>
<main>
<section id="temas">
<h2>Lo que quiero aprender</h2>
<p>Primero estructura, después estilo y finalmente interacción.</p>
<ol>
<li>HTML: contenido</li>
<li>CSS: presentación</li>
<li>JavaScript: interacción</li>
</ol>
<figure>
<img src="assets/tutorial-grid.svg" alt="Diagrama con tres áreas iguales" width="360" height="120">
<figcaption>Tres áreas que se pueden distribuir.</figcaption>
</figure>
<article class="lesson-card">
<h3>Mi primera ficha</h3>
<p>Una idea que puedo consultar de forma independiente.</p>
</article>
<table>
<caption>Qué aporta cada lenguaje</caption>
<thead><tr><th scope="col">Lenguaje</th><th scope="col">Función</th></tr></thead>
<tbody><tr><td>HTML</td><td>Estructura</td></tr><tr><td>CSS</td><td>Presentación</td></tr></tbody>
</table>
</section>
<section id="practica">
<h2>Mi práctica interactiva</h2>
<h3>Contador</h3>
<button id="sumar" type="button">Sumar</button>
<button id="reiniciar" type="button">Reiniciar</button>
<output id="contador" aria-live="polite">0</output>
<h3>Mi lista</h3>
<form id="tarea-form">
<label for="tarea">Una idea para practicar</label>
<input id="tarea" required>
<button type="submit">Añadir</button>
</form>
<ul id="tareas"></ul>
<details><summary>Ver una pista</summary><p>El evento cambia un dato; después actualiza la vista.</p></details>
</section>
</main>
<footer id="contacto">
<p>Un proyecto para practicar cada día.</p>
</footer>
</body>
</html>
body {
margin: 0;
padding: 24px;
font-family: system-ui, sans-serif;
line-height: 1.6;
color: #18213a;
}
* { box-sizing: border-box; }
h1 { font-size: clamp(28px, 5vw, 46px); line-height: 1.15; }
h2 { font-size: 26px; }
h3 { font-size: 20px; }
header, nav, main, footer { max-width: 1000px; margin: 0 auto 24px; }
section { margin-bottom: 32px; }
.lesson-card { padding: 24px; margin: 16px 0; border: 1px solid #cfd7e8; border-radius: 16px; background: white; }
header { background: #eef1ff; padding: 24px; border-radius: 16px; }
a { color: #233de0; }
input, button { font: inherit; padding: 10px; margin: 8px 0; }
button { background: #233de0; color: white; border: 0; border-radius: 8px; }
nav { display: flex; flex-wrap: wrap; gap: 16px; }
#temas { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; align-items: start; }
#temas > h2, #temas > p { grid-column: 1 / -1; }
img { max-width: 100%; height: auto; }
figure { margin: 16px 0; }
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #cfd7e8; padding: 10px; text-align: left; }
a:focus-visible, button:focus-visible, input:focus-visible { outline: 3px solid #b74619; outline-offset: 3px; }
@media (max-width: 700px) { #temas { grid-template-columns: 1fr; } }
.lesson-card { background: #e5edff; }
output { padding: 20px; font-size: 24px; }
li { margin: 10px 0; }
console.log("app.js está funcionando");
const boton = document.querySelector("#sumar");
const salida = document.querySelector("#contador");
const mensaje = document.querySelector("#mensaje");
mensaje.textContent = "La página está lista para practicar.";
let puntos = 0;
function mostrarPuntos() {
salida.value = puntos;
}
mostrarPuntos();
boton.addEventListener("click", () => {
puntos += 1;
mostrarPuntos();
console.log("Puntos:", puntos);
});
document.querySelector("#reiniciar").addEventListener("click", () => {
puntos = 0;
mostrarPuntos();
});
const ideas = [];
const lista = document.querySelector("#tareas");
function mostrarIdeas() {
lista.replaceChildren();
ideas.forEach(idea => {
const elemento = document.createElement("li");
elemento.textContent = idea;
lista.append(elemento);
});
}
mostrarIdeas();
document.querySelector("#tarea-form").addEventListener("submit", event => {
event.preventDefault();
const campo = document.querySelector("#tarea");
const idea = campo.value.trim();
if (!idea) return;
ideas.push(idea);
mostrarIdeas();
campo.value = "";
});
document.querySelector("#tarea-form").addEventListener("submit", event => {
event.preventDefault();
const campo = document.querySelector("#tarea");
const idea = campo.value.trim();
if (!idea) return;
ideas.push(idea);
mostrarIdeas();
campo.value = "";
});
preventDefault if
<!doctype html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Mi primera página</title>
<meta name="description" content="Mi primera página de estudio: estructura, textos, enlaces y ejemplos de HTML.">
<link rel="stylesheet" href="assets/style.css">
<script src="js/app.js" defer></script>
</head>
<body>
<header>
<h1>Mi diario de aprendizaje</h1>
<p id="mensaje">Todavía no has realizado una acción.</p>
</header>
<nav aria-label="Principal">
<a href="#temas">Temas</a>
<a href="#contacto">Contacto</a>
</nav>
<main>
<section id="temas">
<h2>Lo que quiero aprender</h2>
<p>Primero estructura, después estilo y finalmente interacción.</p>
<ol>
<li>HTML: contenido</li>
<li>CSS: presentación</li>
<li>JavaScript: interacción</li>
</ol>
<figure>
<img src="assets/tutorial-grid.svg" alt="Diagrama con tres áreas iguales" width="360" height="120">
<figcaption>Tres áreas que se pueden distribuir.</figcaption>
</figure>
<article class="lesson-card">
<h3>Mi primera ficha</h3>
<p>Una idea que puedo consultar de forma independiente.</p>
</article>
<table>
<caption>Qué aporta cada lenguaje</caption>
<thead><tr><th scope="col">Lenguaje</th><th scope="col">Función</th></tr></thead>
<tbody><tr><td>HTML</td><td>Estructura</td></tr><tr><td>CSS</td><td>Presentación</td></tr></tbody>
</table>
</section>
<section id="practica">
<h2>Mi práctica interactiva</h2>
<h3>Contador</h3>
<button id="sumar" type="button">Sumar</button>
<button id="reiniciar" type="button">Reiniciar</button>
<output id="contador" aria-live="polite">0</output>
<h3>Mi lista</h3>
<form id="tarea-form">
<label for="tarea">Una idea para practicar</label>
<input id="tarea" required>
<button type="submit">Añadir</button>
</form>
<ul id="tareas"></ul>
<details><summary>Ver una pista</summary><p>El evento cambia un dato; después actualiza la vista.</p></details>
</section>
</main>
<footer id="contacto">
<p>Un proyecto para practicar cada día.</p>
</footer>
</body>
</html>
body {
margin: 0;
padding: 24px;
font-family: system-ui, sans-serif;
line-height: 1.6;
color: #18213a;
}
* { box-sizing: border-box; }
h1 { font-size: clamp(28px, 5vw, 46px); line-height: 1.15; }
h2 { font-size: 26px; }
h3 { font-size: 20px; }
header, nav, main, footer { max-width: 1000px; margin: 0 auto 24px; }
section { margin-bottom: 32px; }
.lesson-card { padding: 24px; margin: 16px 0; border: 1px solid #cfd7e8; border-radius: 16px; background: white; }
header { background: #eef1ff; padding: 24px; border-radius: 16px; }
a { color: #233de0; }
input, button { font: inherit; padding: 10px; margin: 8px 0; }
button { background: #233de0; color: white; border: 0; border-radius: 8px; }
nav { display: flex; flex-wrap: wrap; gap: 16px; }
#temas { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; align-items: start; }
#temas > h2, #temas > p { grid-column: 1 / -1; }
img { max-width: 100%; height: auto; }
figure { margin: 16px 0; }
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #cfd7e8; padding: 10px; text-align: left; }
a:focus-visible, button:focus-visible, input:focus-visible { outline: 3px solid #b74619; outline-offset: 3px; }
@media (max-width: 700px) { #temas { grid-template-columns: 1fr; } }
.lesson-card { background: #e5edff; }
output { padding: 20px; font-size: 24px; }
li { margin: 10px 0; }
console.log("app.js está funcionando");
const boton = document.querySelector("#sumar");
const salida = document.querySelector("#contador");
const mensaje = document.querySelector("#mensaje");
mensaje.textContent = "La página está lista para practicar.";
let puntos = 0;
function mostrarPuntos() {
salida.value = puntos;
}
mostrarPuntos();
boton.addEventListener("click", () => {
puntos += 1;
mostrarPuntos();
console.log("Puntos:", puntos);
});
document.querySelector("#reiniciar").addEventListener("click", () => {
puntos = 0;
mostrarPuntos();
});
const ideas = [];
const lista = document.querySelector("#tareas");
function mostrarIdeas() {
lista.replaceChildren();
ideas.forEach(idea => {
const elemento = document.createElement("li");
elemento.textContent = idea;
lista.append(elemento);
});
}
mostrarIdeas();
document.querySelector("#tarea-form").addEventListener("submit", event => {
event.preventDefault();
const campo = document.querySelector("#tarea");
const idea = campo.value.trim();
if (!idea) return;
ideas.push(idea);
mostrarIdeas();
campo.value = "";
});
try {
localStorage.setItem("mis-ideas", JSON.stringify(ideas));
console.log("Colección guardada. Para actualizarla, guarda también tras cada cambio.");
} catch (error) {
console.log("Este entorno no permite guardar; la práctica continúa sin persistencia.");
}
try {
localStorage.setItem("mis-ideas", JSON.stringify(ideas));
console.log("Colección guardada. Para actualizarla, guarda también tras cada cambio.");
} catch (error) {
console.log("Este entorno no permite guardar; la práctica continúa sin persistencia.");
}
localStorage try/catch JSON