Desarrollo Web Frontend
Parte 1
Clase 4 — HTML, CSS y JavaScript para construir interfaces modernas
Objetivos de aprendizaje
Al terminar esta clase, serás capaz de construir una página web funcional desde cero.
HTML semántico
Estructurar contenido con etiquetas que describen su significado.
CSS moderno
Aplicar estilos y layouts con Flexbox y Grid.
JavaScript básico
Añadir interactividad con variables, funciones y DOM.
DevTools
Depurar tu código directamente en el navegador.
HTML: la estructura de la web
HTML es el esqueleto de toda página web. Define la estructura y el significado del contenido.
Piensa en una página como un cuerpo humano:
HTML
El esqueleto. Aporta la estructura y sostiene todo lo demás.
CSS
La piel y la ropa. Da apariencia, color, forma y estilo.
JavaScript
Los músculos y los nervios. Aporta movimiento y reacción.
Estructura básica de una página HTML5
<!DOCTYPE html><html lang="es"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Mi Primera Página</title> <link rel="stylesheet" href="styles.css"></head><body> <header><nav>...</nav></header> <main><h1>Bienvenido</h1></main> <footer>© 2026</footer> <script src="script.js"></script></body></html>head lleva metadatos (título, viewport, hojas de estilo); body lleva el contenido visible.
HTML semántico
Usar etiquetas con significadomejora la accesibilidad y el SEO, y hace el código más legible.
| Etiqueta | Usar para |
|---|---|
<header> | Logo y navegación principal |
<nav> | Menús y enlaces de navegación |
<main> | El contenido único de la página |
<section> | Agrupar contenido relacionado |
<article> | Posts de blog, noticias, contenido autónomo |
<aside> | Barras laterales, notas al margen |
<footer> | Pie de página, contacto, copyright |
Elementos esenciales
# Texto y enlaces<h1>Título principal</h1><p>Párrafo de texto.</p><a href="https://ejemplo.com">Visitar</a><img src="foto.jpg" alt="Descripción"># Listas<ul><li>No ordenada</li></ul><ol><li>Ordenada</li></ol># Formulario<form action="/enviar" method="POST"> <label for="nombre">Nombre:</label> <input type="text" id="nombre" name="nombre" required> <label for="email">Email:</label> <input type="email" id="email" name="email" required> <button type="submit">Enviar</button></form>El atributo for de label debe coincidir con el id del input.
Accesibilidad: no es opcional
Siempre incluye el atributo alt en imágenes
El texto alternativo describe la imagen para personas que usan lectores de pantalla y también para cuando la imagen no carga. Además, es esencial para SEO.
<img src="logo.png"> <!-- mal --><img src="logo.png" alt="Logotipo de Fragua Tech">Regla práctica: si la imagen aporta información, describe qué muestra. Si es decorativa, usa alt="" para que los lectores la ignoren.
📚Material complementario▾
CSS: diseño visual moderno
CSS selecciona elementos HTML y les aplica estilo.
/* Por etiqueta */p { color: blue; }/* Por clase — el más usado */.destacado { background: yellow; }/* Por ID — usar con moderación */#titulo { font-size: 2rem; }/* Pseudo-clase */a:hover { color: red; }El modelo de caja
Todo elemento HTML es una caja con cuatro capas.
Contenido
Texto o imágenes
Padding
Espacio interior
Border
Borde visible
Margin
Espacio exterior
/* Incluye padding y border en el ancho */*, *::before, *::after { box-sizing: border-box;}Regla de oro: box-sizing: border-box en todo proyecto. Evita sorpresas al calcular tamaños.
Flexbox — layouts en una dimensión
nav { display: flex; justify-content: space-between; align-items: center; padding: 1rem 2rem; background-color: #333;}nav a { color: white; text-decoration: none;}| Propiedad | Valores comunes |
|---|---|
justify-content | center, space-between, flex-start |
align-items | center, stretch |
flex-direction | row, column |
gap | 16px, 1rem |
CSS Grid — layouts en dos dimensiones
Ideal para galerías, dashboards y cualquier rejilla responsive.
.galeria { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 24px;}💡 repeat(auto-fill, minmax(300px, 1fr))
Crea tantas columnas como quepan, cada una de mínimo 300px y que crezcan para llenar el espacio. Responsive sin media queries.
Diseño responsivo — mobile first
Empieza estilando para móvil y añade mejoras para pantallas mayores.
/* Base: móvil */.contenedor { padding: 1rem; }/* Tablet */@media (min-width: 768px) { .contenedor { padding: 2rem; max-width: 720px; margin: 0 auto; }}/* Desktop */@media (min-width: 1024px) { .contenedor { max-width: 960px; }}📚Material complementario▾
- DocsMDN — Introducción a CSS
- DocsMDN — Modelo de caja
- InteractivoFlexbox Froggy (juego)
- InteractivoGrid Garden (juego)
- ArtículoCSS Tricks — A Complete Guide to Flexbox
- VideoAprende CSS Grid en 20 minutos (Midudev)
JavaScript básico
Añade interactividad a tu página: responder a clics, validar formularios, actualizar el DOM sin recargar.
Variables
const nombre = "Ana"; // No cambia — usar por defectolet edad = 25; // Puede cambiar// Nunca uses varRegla: empieza con const; cámbialo alet solo si el valor tiene que cambiar.
Tipos de datos
const texto = "Hola";const numero = 42;const verdadero = true;const lista = [1, 2, 3];const objeto = { nombre: "Ana", edad: 25 };string
texto
number
números
boolean
true / false
array
listas
object
pares clave-valor
Funciones (arrow functions)
const saludar = (nombre) => `Hola, ${nombre}!`;// Llamadaconsole.log(saludar("Ana"));// "Hola, Ana!"Las template strings(`${variable}`) permiten interpolar valores sin concatenar.
Manipulación del DOM
El DOM es la representación del HTML en memoria. JavaScript lo lee y lo modifica en tiempo real.
// Seleccionar un elementoconst titulo = document.getElementById("titulo");// Cambiar contenido y clasestitulo.textContent = "Nuevo título";titulo.classList.add("destacado");// Reaccionar a eventosconst boton = document.querySelector("#mi-boton");boton.addEventListener("click", () => { alert("Hiciste click!");});Ejemplo: contador interactivo
Este contador se actualiza con JavaScript puro. Pruébalo aquí mismo.
Haz clic en los botones: detrás usan addEventListener y actualizan el DOM.
let cuenta = 0;const display = document.getElementById("valor");document.getElementById("incrementar") .addEventListener("click", () => { cuenta++; display.textContent = cuenta; });📚Material complementario▾
Las DevTools del navegador
Accede con F12 oCtrl+Shift+I.
| Pestaña | Para qué sirve |
|---|---|
| Elements | Inspeccionar y modificar HTML/CSS en vivo |
| Console | Ejecutar JavaScript, ver console.log y errores |
| Network | Ver peticiones HTTP, tiempos de carga, tamaños |
| Sources | Depurar con breakpoints y paso a paso |
| Application | Cookies, localStorage, sessionStorage |
Trucos del día a día
Ctrl+Shift+M
Modo responsive: simula distintos tamaños de pantalla (móvil, tablet, desktop).
Editar CSS en caliente
En Elements, cambia valores en el panel Stylespara experimentar sin tocar el archivo.
Throttling de red
En Network, simula una conexión 3G lenta para ver cómo se comporta tu página con internet pobre.
Console como calculadora
La consola ejecuta cualquier JavaScript al vuelo. Perfecta para pruebas rápidas y explorar objetos.
📚Material complementario▾
Resumen de la Clase 4
| Concepto | Definición |
|---|---|
| HTML | Lenguaje de marcado que define la estructura |
| CSS | Lenguaje de estilos que define la apariencia |
| JavaScript | Lenguaje que agrega interactividad |
| DOM | Representación del HTML manipulable por JavaScript |
| Flexbox | Sistema CSS para layouts en una dimensión |
| Grid | Sistema CSS para layouts en dos dimensiones |
| Semántico | Etiquetas con significado (header, nav, main, article...) |
| Mobile first | Estrategia: estilar primero para móvil, ampliar con media queries |
| DevTools | Panel del navegador para inspeccionar y depurar |
📚Material complementario▾
- DocsMDN — HTML básico
- DocsMDN — CSS básico
- InteractivoFlexbox Froggy (juego)
- InteractivoGrid Garden (juego)
- DocsJavaScript.info — Tutorial moderno
- ArtículoChrome DevTools — Guía oficial
Ejercicio 4.1: Página semántica
Crea un artículo de blog usando solo etiquetas semánticas para la estructura principal.
<body> <header><h1>Mi Blog</h1></header> <nav>...enlaces...</nav> <main> <article> <h2>Título del post</h2> <p>Contenido...</p> </article> <aside>Posts relacionados</aside> </main> <footer> <form>...suscripción...</form> </footer></body>Valida con un lector de pantalla o el panel Accessibility de DevTools.
Ejercicio 4.2: Navbar con Flexbox
Logo a la izquierda, 4 enlaces al centro, botón de "Contacto" a la derecha, fondo oscuro con texto claro.
<!-- HTML --><nav class="navbar"> <div class="logo">MiSitio</div> <div class="nav-links"> <a href="#">Inicio</a> <a href="#">Servicios</a> <a href="#">Blog</a> <a href="#">Equipo</a> </div> <button class="btn-contacto">Contacto</button></nav>/* CSS */.navbar { display: flex; justify-content: space-between; align-items: center; padding: 1rem 2rem; background-color: #1a1a2e;}.nav-links { display: flex; gap: 2rem;}.nav-links a { color: #eee; }Ejercicio 4.3: Galería con CSS Grid
6 tarjetas que muestren 3 columnas en desktop, 2 en tablet, 1 en móvil. Cada card con imagen, título, descripción y botón. Sombra y efecto hover de elevación.
.galeria { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 24px;}.card { box-shadow: 0 4px 12px rgba(0,0,0,0.1); transition: transform 0.2s;}.card:hover { transform: translateY(-6px); }auto-fill + minmax ya hace responsive sin necesidad de media queries.
Ejercicio 4.4: Contador con historial
Contador con botones +1 / −1 / +5 / −5 y reset. El número cambia de color según el valor y se guarda el historial de las últimas 5 operaciones.
Últimas 5 operaciones
Pulsa cualquier botón para empezar.
Ejercicio 4.5: Formulario con validación
Validación en tiempo real: nombre (mín. 3), email, contraseña (8+, una mayúscula, un número) y confirmación. El botón solo se activa cuando todo es válido.
¡Registro enviado!
Todos los campos pasaron la validación. En una app real, esto llamaría a tu API.
Proyecto: Portafolio personal
Construye una página web de portafolio personal con HTML, CSS y JavaScript puros — sin frameworks.
Secciones obligatorias
- • Header con navegación funcional
- • Hero con tu nombre
- • Sobre mí
- • Habilidades
- • Proyectos: 3 cards en grid
- • Formulario de contacto con validación
- • Footer con redes sociales
Técnicas que usarás
- • HTML semántico (header, main, section, footer)
- • Flexbox y Grid
- • Media queries (mobile first)
- • Event listeners y manipulación del DOM
- • Validación en tiempo real
- • Accesibilidad (alt, labels)
Criterios de evaluación
Checklist
- ☑ HTML semántico correcto
- ☑ Layout con Flexbox y/o Grid
- ☑ Responsive en al menos 3 breakpoints
- ☑ JavaScript funcional
- ☑ Código limpio y organizado
- ☑ Se ve profesional y es usable
Bonus
- ⭐ Modo oscuro con toggle
- ⭐ Animaciones CSS (transiciones, keyframes)
- ⭐ Publicar en GitHub Pages o Netlify
- ⭐ Formulario que envía a una API real
- ⭐ Lighthouse > 90 en accesibilidad
Tu primera página es el principio
HTML, CSS y JavaScript son labase sobre la que se construye toda la web moderna. En la próxima clase veremosframeworks y herramientas que aceleran el trabajo.