HTML5 desde Cero

Guía completa para aprender HTML5 desde fundamentos hasta conceptos avanzados.

¿Qué es HTML5?

📄

Lenguaje de Marcado

HTML5 es la quinta versión del lenguaje de marcado de hipertexto, el estándar para crear páginas y aplicaciones web.

Para Qué Sirve

Estructurar contenido web, crear documentos semánticos, integrar multimedia y desarrollar aplicaciones web interactivas.

🔧

Características Principales

Elementos semánticos, multimedia nativa, APIs avanzadas, formularios mejorados, almacenamiento local y gráficos.

💡 ¿Sabías qué?

HTML5 fue lanzado oficialmente en 2014 por el W3C. Introdujo elementos semánticos como <header>, <nav>, <article> y eliminó etiquetas obsoletas como <font> y <center>.

Estructura de HTML5

HTML5 introduce una estructura semántica clara que mejora la accesibilidad y el SEO de las páginas web.

<!DOCTYPE html>

Declaración del tipo de documento

⬇️

<html>

Elemento raíz del documento

⬇️

<head> + <body>

Metadatos y contenido visible

⬇️

Elementos Semánticos

header, nav, main, article, section, footer

📊 Elementos Semánticos

  • <header> - Encabezado de página
  • <nav> - Navegación principal
  • <main> - Contenido principal
  • <article> - Contenido independiente

💾 Multimedia Nativa

  • <audio> - Reproductor de audio
  • <video> - Reproductor de video
  • <source> - Fuentes multimedia
  • <track> - Subtítulos y captions

🔒 Nuevas APIs

  • LocalStorage / SessionStorage
  • Geolocation API
  • Canvas y SVG
  • Web Workers

📖 Temas del Curso

Haz clic en cualquier tema para ver el contenido detallado

📌 Introducción a HTML5

¿Qué es HTML5? HTML5 es la quinta y actual versión del lenguaje de marcado de hipertexto (HTML), el estándar para crear páginas y aplicaciones web. Fue publicado en octubre de 2014 por el World Wide Web Consortium (W3C).

Historia de HTML:

HTML fue creado por Tim Berners-Lee en 1991 en el CERN. Las versiones principales incluyen HTML 2.0 (1995), HTML 3.2 (1997), HTML 4.01 (1999), XHTML 1.0 (2000), y finalmente HTML5 (2014).

Novedades de HTML5:

  • Elementos semánticos: header, nav, main, article, section, footer
  • Multimedia nativa: audio y video sin necesidad de plugins
  • Gráficos: Canvas y SVG integrados
  • Almacenamiento: LocalStorage y SessionStorage
  • Formularios mejorados: Nuevos tipos de input y validación
💡 Dato curioso: HTML5 eliminó varias etiquetas obsoletas como <font>, <center>, <strike> y <marquee>, promoviendo el uso de CSS para la presentación.
← Volver a temas

📄 Estructura del Documento

Estructura Básica:

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="Descripción de la página">
    <title>Título de la Página</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <header>...</header>
    <main>...</main>
    <footer>...</footer>
</body>
</html>

Meta Tags Esenciales:

Meta Tag Propósito
charset="UTF-8" Codificación de caracteres
viewport Responsive design
description Descripción para SEO
author Autor de la página
robots Indexación en buscadores

DOCTYPE:

<!DOCTYPE html> le dice al navegador que use el modo estándar de renderizado. Sin él, los navegadores pueden usar "quirks mode" que imita comportamientos antiguos.

← Volver a temas

🏷️ Elementos Semánticos

Estructura Semántica:

<body>
    <header>
        <nav>...</nav>
    </header>
    
    <main>
        <article>
            <header>
                <h1>Título del artículo</h1>
                <time datetime="2026-03-17">17 de Marzo, 2026</time>
            </header>
            <section>
                <h2>Sección 1</h2>
                <p>Contenido...</p>
            </section>
        </article>
        
        <aside>
            <h3>Contenido relacionado</h3>
        </aside>
    </main>
    
    <footer>
        <p>© 2026 Mi Sitio</p>
    </footer>
