APRENDER ES PONER A PRUEBA

Practica una idea cada vez.

Seis retos pequeños, seis ejercicios para detectar errores y un registro de estudio guardado en este navegador.

Construye, prueba y compara.

Cada reto tiene un objetivo, una pista y una solución de referencia. No hay una única forma correcta de resolverlo.

RETO 1

Tarjeta semántica

Construye una ficha con título, descripción y enlace. Distingue acción y navegación.

Ver pista

Un article funciona si la ficha tiene sentido por sí sola.

Ver solución de referencia

HTML

<article><h2>Mi curso</h2><p>Aprende una idea cada día.</p><a href="#">Leer más</a></article>

CSS

article { padding: 24px; border: 1px solid #ddd; border-radius: 16px; }

RETO 2

Formulario etiquetado

Añade una etiqueta, una instrucción y un campo requerido. Explica el resultado del envío local.

Ver pista

Asocia label y control por id y for.

Ver solución de referencia

HTML

<form id="form"><label for="nombre">Nombre</label><input id="nombre" required><button>Comprobar</button><p id="respuesta" role="status"></p></form>

CSS

input, button { padding: 12px; margin: 8px; }

JavaScript

document.querySelector("#form").addEventListener("submit", e => { e.preventDefault(); document.querySelector("#respuesta").textContent = "Formulario válido. No se envían datos."; });

RETO 3

Galería adaptable

Muestra tres tarjetas y apílalas cuando el espacio sea pequeño.

Ver pista

Prueba repeat, minmax y auto-fit.

Ver solución de referencia

HTML

<section class="grid"><article>Uno</article><article>Dos</article><article>Tres</article></section>

CSS

.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 180px), 1fr)); gap: 16px; } article { padding: 24px; background: #eef1ff; }

RETO 4

Menú desplegable

Haz que un botón muestre una lista y actualice aria-expanded.

Ver pista

Cambia el estado y la presentación juntos.

Ver solución de referencia

HTML

<button id="menu" aria-controls="enlaces" aria-expanded="false">Menú</button><nav id="enlaces" hidden><a href="#">Inicio</a><a href="#">Ayuda</a></nav>

CSS

button, a { padding: 12px; } a { display: block; } [hidden] { display: none; }

JavaScript

const boton = document.querySelector("#menu"); const nav = document.querySelector("#enlaces"); boton.addEventListener("click", () => { const abierto = boton.getAttribute("aria-expanded") !== "true"; boton.setAttribute("aria-expanded", abierto); nav.hidden = !abierto; });

RETO 5

Contador con estado

Suma, resta y reinicia un número. Mantén el estado en una variable.

Ver pista

Primero cambia el valor; después actualiza output.

Ver solución de referencia

HTML

<button id="menos">Restar</button><output id="valor">0</output><button id="mas">Sumar</button><button id="reset">Reiniciar</button>

CSS

button { padding: 12px; } output { padding: 20px; font-size: 32px; }

JavaScript

let n = 0; const salida = document.querySelector("#valor"); function mostrar() { salida.value = n; } document.querySelector("#mas").onclick = () => { n++; mostrar(); }; document.querySelector("#menos").onclick = () => { n--; mostrar(); }; document.querySelector("#reset").onclick = () => { n = 0; mostrar(); };

RETO 6

Lista con buscador

Filtra una lista al escribir, sin distinguir mayúsculas. Añade un estado sin resultados.

Ver pista

Lee el texto del control y compara cada elemento.

Ver solución de referencia

HTML

<label>Buscar <input id="buscar"></label><ul><li>HTML</li><li>CSS</li><li>JavaScript</li></ul><p id="estado" role="status"></p>

CSS

input { padding: 12px; } li { padding: 8px; }

JavaScript

document.querySelector("#buscar").addEventListener("input", e => { let total = 0; document.querySelectorAll("li").forEach(li => { li.hidden = !li.textContent.toLowerCase().includes(e.target.value.toLowerCase()); if (!li.hidden) total++; }); document.querySelector("#estado").textContent = total ? `${total} resultados` : "Sin resultados"; });

Encuentra el error antes de copiarlo.

Lee el fragmento y elige una mejora. La explicación distingue el problema de los cambios puramente visuales.

Un div que parece un botón

<div onclick="abrir()">Abrir ayuda</div>
¿Qué cambiarías?

Un campo sin nombre accesible

<input placeholder="Correo">
¿Qué cambiarías?

Una galería que desborda

.grid { width: 1000px; }
¿Qué cambiarías?

Una variable const reasignada

const puntos = 0;
puntos += 1;
¿Qué cambiarías?

Orden numérico inesperado

[10, 2, 30].sort();
¿Qué cambiarías?

Una petición que ignora HTTP 404

const r = await fetch("datos.json");
const datos = await r.json();
¿Qué cambiarías?

Prueba tu solución.

Elige un reto o una etapa; edita el código y pulsa Ejecutar. El ejemplo está aislado y no envía datos.

Editor

Resultado

Consola


          

Tu avance, en este navegador.

Marca los temas que estudiaste. Este registro es una autoevaluación; no comprueba dominio ni se sincroniza con otros dispositivos.