Estructura del documento
Plantilla básica de página
Cada documento HTML5 comienza con <!DOCTYPE html>, seguido de <html> con un atributo lang para accesibilidad y SEO. El <head> contiene metadatos (charset, viewport, title), y <body> contiene el contenido visible. La meta tag viewport asegura el renderizado correcto en dispositivos móviles.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My Web Page</title>
</head>
<body>
<h1>Hello, World!</h1>
<p>Welcome to my page.</p>
</body>
</html>Sección head y metadatos
El elemento <head> contiene metadatos legibles por máquina. charset declara la codificación de caracteres (UTF-8 cubre casi todos los caracteres). La meta tag description es crucial para SEO — los motores de búsqueda la muestran en resultados. Usa defer en scripts para cargarlos después del parsing HTML.
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Page Title - Site Name</title>
<meta name="description" content="A brief description for SEO">
<meta name="author" content="John Doe">
<link rel="stylesheet" href="style.css">
<script src="app.js" defer></script>
</head>Comentarios y comentarios condicionales
Los comentarios HTML comienzan con <!-- y terminan con -->. No se muestran en el navegador pero son visibles en el código fuente de la página. Los comentarios son útiles para dejar notas, marcar secciones (TODO, FIXME) y documentación. Los comentarios condicionales (solo IE) están obsoletos pero pueden aparecer en código legacy.
<!-- This is a single-line comment -->
<!--
This is a
multi-line comment
-->
<!-- TODO: Add form validation -->
<!-- FIXME: Fix layout on mobile -->
<!--[if lt IE 9]>
<script src="html5shiv.js"></script>
<![endif]-->Jerarquía de encabezados
HTML proporciona seis niveles de encabezado, h1 (el más alto) a h6 (el más bajo). Úsalos en orden jerárquico sin saltar niveles. Los motores de búsqueda usan encabezados para entender la estructura de la página. Mejor práctica: un h1 por página, seguido de h2 para secciones principales, h3 para subsecciones, etc.
<h1>Main Page Title</h1>
<h2>Major Section</h2>
<h3>Subsection</h3>
<h4>Sub-subsection</h4>
<h5>Minor Heading</h5>
<h6>Lowest Level Heading</h6>
<!-- Use only one h1 per page for SEO -->
<h1>Blog Post Title</h1>
<h2>Introduction</h2>
<h3>Background</h3>Contenedores div y span
<div> es un contenedor block-level usado para agrupar elementos y aplicar estilos. <span> es un contenedor inline para estilizar porciones pequeñas de texto. Ambos son elementos genéricos sin significado semántico — prefiere tags semánticos (header, nav, main, article) cuando sea apropiado para mejor accesibilidad y SEO.
<div class="container">
<div id="header" class="header">
<span class="logo">MySite</span>
<span class="tagline">Best Content</span>
</div>
<div class="content">
<p>Main <span class="highlight">content</span> here.</p>
</div>
</div>Formato de texto
Negrita, cursiva y énfasis
<strong> indica texto importante (los screen readers lo enfatizan), mientras que <b> es negrita puramente visual. Similarmente, <em> indica énfasis de estrés (semántico), mientras que <i> es cursiva visual. Prefiere <strong> y <em> para accesibilidad. <b> y <i> son aceptables para propósitos estilísticos sin importancia semántica.
<p>This is <strong>important</strong> text.</p>
<p>This is <b>bold</b> text.</p>
<p>This is <em>emphasized</em> text.</p>
<p>This is <i>italic</i> text.</p>
<p><strong>Warning:</strong> Do not touch!</p>Mark, delete e insert
<mark> resalta texto como relevante (como un highlight de búsqueda). <del> marca texto eliminado, <ins> marca texto insertado — útil para mostrar ediciones. <s> tacha información desactualizada. <small> es para comentarios laterales o copyright. <u> debería usarse con cuidado ya que se parece a links.
<p>Please <mark>highlight this</mark> word.</p>
<p>The price is <del>$99</del> <ins>$79</ins> now.</p>
<p><s>Old information</s> is struck through.</p>
<p>Use <u>underline</u> sparingly.</p>
<p>Small <small>print</small> for side comments.</p>Superíndice y subíndice
<sub> crea texto subíndice (debajo de la línea base) para fórmulas químicas (H2O) y variables matemáticas. <sup> crea texto superíndice (encima de la línea base) para exponentes (x²), números ordinales (1st) y notas al pie. Ambos son elementos inline que ajustan posición vertical y tamaño de fuente.
<p>H<sub>2</sub>O is water.</p>
<p>E = mc<sup>2</sup> is Einstein's equation.</p>
<p>1st<sup>st</sup> January 2024</p>
<p>CO<sub>2</sub> emissions are rising.</p>
<p>x<sup>2</sup> + y<sup>2</sup> = r<sup>2</sup></p>Citas y referencias
<blockquote> es para citas block-level (indentadas, multi-línea). <q> es para citas cortas inline (añade comillas automáticamente). El atributo cite proporciona la URL fuente. <cite> etiqueta el título de una obra o nombre del autor. Estos elementos mejoran el markup semántico para contenido citado.
<blockquote cite="https://example.com/source">
<p>The best way to predict the future is to invent it.</p>
<footer>— <cite>Alan Kay</cite></footer>
</blockquote>
<p>As <q cite="https://example.com">someone once said</q>,
knowledge is power.</p>Código y texto preformateado
<code> marca snippets de código inline (fuente monospace). <pre> preserva whitespace y saltos de línea para texto preformateado. Combinar <pre><code> muestra bloques de código con indentación correcta. <kbd> representa input de teclado. <samp> es para output de programa, y <var> para variables en expresiones matemáticas.
<p>Use the <code>console.log()</code> function.</p>
<p>Press <kbd>Ctrl</kbd> + <kbd>C</kbd> to copy.</p>
<pre><code>function hello() {
console.log("Hello, World!");
return true;
}</code></pre>Saltos de línea y reglas horizontales
<br> crea un salto de línea dentro del texto (úsalo con moderación, prefiere CSS). <hr> crea una regla horizontal que representa un break temático entre secciones. <wbr> sugiere una oportunidad de salto de línea para palabras largas o URLs, permitiendo al navegador romper en puntos óptimos. Evita usar <br> para espaciado — usa margins CSS en su lugar.
<p>First line<br>Second line<br>Third line</p>
<p>Paragraph one.</p>
<hr>
<p>Paragraph two after a thematic break.</p>
<wbr><!-- word break opportunity for long URLs -->
https://example.com/<wbr>very<wbr>long<wbr>urlLinks y navegación
Links básicos
El elemento <a> crea hyperlinks. href especifica la URL destino. Los links externos usan URLs completas (https://...), los links internos usan paths absolutos (/about), y los links relativos usan file paths (../index.html). Los anchor links (#section) saltan a elementos con atributos id coincidentes en la misma página.
<!-- External link -->
<a href="https://www.example.com">Visit Example</a>
<!-- Internal link (same site) -->
<a href="/about">About Us</a>
<!-- Relative link -->
<a href="../index.html">Home</a>
<!-- Anchor link (same page) -->
<a href="#section1">Jump to Section 1</a>Targets y relaciones de links
target='_blank' abre links en una nueva pestaña — siempre párealo con rel='noopener noreferrer' por seguridad (previene ataques tabnabbing). El atributo download dispara descarga de archivo. mailto: abre el cliente de email, tel: inicia llamadas telefónicas en móvil. El atributo rel define la relación (noopener, noreferrer, nofollow para SEO).
<!-- Open in new tab -->
<a href="https://example.com" target="_blank" rel="noopener noreferrer">
Open in new tab
</a>
<!-- Download link -->
<a href="report.pdf" download>Download PDF</a>
<!-- Email link -->
<a href="mailto:[email protected]?subject=Hello">Email us</a>
<!-- Phone link -->
<a href="tel:+1234567890">Call us</a>Targets de ancla
Cualquier elemento con un atributo id puede ser un target de ancla. Los links con href='#id' hacen scroll a ese elemento. Esto es esencial para tabla de contenidos, notas al pie y navegación single-page. Añade CSS 'scroll-behavior: smooth' en html para scroll animado. Usa 'scroll-margin-top' para offset de headers fijos.
<h2 id="introduction">Introduction</h2>
<p>Content here...</p>
<h2 id="features">Features</h2>
<p>Content here...</p>
<!-- Navigation menu linking to sections -->
<nav>
<a href="#introduction">Intro</a>
<a href="#features">Features</a>
</nav>
<!-- Smooth scroll via CSS: scroll-behavior: smooth -->Links de imagen y figure
Envolver un <img> dentro de un <a> hace la imagen clicable. El atributo title crea un tooltip en hover (mejora UX pero no pesa mucho para SEO). Para accesibilidad, asegúrate de que las imágenes enlazadas tengan alt text significativo. Usa figure/figcaption para imágenes con captions que también pueden ser links.
<!-- Image as a link -->
<a href="https://example.com">
<img src="banner.jpg" alt="Click to visit">
</a>
<!-- Thumbnail linking to full image -->
<a href="full-size.jpg">
<img src="thumbnail.jpg" alt="View full image">
</a>
<!-- Link with title tooltip -->
<a href="https://example.com" title="Visit Example">
Hover for tooltip
</a>Menús de navegación
<nav> identifica secciones de navegación para screen readers y SEO. Usa aria-current='page' para indicar la página actual. Los breadcrumbs ayudan a los usuarios a entender su ubicación en la jerarquía del sitio. Las listas dentro de nav proporcionan estructura semántica. Mantén la navegación consistente entre páginas para usabilidad.
<nav>
<ul>
<li><a href="/" aria-current="page">Home</a></li>
<li><a href="/about">About</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
<!-- Breadcrumb navigation -->
<nav aria-label="Breadcrumb">
<ol>
<li><a href="/">Home</a></li>
<li><a href="/blog">Blog</a></li>
<li><a href="/blog/post" aria-current="page">Post</a></li>
</ol>
</nav>Imágenes y multimedia
Imágenes
Siempre incluye alt text para accesibilidad y SEO — describe la imagen para screen readers y cuando la imagen falla al cargar. loading='lazy' difiere la carga de imágenes offscreen, mejorando la velocidad de página. srcset y sizes habilitan imágenes responsive — el navegador selecciona la mejor imagen basándose en resolución del dispositivo y viewport. Siempre especifica width y height para prevenir layout shift.
<!-- Basic image -->
<img src="photo.jpg" alt="A sunset over mountains" width="800" height="600">
<!-- Image with lazy loading -->
<img src="hero.jpg" alt="Hero banner" loading="lazy" decoding="async">
<!-- Responsive image with srcset -->
<img
src="medium.jpg"
srcset="small.jpg 480w, medium.jpg 800w, large.jpg 1200w"
sizes="(max-width: 600px) 480px, 800px"
alt="Responsive photo"
>Elemento picture
<picture> proporciona art direction y fallback de formato. Los elementos <source> ofrecen alternativas — el navegador elige el primer formato soportado (WebP/AVIF son más pequeños). El atributo media habilita diferentes imágenes para diferentes tamaños de pantalla. El <img> final es el fallback y siempre debe estar presente. Esto es superior a srcset para servir imágenes completamente diferentes.
<picture>
<source srcset="webp-image.webp" type="image/webp">
<source srcset="avif-image.avif" type="image/avif">
<source srcset="wide.jpg" media="(min-width: 800px)">
<img src="fallback.jpg" alt="Art-directed image">
</picture>Audio
<audio> embebe contenido de sonido. controls añade controles play/pause/volume. Múltiples elementos <source> proporcionan fallbacks de formato (MP3 es el más ampliamente soportado). autoplay está restringido por navegadores — muted autoplay generalmente está permitido. loop repite el audio. El texto dentro se muestra si el audio no es soportado. Siempre proporciona controles para la experiencia del usuario.
<audio controls>
<source src="song.mp3" type="audio/mpeg">
<source src="song.ogg" type="audio/ogg">
Your browser does not support the audio element.
</audio>
<!-- Autoplay (muted required in most browsers) -->
<audio autoplay muted loop>
<source src="background.mp3" type="audio/mpeg">
</audio>Video
<video> embebe video con controles para play, pause, volume y fullscreen. poster establece un thumbnail antes de la reproducción. Múltiples sources proporcionan fallback de formato (MP4/H.264 es el más compatible). <track> añade subtítulos, captions o descripciones para accesibilidad. playsinline previene fullscreen forzado en iOS. Siempre incluye controles a menos que autoplay muted.
<video controls width="640" height="360" poster="thumbnail.jpg">
<source src="movie.mp4" type="video/mp4">
<source src="movie.webm" type="video/webm">
<track kind="subtitles" src="subs.vtt" srclang="en" label="English">
Your browser does not support video.
</video>
<!-- Autoplay muted loop (common for backgrounds) -->
<video autoplay muted loop playsinline>
<source src="bg.mp4" type="video/mp4">
</video>Figure y figcaption
<figure> agrupa contenido autocontenido como imágenes, diagramas, listados de código o citas con su caption. <figcaption> proporciona un caption o leyenda. Este agrupamiento semántico mejora la accesibilidad — los screen readers anuncian la relación. Las figures pueden referenciarse desde el texto ('ver Figura 1') y moverse en el layout sin perder contexto.
<figure>
<img src="chart.png" alt="Quarterly sales chart showing 20% growth">
<figcaption>Figure 1: Q4 2024 sales growth by region.</figcaption>
</figure>
<figure>
<blockquote>
<p>The best way to predict the future is to invent it.</p>
</blockquote>
<figcaption>— Alan Kay, 1971</figcaption>
</figure>Embeds de iframe
<iframe> embebe contenido externo (videos, mapas, otras páginas). Siempre incluye un atributo title para accesibilidad. loading='lazy' mejora el rendimiento para iframes offscreen. El atributo allow especifica feature policies. El atributo sandbox restringe las capacidades del iframe por seguridad. Ten cuidado — los iframes pueden impactar rendimiento y seguridad.
<!-- Embed a YouTube video -->
<iframe
src="https://www.youtube.com/embed/dQw4w9WgXcQ"
width="560" height="315"
title="YouTube video"
frameborder="0"
allow="accelerometer; autoplay; encrypted-media"
allowfullscreen>
</iframe>
<!-- Embed a map -->
<iframe
src="https://maps.google.com/maps?q=Paris&output=embed"
title="Map of Paris" loading="lazy">
</iframe>Listas
Listas no ordenadas
<ul> crea una lista no ordenada (con viñetas). Cada elemento se envuelve en <li>. La propiedad CSS list-style-type cambia el estilo de viñeta (disc, circle, square, none). Las listas no ordenadas son para elementos donde el orden no importa. Usa list-style: none y styling personalizado para menús de navegación y listas de características.
<ul>
<li>Apple</li>
<li>Banana</li>
<li>Cherry</li>
</ul>
<!-- Custom bullet style via CSS -->
<ul style="list-style-type: square;">
<li>First item</li>
<li>Second item</li>
</ul>Listas ordenadas
<ol> crea una lista ordenada (numerada) para elementos secuenciales. El atributo start establece el número inicial. reversed muestra elementos en orden descendente. El atributo type cambia el estilo de numeración (1, A, a, I, i). Usa <ol> para pasos, rankings o cualquier secuencia donde el orden importa.
<ol>
<li>First step</li>
<li>Second step</li>
<li>Third step</li>
</ol>
<!-- Start from a specific number -->
<ol start="5">
<li>Fifth item</li>
<li>Sixth item</li>
</ol>
<!-- Reverse order -->
<ol reversed>
<li>Countdown 3</li>
<li>Countdown 2</li>
<li>Countdown 1</li>
</ol>Listas de descripción
<dl> crea una lista de descripción emparejando términos (<dt>) con descripciones (<dd>). Esto es ideal para glosarios, páginas FAQ y pares término-definición. Múltiples <dd> pueden describir un <dt>, y viceversa. Las listas de descripción proporcionan significado semántico que las tablas de definición carecen, mejorando accesibilidad.
<dl>
<dt>HTML</dt>
<dd>HyperText Markup Language</dd>
<dt>CSS</dt>
<dd>Cascading Style Sheets</dd>
<dt>JavaScript</dt>
<dd>A programming language for the web</dd>
</dl>Listas anidadas
Las listas pueden anidarse colocando un <ul> o <ol> dentro de un <li>. Los navegadores indentan automáticamente las listas anidadas y pueden cambiar estilos de viñeta. El anidamiento crea estructuras jerárquicas como tabla de contenidos, árboles de archivos o menús multi-nivel. Mantén el anidamiento razonable (2-3 niveles) para usabilidad. Las listas profundamente anidadas se vuelven difíciles de leer.
<ul>
<li>Fruits
<ul>
<li>Apple</li>
<li>Banana</li>
</ul>
</li>
<li>Vegetables
<ol>
<li>Carrot</li>
<li>Spinach</li>
</ol>
</li>
</ul>Lista con links (navegación)
Las listas de links dentro de <nav> crean menús de navegación semánticos. Los elementos <ul> anidados forman submenús dropdown. Esta estructura es accesible para screen readers y fácilmente estilizable con CSS. Usa atributos aria (aria-expanded, aria-haspopup) para dropdowns interactivos. La navegación basada en listas es el patrón estándar para menús accesibles.
<nav>
<ul class="menu">
<li><a href="/">Home</a></li>
<li><a href="/products">Products</a>
<ul class="submenu">
<li><a href="/products/a">Product A</a></li>
<li><a href="/products/b">Product B</a></li>
</ul>
</li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>Tablas
Tabla básica
<table> crea datos tabulares. <thead> agrupa filas de header, <tbody> agrupa filas de body, <tfoot> agrupa filas de footer. <tr> es una fila de tabla, <th> es una celda de header (negrita, centrada), <td> es una celda de datos. Usar thead/tbody/tfoot mejora accesibilidad y habilita mejor estilización. Las tablas deberían usarse para datos, no para layout.
<table>
<thead>
<tr>
<th>Name</th>
<th>Age</th>
<th>City</th>
</tr>
</thead>
<tbody>
<tr>
<td>Alice</td>
<td>30</td>
<td>New York</td>
</tr>
<tr>
<td>Bob</td>
<td>25</td>
<td>London</td>
</tr>
</tbody>
</table>Celdas que abarcan
colspan hace que una celda abarque múltiples columnas (merge horizontal). rowspan hace que una celda abarque múltiples filas (merge vertical). Estos atributos crean layouts de tabla complejos como headers que agrupan múltiples columnas. Ten cuidado con spanning — puede hacer las tablas más difíciles de parsear para screen readers. Siempre testea accesibilidad.
<table border="1">
<tr>
<th colspan="2">Name</th>
<th rowspan="2">Age</th>
</tr>
<tr>
<th>First</th>
<th>Last</th>
</tr>
<tr>
<td>Alice</td>
<td>Smith</td>
<td>30</td>
</tr>
</table>Caption y scope de tabla
<caption> proporciona un título para la tabla, mejorando accesibilidad. El atributo scope en <th> dice a los screen readers si un header aplica a una columna (scope='col') o fila (scope='row'). Esto es esencial para tablas complejas. Para tablas aún más complejas, usa atributos id y headers para asociar explícitamente celdas con sus headers.
<table>
<caption>Employee Salary Report 2024</caption>
<thead>
<tr>
<th scope="col">Name</th>
<th scope="col">Department</th>
<th scope="col">Salary</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Alice</th>
<td>Engineering</td>
<td>$95,000</td>
</tr>
</tbody>
</table>Grupos de columnas
<colgroup> agrupa columnas para estilización. Los elementos <col> dentro aplican estilos (especialmente width) a columnas específicas. Esto es más eficiente que establecer width en cada celda. Los grupos de columnas también soportan el atributo span para estilizar múltiples columnas a la vez. Úsalo para anchos de columna consistentes en todas las filas.
<table>
<colgroup>
<col style="width: 30%;">
<col style="width: 50%;">
<col style="width: 20%;">
</colgroup>
<tr>
<th>Product</th>
<th>Description</th>
<th>Price</th>
</tr>
<tr>
<td>Laptop</td>
<td>15-inch laptop</td>
<td>$999</td>
</tr>
</table>Estilización de tablas
border-collapse: collapse fusiona bordes adyacentes en uno. Usa :nth-child(even) para filas con rayas de cebra (mejora legibilidad). :hover resalta filas en mouseover. El estilizado de th diferencia headers. Mantén el estilizado de tabla limpio y legible — evita bordes excesivos. Las tablas responsive pueden necesitar overflow-x: auto en un wrapper para pantallas pequeñas.
<style>
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f4f4f4; }
tr:nth-child(even) { background-color: #f9f9f9; }
tr:hover { background-color: #e0e0e0; }
</style>
<table>
<tr><th>Name</th><th>Score</th></tr>
<tr><td>Alice</td><td>95</td></tr>
<tr><td>Bob</td><td>87</td></tr>
</table>Formularios e input
Estructura de formulario
<form> envuelve controles de input. action especifica la URL de submission, method es GET (visible en URL) o POST (oculto). enctype='multipart/form-data' se requiere para subidas de archivos. <fieldset> agrupa campos relacionados, <legend> proporciona un caption. Siempre asocia <label> con inputs usando matching for/id para accesibilidad.
<form action="/submit" method="POST" enctype="multipart/form-data">
<fieldset>
<legend>Personal Information</legend>
<label for="name">Name:</label>
<input type="text" id="name" name="name" required>
<label for="email">Email:</label>
<input type="email" id="email" name="email" required>
</fieldset>
<button type="submit">Submit</button>
</form>Tipos de input
HTML5 introdujo muchos tipos de input con validación integrada y teclados mobile-friendly. type='email' valida formato de email. type='number' proporciona spinners. type='date' y 'time' muestran pickers nativos. type='color' abre un color picker. type='range' crea un slider. type='file' con accept restringe tipos de archivo. type='hidden' almacena datos no mostrados a usuarios.
<input type="text" name="username" placeholder="Username">
<input type="email" name="email" required>
<input type="password" name="pwd" minlength="8">
<input type="number" name="age" min="0" max="120" step="1">
<input type="date" name="birthday">
<input type="time" name="appointment">
<input type="color" name="favcolor" value="#ff0000">
<input type="range" name="volume" min="0" max="100">
<input type="file" name="upload" accept="image/*">
<input type="hidden" name="token" value="abc123">Select y textarea
<select> crea un dropdown. <optgroup> agrupa opciones relacionadas con un label. <option> define opciones; el atributo selected pre-selecciona una. <textarea> es para input de texto multi-línea. rows y cols establecen el tamaño visible. maxlength limita el conteo de caracteres. placeholder proporciona una pista. Ambos soportan atributos required y disabled.
<label for="country">Country:</label>
<select id="country" name="country">
<optgroup label="North America">
<option value="us">United States</option>
<option value="ca">Canada</option>
</optgroup>
<optgroup label="Europe">
<option value="uk">United Kingdom</option>
<option value="fr">France</option>
</optgroup>
</select>
<label for="bio">Bio:</label>
<textarea id="bio" name="bio" rows="4" cols="40"
maxlength="500" placeholder="Tell us about yourself"></textarea>Checkboxes y radio buttons
Los checkboxes permiten múltiples selecciones; los radio buttons permiten solo uno (cuando comparten el mismo name). El atributo checked pre-selecciona una opción. Siempre envuelve inputs en <label> para texto clicable. Usa <fieldset> y <legend> para agrupar opciones relacionadas para accesibilidad. El valor se envía al servidor solo si está seleccionado.
<fieldset>
<legend>Select your interests:</legend>
<label><input type="checkbox" name="interest" value="tech" checked> Tech</label>
<label><input type="checkbox" name="interest" value="music"> Music</label>
<label><input type="checkbox" name="interest" value="sports"> Sports</label>
</fieldset>
<fieldset>
<legend>Choose a plan:</legend>
<label><input type="radio" name="plan" value="free" checked> Free</label>
<label><input type="radio" name="plan" value="pro"> Pro</label>
<label><input type="radio" name="plan" value="enterprise"> Enterprise</label>
</fieldset>Validación de formulario
HTML5 proporciona validación client-side integrada. required previene submission si está vacío. minlength/maxlength limitan la longitud del texto. pattern usa regex para validación personalizada (el atributo title guía a los usuarios). type='email' y type='url' validan formato. min/max funcionan con números y fechas. Añade novalidate al formulario para deshabilitar validación.
<form>
<input type="text" name="username" required
minlength="3" maxlength="20"
pattern="[A-Za-z0-9_]+"
title="3-20 alphanumeric characters">
<input type="email" name="email" required>
<input type="url" name="website"
placeholder="https://example.com">
<input type="number" name="age" min="18" max="99">
<button type="submit">Submit</button>
</form>Buttons y datalist
type='submit' envía el formulario, type='reset' limpia todos los campos, type='button' es un botón personalizado. <datalist> proporciona sugerencias de autocomplete para elementos <input> — vincúlalos con list/id. A diferencia de <select>, los usuarios pueden ingresar valores personalizados. Esto combina la flexibilidad del input de texto con la conveniencia de sugerencias.
<!-- Button types -->
<button type="submit">Submit Form</button>
<button type="reset">Reset</button>
<button type="button" onclick="alert('Hi')">Click Me</button>
<!-- Datalist for autocomplete suggestions -->
<label for="browser">Choose a browser:</label>
<input list="browsers" name="browser" id="browser">
<datalist id="browsers">
<option value="Chrome">
<option value="Firefox">
<option value="Safari">
<option value="Edge">
</datalist>HTML semántico
Header y navegación
<header> representa contenido introductorio — típicamente un logo, encabezado y navegación. Puede aparecer en la parte superior de una página o dentro de un <article> o <section>. <nav> identifica links de navegación, ayudando a los screen readers a saltar a la navegación. Una página puede tener múltiples headers (ej., uno por sección). Header no es lo mismo que head — es contenido visible.
<header>
<h1>My Website</h1>
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/blog">Blog</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
</header>Main y article
<main> envuelve el contenido dominante de la página (solo uno por página). <article> representa contenido autocontenido que podría distribuirse independientemente (blog post, news article, forum post). <time> con datetime proporciona fechas legibles por máquina para SEO. <section> agrupa contenido temáticamente relacionado con un encabezado. Estos tags mejoran el outline del documento y accesibilidad.
<main>
<article>
<h1>Blog Post Title</h1>
<p>Published on <time datetime="2024-01-15">January 15, 2024</time></p>
<p>The main content of the article...</p>
<section>
<h2>Subsection</h2>
<p>More content...</p>
</section>
</article>
</main>Section y aside
<section> agrupa contenido relacionado con un encabezado — úsalo cuando el contenido tiene un encabezado natural. <aside> representa contenido tangencialmente relacionado al contenido principal (sidebars, pull quotes, ads, links relacionados). Ambos mejoran la estructura del documento. Las sections pueden anidarse. Los asides típicamente se estilizan como sidebars pero son semánticos, no presentacionales.
<section>
<h2>Services</h2>
<p>We offer the following services:</p>
<article>
<h3>Web Design</h3>
<p>Custom website design...</p>
</article>
</section>
<aside>
<h3>Related Articles</h3>
<ul>
<li><a href="/post1">Related Post 1</a></li>
<li><a href="/post2">Related Post 2</a></li>
</ul>
</aside>Footer
<footer> contiene contenido de footer para una página o sección — copyright, links a documentos relacionados, info de contacto, sitemap. Una página puede tener múltiples footers (ej., uno por sección de article). Los footers no se requieren estar visualmente al fondo, pero semánticamente representan contenido conclusivo. Usa © para el símbolo de copyright.
<footer>
<div>
<h3>About Us</h3>
<p>Company information...</p>
</div>
<nav>
<a href="/privacy">Privacy Policy</a>
<a href="/terms">Terms of Service</a>
<a href="/sitemap">Sitemap</a>
</nav>
<p>© 2024 My Company. All rights reserved.</p>
</footer>Details y summary
<details> crea un widget de disclosure interactivo — el contenido está oculto hasta que el usuario hace clic en <summary>. El atributo open lo muestra expandido por defecto. Esto es HTML nativo, sin necesidad de JavaScript. Genial para FAQs, secciones colapsables y progressive disclosure. Los details anidados crean acordeones multi-nivel. Estiliza con el selector de atributo [open].
<details>
<summary>Click to expand FAQ</summary>
<p>This content is hidden by default and shown when the summary is clicked.</p>
</details>
<!-- Open by default -->
<details open>
<summary>What is HTML?</summary>
<p>HTML (HyperText Markup Language) is the standard language for creating web pages.</p>
</details>
<!-- Nested details -->
<details>
<summary>Advanced Topics</summary>
<details>
<summary>Sub-topic</summary>
<p>Nested content...</p>
</details>
</details>Meta tags y SEO
Charset y viewport
charset='UTF-8' declara la codificación de caracteres — esencial para mostrar todos los caracteres correctamente. La meta tag viewport es crítica para diseño responsive: width=device-width coincide con el ancho del dispositivo, initial-scale=1.0 establece el nivel de zoom. Sin ella, los navegadores móviles renderizan páginas con ancho de desktop. Estas dos meta tags deberían estar en cada documento HTML.
<head>
<!-- Character encoding -->
<meta charset="UTF-8">
<!-- Responsive viewport -->
<meta name="viewport"
content="width=device-width, initial-scale=1.0">
<!-- Internet Explorer compatibility -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
</head>Description y keywords
La meta tag description es la más importante para SEO — los motores de búsqueda la muestran bajo tu título en resultados (mantenla bajo 160 caracteres). keywords es ampliamente ignorada por los motores de búsqueda modernos. robots controla indexación: index/noindex, follow/nofollow. author acredita al creador del contenido. Escribe descriptions atractivas para mejorar las tasas de clic.
<meta name="description"
content="Free HTML tutorials for beginners. Learn HTML tags, attributes, and semantic markup with examples.">
<meta name="keywords"
content="HTML, tutorial, web development, markup">
<meta name="author" content="John Doe">
<meta name="robots" content="index, follow">Open Graph (Facebook)
Las meta tags Open Graph (og:) controlan cómo aparece tu página cuando se comparte en Facebook, LinkedIn y otras plataformas. og:title, og:description, og:image y og:url son las más importantes. og:type puede ser article, website, product, etc. La imagen debería ser de al menos 1200x630 píxeles. Testea con Facebook Sharing Debugger antes de deployar.
<meta property="og:title" content="My Amazing Article">
<meta property="og:description" content="A brief description of the article.">
<meta property="og:image" content="https://example.com/image.jpg">
<meta property="og:url" content="https://example.com/article">
<meta property="og:type" content="article">
<meta property="og:site_name" content="My Website">
<meta property="og:locale" content="en_US">Twitter Cards
Las meta tags de Twitter Card controlan cómo aparecen los links en Twitter/X. twitter:card puede ser summary, summary_large_image o player. La large image card es la más atractiva. twitter:site y twitter:creator enlazan a cuentas de Twitter. Si hay tags Open Graph presentes, Twitter recurre a ellos, pero los tags Twitter explícitos dan más control. Testea con Twitter Card Validator.
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="My Amazing Article">
<meta name="twitter:description" content="A brief description.">
<meta name="twitter:image" content="https://example.com/image.jpg">
<meta name="twitter:site" content="@mywebsite">
<meta name="twitter:creator" content="@author">Canonical y structured data
El canonical link tag dice a los motores de búsqueda la URL preferida para una página, previniendo penalizaciones por contenido duplicado. Los structured data JSON-LD ayudan a los motores de búsqueda a entender tu contenido y habilitan rich snippets (star ratings, breadcrumbs, FAQ accordions en resultados de búsqueda). Usa tipos de schema.org como Article, Product, Event o FAQPage. Valida con Google Rich Results Test.
<!-- Canonical URL (prevents duplicate content issues) -->
<link rel="canonical" href="https://example.com/article">
<!-- Structured data (JSON-LD) -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "My Article Title",
"author": "John Doe",
"datePublished": "2024-01-15",
"image": "https://example.com/image.jpg"
}
</script>SVG y Canvas
Fundamentos de SVG
SVG (Scalable Vector Graphics) crea gráficos resolution-independent que escalan sin pérdida de calidad. El SVG inline puede estilizarse con CSS y manipularse con JavaScript. Formas comunes: <circle>, <rect>, <line>, <ellipse>, <polygon>, <path>. SVG es ideal para iconos, logos y diagramas. A diferencia de las imágenes raster, los SVGs son nítidos a cualquier tamaño.
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<circle cx="100" cy="100" r="50" fill="blue" stroke="black" stroke-width="2"/>
<text x="100" y="105" text-anchor="middle" fill="white">Circle</text>
</svg>
<!-- Inline SVG (can be styled with CSS) -->
<svg width="100" height="100">
<rect x="10" y="10" width="80" height="80" fill="red" rx="10"/>
</svg>Formas SVG
Las formas SVG usan atributos basados en coordenadas. <rect> necesita x, y, width, height; rx/ry crean esquinas redondeadas. <circle> necesita cx, cy (centro) y r (radio). <ellipse> usa rx y ry para diferentes radios x/y. <line> conecta x1,y1 a x2,y2. <polygon> toma una lista de points. fill establece color interior, stroke establece outline.
<svg width="300" height="200">
<!-- Rectangle -->
<rect x="10" y="10" width="80" height="50" fill="orange" rx="10" ry="10"/>
<!-- Circle -->
<circle cx="200" cy="50" r="40" fill="green"/>
<!-- Ellipse -->
<ellipse cx="100" cy="150" rx="60" ry="30" fill="purple"/>
<!-- Line -->
<line x1="10" y1="180" x2="290" y2="180" stroke="black" stroke-width="2"/>
<!-- Polygon -->
<polygon points="250,10 290,80 210,80" fill="pink"/>
</svg>Paths SVG
<path> es el elemento SVG más potente, usando un atributo d con comandos: M (moveto), L (lineto), H/V (línea horizontal/vertical), C (cubic Bezier), Q (quadratic Bezier), A (arc), Z (close path). Mayúsculas = coordenadas absolutas, minúsculas = relativas. viewBox define el sistema de coordenadas. Los iconos SVG usan paths para iconos escalables y estilizables.
<svg width="200" height="200">
<!-- M=move, L=line, C=curve, Z=close -->
<path d="M 10 10 L 100 10 L 100 100 Z" fill="none" stroke="black"/>
<!-- Bezier curve -->
<path d="M 10 100 C 50 10, 150 10, 190 100" fill="none" stroke="red"/>
<!-- Arc -->
<path d="M 10 100 A 90 90 0 0 1 190 100" fill="none" stroke="blue"/>
</svg>
<!-- SVG icon example -->
<svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor">
<path d="M12 2L2 7v10l10 5 10-5V7z"/>
</svg>Fundamentos de Canvas
<canvas> es una superficie de dibujo bitmap manipulada vía JavaScript. Obtén el contexto 2D con getContext('2d'). A diferencia de SVG, canvas es pixel-based (no escalable) y no es parte del DOM. Canvas es mejor para animaciones complejas, juegos y procesamiento de imágenes. SVG es mejor para gráficos estáticos, iconos y charts interactivos. Elige basándote en tus necesidades.
<canvas id="myCanvas" width="300" height="200"></canvas>
<script>
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
// Draw a rectangle
ctx.fillStyle = 'blue';
ctx.fillRect(10, 10, 100, 80);
// Draw a circle
ctx.beginPath();
ctx.arc(200, 50, 30, 0, Math.PI * 2);
ctx.fillStyle = 'red';
ctx.fill();
// Draw text
ctx.font = '20px Arial';
ctx.fillText('Hello Canvas', 50, 150);
</script>