</body>

Elementos Semánticos Principales:

  • <header> - Encabezado de página o sección
  • <nav> - Navegación principal
  • <main> - Contenido principal (único por página)
  • <article> - Contenido independiente
  • <section> - Sección temática
  • <aside> - Contenido relacionado/tangencial
  • <footer> - Pie de página o sección
💡 Tip: La semántica mejora el SEO, la accesibilidad y la mantenibilidad del código. Los lectores de pantalla y motores de búsqueda dependen de ella.
← Volver a temas

📐 Atributos Globales

Atributos Más Usados:

<!-- ID único -->
<div id="unico"></div>

<!-- Clases para CSS/JS -->
<div class="clase1 clase2"></div>

<!-- Estilo inline (no recomendado) -->
<div style="color: red;"></div>

<!-- Título tooltip -->
<button title="Haz clic aquí">Botón</button>

<!-- Contenido editable -->
<div contenteditable="true">Editame</div>

<!-- Ocultar elemento -->
<div hidden>Oculto</div>

<!-- Datos personalizados -->
<div data-usuario="123" data-rol="admin"></div>

Atributos de Accesibilidad:

Atributo Descripción
aria-label Etiqueta para lectores de pantalla
aria-hidden Ocultar de lectores de pantalla
role Define el rol del elemento
tabindex Orden de tabulación

Data Attributes:

<div id="producto" data-id="123" data-categoria="electronica"></div>

<script>
    const producto = document.getElementById('producto');
    console.log(producto.dataset.id); // "123"
    console.log(producto.dataset.categoria); // "electronica"
</script>
← Volver a temas

📝 Texto y Tipografía

Encabezados:

<h1>Título Principal (uno por página)</h1>
<h2>Subtítulo</h2>
<h3>Sección</h3>
<h4>Subsección</h4>
<h5>Apartado</h5>
<h6>Sub-apartado</h6>

Elementos de Texto:

<p>Párrafo de texto.</p>

<strong>Texto importante (bold)</strong>
<b>Texto estilístico (bold)</b>

<em>Énfasis (italic)</em>
<i>Texto alternativo (italic)</i>

<mark>Texto resaltado</mark>
<small>Texto pequeño</small>
<del>Texto eliminado</del>
<ins>Texto insertado</ins>

<sub>Subíndice</sub>
<sup>Superíndice</sup>

<abbr title="HyperText Markup Language">HTML</abbr>
<blockquote cite="url">Cita en bloque</blockquote>
<q>Cita inline</q>
<cite>Título de obra</cite>
<code>Código inline</code>
<pre>Texto preformateado</pre>

Listas:

<!-- Lista desordenada -->
<ul>
    <li>Elemento 1</li>
    <li>Elemento 2</li>
</ul>

<!-- Lista ordenada -->
<ol>
    <li>Primer elemento</li>
    <li>Segundo elemento</li>
</ol>

<!-- Lista de definición -->
<dl>
    <dt>HTML</dt>
    <dd>Lenguaje de marcado</dd>
</dl>
← Volver a temas

🖼️ Imágenes y Multimedia

Imágenes:

<!-- Imagen básica -->
<img src="imagen.jpg" alt="Descripción" width="600" height="400">

<!-- Imagen responsive -->
<img src="imagen.jpg" alt="Descripción" style="max-width: 100%; height: auto;">

<!-- Múltiples fuentes (srcset) -->
<img src="imagen-800.jpg" 
     alt="Descripción"
     srcset="imagen-400.jpg 400w,
             imagen-800.jpg 800w,
             imagen-1200.jpg 1200w"
     sizes="(max-width: 600px) 400px,
            (max-width: 1000px) 800px,
            1200px">

<!-- Picture element -->
<picture>
    <source media="(min-width: 800px)" srcset="grande.jpg">
    <source media="(min-width: 400px)" srcset="mediana.jpg">
    <img src="pequeña.jpg" alt="Descripción">
</picture>

Video:

<video controls width="640" poster="thumbnail.jpg">
    <source src="video.mp4" type="video/mp4">
    <source src="video.webm" type="video/webm">
    <track src="subtitulos.vtt" kind="subtitles" srclang="es">
    Tu navegador no soporta video.
</video>

Audio:

<audio controls>
    <source src="audio.mp3" type="audio/mpeg">
    <source src="audio.ogg" type="audio/ogg">
    Tu navegador no soporta audio.
</audio>
💡 Tip: Siempre incluye el atributo alt en las imágenes para accesibilidad y SEO.
← Volver a temas

🔗 Enlaces y Navegación

Tipos de Enlaces:

<!-- Enlace interno -->
<a href="#seccion">Ir a sección</a>

<!-- Enlace externo -->
<a href="https://ejemplo.com" target="_blank" rel="noopener noreferrer">
    Sitio externo
</a>

<!-- Enlace a email -->
<a href="mailto:email@ejemplo.com">Enviar email</a>

<!-- Enlace a teléfono -->
<a href="tel:+1234567890">Llamar</a>

<!-- Enlace a descarga -->
<a href="archivo.pdf" download="nombre.pdf">Descargar</a>

<!-- Enlace con ancla -->
<a href="pagina.html#seccion">Sección en otra página</a>

Navegación:

<nav aria-label="Navegación principal">
    <ul>
        <li><a href="/" aria-current="page">Inicio</a></li>
        <li><a href="/about">Nosotros</a></li>
        <li><a href="/services">Servicios</a></li>
        <li><a href="/contact">Contacto</a></li>
    </ul>
</nav>

Atributos Importantes:

Atributo Descripción
href URL de destino
target Dónde abrir (_blank, _self, _parent)
rel Relación (noopener, noreferrer, nofollow)
download Forzar descarga
← Volver a temas

📊 Tablas

Tabla Básica:

<table>
    <caption>Lista de Usuarios</caption>
    <thead>
        <tr>
            <th scope="col">Nombre</th>
            <th scope="col">Email</th>
            <th scope="col">Rol</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Juan Pérez</td>
            <td>juan@email.com</td>
            <td>Admin</td>
        </tr>
        <tr>
            <td>María García</td>
            <td>maria@email.com</td>
            <td>Usuario</td>
        </tr>
    </tbody>
    <tfoot>
        <tr>
            <td colspan="3">Total: 2 usuarios</td>
        </tr>
    </tfoot>
</table>

Tabla Compleja (colspan/rowspan):

<table>
    <thead>
        <tr>
            <th rowspan="2">Producto</th>
            <th colspan="2">Ventas</th>
        </tr>
        <tr>
            <th>2025</th>
            <th>2026</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Producto A</td>
            <td>100</td>
            <td>150</td>
        </tr>
    </tbody>
</table>
♿ Accesibilidad: Usa scope="col" o scope="row" en los th para ayudar a los lectores de pantalla.
← Volver a temas

📋 Formularios HTML5

Formulario Completo:

<form action="/submit" method="POST">
    <!-- Texto -->
    <div>
        <label for="nombre">Nombre:</label>
        <input type="text" id="nombre" name="nombre" required 
               minlength="2" maxlength="50" placeholder="Tu nombre">
    </div>

    <!-- Email -->
    <div>
        <label for="email">Email:</label>
        <input type="email" id="email" name="email" required 
               multiple placeholder="nombre@ejemplo.com">
    </div>

    <!-- Password -->
    <div>
        <label for="password">Contraseña:</label>
        <input type="password" id="password" name="password" 
               required minlength="8" pattern="[A-Za-z0-9]+">
    </div>

    <!-- Número -->
    <div>
        <label for="edad">Edad:</label>
        <input type="number" id="edad" name="edad" 
               min="18" max="100" step="1">
    </div>

    <!-- Fecha -->
    <div>
        <label for="fecha">Fecha de nacimiento:</label>
        <input type="date" id="fecha" name="fecha">
    </div>

    <!-- Select -->
    <div>
        <label for="pais">País:</label>
        <select id="pais" name="pais" required>
            <option value="">Selecciona...</option>
            <option value="es">España</option>
            <option value="mx">México</option>
        </select>
    </div>

    <!-- Radio -->
    <fieldset>
        <legend>Género:</legend>
        <label><input type="radio" name="genero" value="m"> Masculino</label>
        <label><input type="radio" name="genero" value="f"> Femenino</label>
    </fieldset>

    <!-- Checkbox -->
    <div>
        <label><input type="checkbox" name="terminos" required> 
        Acepto los términos</label>
    </div>

    <!-- Textarea -->
    <div>
        <label for="mensaje">Mensaje:</label>
        <textarea id="mensaje" name="mensaje" rows="5" 
                  maxlength="500"></textarea>
    </div>

    <button type="submit">Enviar</button>
</form>

Nuevos Tipos de Input:

  • type="color" - Selector de color
  • type="range" - Slider numérico
  • type="search" - Búsqueda
  • type="tel" - Teléfono
  • type="url" - URL
  • type="datetime-local" - Fecha y hora
← Volver a temas

🔌 APIs del Navegador

LocalStorage y SessionStorage:

// LocalStorage (persistente)
localStorage.setItem('usuario', 'Juan');
const usuario = localStorage.getItem('usuario');
localStorage.removeItem('usuario');
localStorage.clear();

// SessionStorage (sesión)
sessionStorage.setItem('token', 'abc123');
const token = sessionStorage.getItem('token');

// Almacenar objetos
const datos = { nombre: 'Juan', edad: 30 };
localStorage.setItem('datos', JSON.stringify(datos));
const datosGuardados = JSON.parse(localStorage.getItem('datos'));

Geolocation API:

// Obtener ubicación
navigator.geolocation.getCurrentPosition(
    (position) => {
        console.log('Lat:', position.coords.latitude);
        console.log('Lng:', position.coords.longitude);
    },
    (error) => console.error(error)
);

// Watch position
const watchId = navigator.geolocation.watchPosition(
    (position) => console.log(position.coords)
);

// Clear watch
navigator.geolocation.clearWatch(watchId);

Canvas API:

<canvas id="miCanvas" width="400" height="300"></canvas>

<script>
    const canvas = document.getElementById('miCanvas');
    const ctx = canvas.getContext('2d');

    // Dibujar rectángulo
    ctx.fillStyle = 'blue';
    ctx.fillRect(50, 50, 100, 100);

    // Dibujar línea
    ctx.beginPath();
    ctx.moveTo(0, 0);
    ctx.lineTo(200, 200);
    ctx.stroke();

    // Dibujar círculo
    ctx.beginPath();
    ctx.arc(300, 150, 50, 0, Math.PI * 2);
    ctx.fill();
</script>

Drag and Drop API:

<div draggable="true" id="draggable">Arrástrame</div>
<div id="dropzone">Suelta aquí</div>

<script>
    const draggable = document.getElementById('draggable');
    const dropzone = document.getElementById('dropzone');

    draggable.addEventListener('dragstart', (e) => {
        e.dataTransfer.setData('text/plain', e.target.id);
    });

    dropzone.addEventListener('dragover', (e) => {
        e.preventDefault();
    });

    dropzone.addEventListener('drop', (e) => {
        e.preventDefault();
        const id = e.dataTransfer.getData('text/plain');
        e.target.appendChild(document.getElementById(id));
    });
</script>
← Volver a temas

♿ Accesibilidad y SEO

Accesibilidad (a11y):

<!-- Skip link -->
<a href="#main" class="skip-link">Saltar al contenido</a>

<!-- Landmarks -->
<header role="banner">...</header>
<nav role="navigation">...</nav>
<main role="main" id="main">...</main>
<aside role="complementary">...</aside>
<footer role="contentinfo">...</footer>

<!-- ARIA attributes -->
<button aria-label="Cerrar menú" aria-expanded="false">
    ☰
</button>

<div role="alert" aria-live="polite">
    Mensaje importante
</div>

<!-- Focus management -->
<input type="text" aria-describedby="help-text">
<span id="help-text">Formato: DD/MM/AAAA</span>

SEO Básico:

<head>
    <title>Título único y descriptivo (50-60 chars)</title>
    <meta name="description" content="Descripción atractiva (150-160 chars)">
    <meta name="keywords" content="palabra1, palabra2, palabra3">
    
    <!-- Open Graph para redes sociales -->
    <meta property="og:title" content="Título">
    <meta property="og:description" content="Descripción">
    <meta property="og:image" content="imagen.jpg">
    <meta property="og:url" content="https://ejemplo.com">
    
    <!-- Canonical URL -->
    <link rel="canonical" href="https://ejemplo.com/pagina">
    
    <!-- Favicon -->
    <link rel="icon" href="favicon.ico" type="image/x-icon">
</head>

Mejores Prácticas:

  • Usar encabezados en orden jerárquico (h1 → h6)
  • Incluir texto alternativo en imágenes
  • Asegurar contraste de colores adecuado
  • Hacer el sitio navegable con teclado
  • Usar HTML semántico correctamente
← Volver a temas

🏆 Proyecto Final

Sitio Web Completo:

Vamos a crear un sitio web completo utilizando todas las técnicas aprendidas:

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="Mi portafolio profesional">
    <title>Mi Portafolio | Desarrollador Web</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <a href="#main" class="skip-link">Saltar al contenido</a>
    
    <header role="banner">
        <nav role="navigation" aria-label="Navegación principal">
            <a href="/" class="logo">Mi Logo</a>
            <ul>
                <li><a href="#inicio" aria-current="page">Inicio</a></li>
                <li><a href="#proyectos">Proyectos</a></li>
                <li><a href="#about">Sobre mí</a></li>
                <li><a href="#contacto">Contacto</a></li>
            </ul>
        </nav>
    </header>
    
    <main id="main">
        <section id="inicio" aria-labelledby="hero-title">
            <h1 id="hero-title">Hola, soy Desarrollador Web</h1>
            <p>Especializado en crear experiencias digitales</p>
        </section>
        
        <section id="proyectos">
            <h2>Mis Proyectos</h2>
            <article>
                <img src="proyecto1.jpg" alt="Captura del proyecto 1">
                <h3>Proyecto 1</h3>
                <p>Descripción del proyecto...</p>
            </article>
        </section>
        
        <section id="contacto">
            <h2>Contacto</h2>
            <form action="/contacto" method="POST">
                <!-- Campos del formulario -->
            </form>
        </section>
    </main>
    
    <footer role="contentinfo">
        <p>© 2026 Mi Portafolio</p>
    </footer>
</body>
</html>

Componentes a incluir:

  • Header con navegación semántica
  • Hero section con H1 único
  • Sección de proyectos con articles
  • Formulario de contacto con validación HTML5
  • Footer con información de contacto
  • Accesibilidad completa (ARIA, skip links)
🎯 Objetivo: Al completar este proyecto, dominarás HTML5 y podrás crear sitios web semánticos, accesibles y optimizados para SEO.
← Volver a temas

Ejemplos de Código

Estructura Básica

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Mi Página</title>
</head>
<body>
    <h1>Hola Mundo</h1>
</body>
</html>

Elementos Semánticos

<header>
    <nav>...</nav>
</header>
<main>
    <article>...</article>
    <aside>...</aside>
</main>
<footer>...</footer>

Formulario HTML5

<form>
    <input type="email" required>
    <input type="date">
    <input type="range" min="1" max="10">
    <button type="submit">Enviar</button>
</form>

Multimedia

<video controls>
    <source src="video.mp4">
    Tu navegador no soporta video.
</video>
<audio controls>
    <source src="audio.mp3">
</audio>

👨‍💻 Desarrollado por Isaac Esteban Haro Torres

Ingeniero en Sistemas · Full Stack · Automatización · Data

📧 Email: zackharo1@gmail.com

📱 WhatsApp: 098805517

💻 GitHub: github.com/ieharo1

🌐 Portafolio: ieharo1.github.io/portafolio-isaac.haro/