Tanto si estás dando tus primeros pasos para aprender HTML, como si buscas respuestas concretas sobre HTML5 y las últimas novedades de HTML moderno, o deseas consolidar tus conocimientos, has llegado al sitio perfecto.
He recopilado las dudas más habituales sobre HTML, el lenguaje fundamental del desarrollo de sitios web accesibles, semánticos y eficientes, desde los fundamentos esenciales hasta las funcionalidades avanzadas y las mejores prácticas actuales.
HTML son las siglas de «hypertext markup language», que se traduce como «lenguaje de marcado de hipertexto». Es el lenguaje estándar que se utiliza para crear y definir la estructura de las páginas web y aplicaciones que ves en internet.
No se trata de un lenguaje de programación que crea funcionalidades dinámicas, sino de un lenguaje de marcado. Esto quiere decir que funciona mediante el uso de etiquetas para organizar y describir los diferentes bloques de contenido.
Imagina que HTML es como el esqueleto de un sitio web: define sus componentes básicos como títulos, párrafos, enlaces, imágenes, listas, etc., dándoles un significado y un orden.
Por ejemplo, para crear un título principal y un párrafo, tu código HTML se vería así:
<h1>Este es el título más importante</h1>
<p>Aquí va un párrafo explicando algo interesante.</p>
Lenguaje del código: PHP (php)Básicamente, HTML le dice al navegador cómo debe mostrar el contenido. Para la parte visual (colores, fuentes) se usa CSS y para la interactividad (animaciones, respuestas a acciones del usuario) se emplea JavaScript.
No, HTML no se considera un lenguaje de programación en el sentido tradicional. HTML es un lenguaje de marcado («markup language» en inglés).
La distinción fundamental es que los lenguajes de programación, como JavaScript, Python o Java, están diseñados para ejecutar lógica, realizar cálculos, tomar decisiones (mediante condicionales if/else), repetir tareas (con bucles for o while) y, en general, para controlar el comportamiento de un sistema. Permiten crear algoritmos y procesar datos de manera activa.
Por otro lado, HTML se utiliza para describir y estructurar el contenido de una página web. Define qué es cada elemento: esto es un encabezado (<h1>), esto es un párrafo (<p>), esto es una imagen (<img>), etc. No posee la capacidad de realizar operaciones lógicas ni de controlar el flujo de ejecución. Simplemente «marca» el contenido para que el navegador sepa cómo interpretarlo y mostrarlo.
Para añadir interactividad y funcionalidades de programación a una página HTML, se recurre a lenguajes como JavaScript.
HTML fue creado por Tim Berners-Lee, un científico británico, alrededor de 1989-1991. En aquel entonces, Berners-Lee trabajaba en el CERN (Organización Europea para la Investigación Nuclear) y concibió HTML como una manera de que los científicos pudieran compartir y enlazar documentos de forma sencilla a través de una red, lo que fue fundamental para el nacimiento de la World Wide Web.
Hoy en día, el estándar de HTML, conocido como «HTML Living Standard» (estándar vivo de HTML), es mantenido principalmente por el WHATWG (Web Hypertext Application Technology Working Group). Este consorcio incluye a representantes de los principales fabricantes de navegadores web (como Apple, Google, Mozilla y Microsoft) y otras partes interesadas. El WHATWG se asegura de que HTML evolucione de manera continua para satisfacer las necesidades de la web moderna.
El W3C (World Wide Web Consortium), que históricamente se encargaba de publicar versiones numeradas de HTML (como HTML4 o HTML5), ahora colabora estrechamente con el WHATWG. El W3C publica Recomendaciones basadas en el «HTML Living Standard» del WHATWG, promoviendo así un único estándar unificado para el lenguaje.
HTML, CSS y JavaScript son las tres tecnologías fundamentales que trabajan conjuntamente para crear prácticamente todas las experiencias web que conoces. Cada una tiene un papel distinto pero complementario:
<div id="mensaje">Hola</div>#mensaje { color: blue; font-size: 20px; padding: 10px; }document.getElementById('mensaje').textContent = '¡Adiós!';En resumen, HTML proporciona la base estructural, CSS la mejora visualmente y JavaScript la hace funcional e interactiva. Un archivo HTML a menudo enlaza archivos CSS y JavaScript para que trabajen juntos.
No, estrictamente hablando, no necesitas ningún software «especial» para escribir HTML. Los archivos HTML son, en esencia, archivos de texto plano. Esto significa que puedes crearlos y editarlos con el editor de texto más sencillo que venga con tu sistema operativo.
Por ejemplo, podrías usar:
Una vez que hayas escrito tu código HTML en uno de estos programas, simplemente guardas el archivo con la extensión .html (por ejemplo, mi_pagina.html). Luego, puedes abrir ese archivo directamente con cualquier navegador web (como Google Chrome, Mozilla Firefox, Microsoft Edge, etc.) para ver cómo se muestra tu página.
Dicho esto, aunque no es imprescindible, la mayoría de los desarrolladores web utilizan editores de código especializados o entornos de desarrollo integrados (IDEs) como Visual Studio Code, Sublime Text o Brackets.
Estas herramientas, muchas de ellas gratuitas, ofrecen funcionalidades muy útiles como el resaltado de sintaxis (colores para distinguir las partes del código), autocompletado, detección de errores y extensiones que facilitan enormemente la escritura y organización del código HTML.
HTML5 se refiere a la quinta revisión importante del lenguaje HTML, el código fundamental que estructura las páginas web. Cuando se introdujo, trajo consigo un montón de mejoras y nuevas características diseñadas para que los desarrolladores pudieran crear sitios y aplicaciones web más potentes, semánticos y multimedia de forma más sencilla.
Algunas de sus aportaciones más destacadas fueron:
<article>, <section>, <nav>, <header>, <footer> y <main>, que ayudan a describir mejor la estructura del contenido.<audio> y <video>, permitiendo incrustar contenido multimedia sin depender de «plugins» externos.<canvas> para dibujar gráficos dinámicamente mediante JavaScript, y un mejor soporte para SVG.email, date, etc.) y atributos para la validación directamente en el navegador.<!DOCTYPE html>, más fácil de recordar y usar.En cuanto a si es la única versión que se usa, la situación ha evolucionado. HTML ya no se desarrolla mediante grandes versiones numeradas estáticas. Ahora es un «estándar vivo» («living standard») mantenido por el WHATWG, lo que significa que se actualiza de forma continua.
Aunque el término «HTML5» se sigue usando comúnmente para describir el conjunto de tecnologías HTML modernas, en realidad estás utilizando este estándar vivo.
Si bien aún existen páginas antiguas creadas con HTML4 o XHTML, todo el desarrollo web nuevo y moderno se basa en este estándar actual y en constante evolución. Por tanto, para tus proyectos, debes centrarte en las capacidades más recientes de HTML.
HTML5 es la quinta gran revisión del lenguaje HTML y la que realmente sentó las bases para la web moderna tal como la conocemos.
¡Empezar con HTML desde cero es más fácil de lo que piensas! Aquí te doy una hoja de ruta sencilla:
.html (por ejemplo, mi_pagina.html).<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <title>Mi primera página</title> </head> <body> <h1>¡Hola, mundo!</h1> <p>Estoy aprendiendo HTML y es genial.</p> </body> </html>.html en tu navegador para ver el resultado.<h1> a <h6>), párrafos (<p>), enlaces (<a>), imágenes (<img>) y listas (<ul> para no ordenadas, <ol> para ordenadas).¡Y sobre todo, ten paciencia y sé constante!
Cuando abres un archivo HTML en tu navegador, ya sea desde una dirección web o un archivo en tu ordenador, este sigue una serie de pasos para «traducir» ese código en la página visual que tú ves:
<!DOCTYPE html> para saber qué versión de HTML usar y entrar en «modo estándar». Luego, analiza todas las etiquetas (<h1>, <p>, <img>, etc.), sus atributos y el contenido que encierran.<link rel="stylesheet" ...>), archivos de JavaScript (<script src="..."></script>) o imágenes (<img>), el navegador los solicita y los carga.Todo este proceso ocurre muy rápidamente, aunque la complejidad de la página puede influir en el tiempo de carga.
Usar HTML moderno (es decir, HTML5 y las características del estándar vivo actual) en tus proyectos web es crucial por múltiples razones que benefician tanto al desarrollo como al usuario final:
<article>, <nav>, <main>, o <aside> permiten describir el propósito de tu contenido de forma mucho más precisa que usando solo <div> genéricos. Esto hace tu código más legible y comprensible. HTML<div id="navegacion">...</div> <nav>...</nav><video>, <audio>), gráficos (<canvas>), y formularios más potentes con validación incorporada, reduciendo la dependencia de JavaScript o complementos externos para tareas comunes.loading="lazy" para imágenes pueden mejorar los tiempos de carga de la página.Adoptar HTML moderno es invertir en sitios web más robustos, accesibles, eficientes y preparados para el futuro.
La declaración <!DOCTYPE html> que ves al inicio de casi todos los archivos HTML modernos es una instrucción fundamental para el navegador web. Su nombre completo es «document type declaration», o «declaración del tipo de documento».
Su propósito principal es decirle al navegador qué versión de HTML (o, en algunos casos, XML) se está utilizando en la página. En concreto, <!DOCTYPE html> es la declaración específica y simplificada para HTML5, que es la versión actual del estándar HTML.
Al incluir esta línea al comienzo de tu documento, te aseguras de que el navegador interprete el código en lo que se conoce como «modo estándar» («standards mode»). Este modo hace que el navegador intente seguir las especificaciones web actuales de la forma más precisa posible, lo que lleva a una representación más consistente y predecible de tu página en diferentes navegadores.
Si omites el <!DOCTYPE html>, o utilizas una declaración antigua o incorrecta, el navegador podría entrar en «modo peculiar» («quirks mode»). En este modo, el navegador intenta emular el comportamiento de navegadores más antiguos, lo que puede causar que tu página se muestre de forma incorrecta o inconsistente.
Debe ser siempre la primera línea del archivo, antes de la etiqueta <html>:
<!DOCTYPEDOCTYPE <strong>html</strong>>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Título de la página</title>
</head>
<body>
</body>
</html>Lenguaje del código: PHP (php)Es, por tanto, un elemento esencial para el desarrollo web actual.
Para añadir comentarios en HTML, utilizas una sintaxis específica que los navegadores reconocen e ignoran al renderizar la página. Es decir, el contenido de los comentarios no se muestra al usuario final, pero es visible si alguien inspecciona el código fuente de la página.
Características y usos de los comentarios HTML:
<!-- y otra de cierre -->.Ejemplos:
Usar comentarios de forma efectiva puede hacer tu código HTML mucho más legible y fácil de mantener.
La estructura mínima de un documento HTML5 es bastante concisa, pero cada parte es esencial para que los navegadores interpreten correctamente tu página. Aquí la tienes:
<!DOCTYPE <strong>html</strong>>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Título de la página</title>
</head>
<body>
</body>
</html>
Lenguaje del código: PHP (php)Vamos a ver qué significa cada línea:
<!DOCTYPE html>: Esta es la declaración del tipo de documento. Le indica al navegador que la página está escrita en HTML5, asegurando que se renderice en el «modo estándar» más actual.<html lang="es">: Es el elemento raíz que engloba todo el contenido de la página. El atributo lang="es" especifica que el idioma principal del documento es el español, lo cual es importante para la accesibilidad y el SEO.<head>: Esta sección contiene metainformación sobre el documento HTML, es decir, datos que no se muestran directamente en la parte visible de la página.<meta charset="UTF-8">: Define la codificación de caracteres del documento. UTF-8 es la recomendada universalmente porque soporta prácticamente todos los caracteres y símbolos, incluyendo acentos y la «ñ».<title>Título de la página</title>: Este es el título que aparecerá en la pestaña del navegador o en la barra de título de la ventana. Es un elemento obligatorio dentro del <head>.<body>: En esta sección se coloca todo el contenido que será visible para el usuario: textos, imágenes, enlaces, vídeos, etc. Aunque en este ejemplo esté vacío, es una parte fundamental de la estructura.Con estos elementos, tienes un esqueleto HTML5 válido y listo para empezar a construir tu página web.
La etiqueta <html> es el elemento raíz de cualquier documento HTML. Esto significa que actúa como el contenedor principal que envuelve todo el demás contenido de tu página web, incluyendo las secciones <head> y <body>.
Siempre la encontrarás justo después de la declaración <!DOCTYPE html> (la etiqueta de apertura <html>) y será la última en cerrarse (</html>) al final del archivo.
Su propósito fundamental es señalar al navegador dónde comienza y dónde termina el código HTML interpretable.
Aunque la etiqueta <html> puede aceptar varios atributos, los más comunes e importantes en el desarrollo moderno son:
lang: Este atributo especifica el idioma principal del contenido del documento. Es crucial para la accesibilidad, ya que ayuda a los lectores de pantalla a utilizar la pronunciación correcta, y también puede ser útil para los motores de búsqueda.<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <title>Mi Página Web</title> </head> <body> <p>Este contenido está en español.</p> </body> </html> lang="en".dir: Define la direccionalidad del texto dentro del elemento. Los valores comunes son ltr (de izquierda a derecha, el predeterminado para idiomas como el español o el inglés) y rtl (de derecha a izquierda, para idiomas como el árabe o el hebreo).Además de estos, la etiqueta <html> también puede aceptar los atributos globales comunes a todos los elementos HTML, como id o class, aunque su uso directo en <html> es menos frecuente. En el contexto de XHTML o HTML serializado como XML, también podrías encontrar el atributo xmlns, pero para el HTML5 estándar (text/html) no es necesario.
La sección <head> de un documento HTML es un componente que actúa como un contenedor para metadatos e información de configuración sobre tu página web.
Su contenido no es visible directamente en la ventana del navegador (eso corresponde al <body>), sino que su propósito fundamental es proporcionar al propio navegador, a los motores de búsqueda y a otros servicios web los datos necesarios para interpretar, mostrar y entender correctamente el documento.
Dentro del <head>, se incluye una variedad de tipos de información esencial, cada uno mediante etiquetas específicas:
<title>: (Obligatorio) Define el título que se muestra en la pestaña del navegador, en los marcadores y en los resultados de búsqueda. Es la identidad principal de tu página.<meta>: Se usa para una amplia gama de metainformación. Los ejemplos más importantes son:charset (ej. <meta charset="UTF-8">): Especifica la codificación de caracteres para asegurar que todos los textos y símbolos se visualicen correctamente.viewport (ej. <meta name="viewport" content="width=device-width, initial-scale=1.0">): Clave para el diseño web adaptable, ajustando la página a diferentes tamaños de pantalla.description: Proporciona un resumen conciso del contenido de la página, muy útil para el SEO.<link>: Sirve para enlazar recursos externos. Su uso más común es para vincular hojas de estilo CSS (ej. <link rel="stylesheet" href="estilos.css">) que aplican el diseño visual, pero también se usa para favicons, fuentes web, o para indicar relaciones entre documentos (ej. rel="canonical").<style>: Permite incluir reglas de CSS directamente en el propio documento HTML, para estilos específicos de esa página.<script>: Se utiliza para enlazar archivos JavaScript externos o para escribir código JavaScript directamente. Aunque pueden ubicarse en el <head>, a menudo se recomienda colocar los scripts justo antes del cierre de la etiqueta <body> para optimizar la velocidad de carga percibida de la página.Un ejemplo de una sección <head> típica sería:
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Título de la Página Web</title>
<meta name="description" content="Una descripción breve y relevante de esta página.">
<link rel="stylesheet" href="css/mi_estilo.css">
<link rel="icon" href="favicon.ico" type="image/x-icon">
</head>
Lenguaje del código: PHP (php)En resumen, el <head> es indispensable para la correcta configuración, presentación e interpretación de tu página web en el ecosistema digital.
La etiqueta <meta charset="UTF-8"> es una declaración que se coloca dentro de la sección <head> de tu documento HTML. Su función principal es indicar al navegador qué codificación de caracteres debe utilizar para interpretar y mostrar correctamente el texto de tu página web.
Imagina la codificación de caracteres como un «diccionario» que traduce las letras, números, acentos (como á, é, í, ó, ú), la letra «ñ», símbolos especiales (€, ©) y emojis que usas en tu contenido a una secuencia de bytes que el ordenador puede entender, y viceversa.
UTF-8 es el estándar de codificación de caracteres más utilizado y recomendado hoy en día por varias razones:
Si no especificas la codificación con <meta charset="UTF-8"> (o si el servidor no la envía correctamente), el navegador podría intentar adivinarla. Si se equivoca, los caracteres especiales podrían mostrarse incorrectamente, apareciendo como símbolos extraños (por ejemplo, �), cuadrados o un texto sin sentido.
Es una buena práctica colocar esta etiqueta lo más arriba posible dentro del <head>:
<!DOCTYPE <strong>html</strong>>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Página con acentuación y eñes</title>
</head>
<body>
<p>¡Una cigüeña y un ñandú!</p>
</body>
</html>
Lenguaje del código: PHP (php)Usar UTF-8 garantiza que tu contenido se muestre de manera consistente y correcta para todos los usuarios.
La etiqueta <meta name="viewport" ...> es una instrucción crucial que colocas en la sección <head> de tu documento HTML, y es fundamental para el diseño web adaptable («responsive web design»). Su propósito es decirle al navegador cómo debe controlar las dimensiones de la página y su nivel de escala en la pantalla del dispositivo, especialmente en móviles.
El «viewport» es, en esencia, el área visible de la página web para el usuario en la pantalla de su dispositivo. En los inicios de la web móvil, los navegadores de los teléfonos intentaban mostrar las páginas web completas como si fueran pantallas de ordenador, lo que resultaba en que todo se veía muy pequeño y era necesario hacer mucho zoom para leer.
La configuración más común y recomendada de esta etiqueta es:
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mi Página Adaptable</title>
</head>
Lenguaje del código: PHP (php)Analicemos el atributo content:
width=device-width: Esta parte le dice al navegador que establezca el ancho del viewport de la página igual al ancho de la pantalla del dispositivo en píxeles independientes del dispositivo (DIPs). Así, la página utiliza el espacio disponible de forma óptima.initial-scale=1.0: Esto controla el nivel de zoom inicial cuando la página se carga por primera vez. Un valor de 1.0 significa que no habrá zoom, mostrando la página en una relación 1:1 entre los píxeles CSS y los píxeles independientes del dispositivo.¿Por qué es tan importante?
Sin esta etiqueta, los navegadores móviles suelen simular un viewport de escritorio mucho más ancho (por ejemplo, 980px) y luego encogen la página resultante, lo que impide que tus diseños adaptables (hechos con «media queries» en CSS) funcionen como esperas.
Al establecer el viewport correctamente, te aseguras de que tu web se adapte y se vea bien en cualquier tamaño de pantalla, ofreciendo una experiencia de usuario óptima. Es un pilar del desarrollo web moderno.
No, no puedes ni debes tener varias etiquetas <body> en una única página HTML válida.
La estructura fundamental de un documento HTML está bien definida:
<html>.<html>, un único elemento <head> (para metadatos, enlaces a CSS, scripts, etc.).<body> que contiene todo el contenido visible de la página (textos, imágenes, enlaces, formularios, etc.).La etiqueta <body> representa el cuerpo principal de tu documento HTML. Tener más de una crearía una estructura ambigua e inválida según los estándares del W3C y WHATWG.
¿Qué pasaría si intentas usar varias?
<body> es impredecible. Podrían ignorar las subsiguientes, intentar fusionar el contenido de formas extrañas, o generar un DOM (Document Object Model) incorrecto.Si sientes la necesidad de tener «múltiples cuerpos», es probable que estés buscando una solución a un problema diferente.
Por ejemplo:
<iframe>. Cada <iframe> tiene su propio contexto de documento, incluyendo su propio <html>, <head> y <body>.<section>, <article>, <aside>, o <div> genéricos, todos ellos dentro del único <body> permitido.La estructura correcta básica de una página HTML es:
<!DOCTYPE <strong>html</strong>>
<html lang="es">
<head>
<meta charset="UTF-F8">
<title>Título de la página</title>
</head>
<body>
<header>...</header>
<main>...</main>
<footer>...</footer>
</body>
</html>
Lenguaje del código: PHP (php)Mantener esta estructura es esencial para un desarrollo web robusto y accesible.
En HTML, puedes crear dos tipos principales de listas para organizar contenido: listas no ordenadas (generalmente mostradas con viñetas) y listas ordenadas (generalmente mostradas con números o letras). En ambos casos, cada elemento individual de la lista se define con la etiqueta <li> (elemento de lista).
1. Listas No Ordenadas (<ul>)
Se utilizan cuando el orden de los elementos no es importante. La etiqueta <ul> (de «unordered list» o lista no ordenada) envuelve todos los elementos.
Por defecto, los navegadores suelen mostrar estas listas con viñetas (puntos).
Ejemplo de lista no ordenada:
<p>Lista de la compra:</p>
<ul>
<li>Leche</li>
<li>Pan</li>
<li>Huevos</li>
<li>Manzanas</li>
</ul>
Lenguaje del código: PHP (php)2. Listas Ordenadas (<ol>)
Se emplean cuando la secuencia o el orden de los elementos sí es relevante, como en instrucciones paso a paso, un ranking, o un esquema numerado. La etiqueta <ol> (de «ordered list» o lista ordenada) es la que los agrupa.
Por defecto, los navegadores numeran estos elementos (1, 2, 3...).
Ejemplo de lista ordenada:
<p>Instrucciones para preparar té:</p>
<ol>
<li>Hervir agua.</li>
<li>Poner la bolsita de té en la taza.</li>
<li>Verter el agua caliente sobre la bolsita.</li>
<li>Dejar reposar de 3 a 5 minutos.</li>
<li>Retirar la bolsita y disfrutar.</li>
</ol>
Lenguaje del código: PHP (php)La etiqueta <ol> tiene atributos útiles como type (para cambiar el tipo de marcador, por ejemplo: type="a" para letras minúsculas, type="I" para números romanos mayúsculos) y start (para iniciar la numeración en un número específico, por ejemplo: start="5").
Recuerda que las etiquetas <li> siempre deben ser hijas directas de una etiqueta <ul> u <ol>.
En HTML, si hablamos de estructurar contenido en formato de lista, existen principalmente tres tipos de listas que cubren la mayoría de las necesidades:
<ul>): Se utilizan cuando el orden de los elementos no es relevante. Cada elemento de la lista se define con la etiqueta <li> y, por defecto, los navegadores suelen mostrarlos con viñetas (puntos). <ul> <li>Manzana</li> <li>Plátano</li> </ul><ol>): Son ideales para secuencias, pasos o cualquier conjunto de elementos donde el orden sí importa. Cada elemento también se define con <li>, y los navegadores los muestran numerados (1, 2, 3...) o con letras, según se configure. <ol> <li>Primer paso</li> <li>Segundo paso</li> </ol><dl>): Se emplean para presentar pares de términos y sus correspondientes descripciones, como en un glosario o para definir metadatos. Utilizan las etiquetas <dt> para el término y <dd> para la descripción. <dl> <dt>HTML</dt> <dd>Lenguaje para estructurar contenido web.</dd> </dl>Además de estas tres, HTML también cuenta con la etiqueta <menu>.
Aunque semánticamente representa una lista, su propósito es más específico: se utiliza para agrupar un conjunto de comandos o acciones interactivas (como los elementos de una barra de herramientas o un menú contextual que aparece al hacer clic derecho). No se usa para listas de contenido general como las tres anteriores.
Las entidades HTML son secuencias especiales de caracteres que actúan como marcadores de posición para:
<) para iniciar una etiqueta, el signo mayor que (>) para cerrarla, y el ampersand (&) para iniciar una entidad. ©), marca registrada (®), varios símbolos monetarios (€, £, ¥), caracteres acentuados específicos (aunque con la codificación UTF-8 esto es menos problemático) o el importante «espacio de no ruptura».Las entidades HTML siempre comienzan con un ampersand (&) y terminan con un punto y coma (;). Existen dos tipos principales:
< para < (menor que)> para > (mayor que)& para & (ampersand)" para " (comillas dobles)' para ' (apóstrofo o comilla simple, aunque a menudo se puede usar directamente) para un espacio de no ruptura (evita que se separen dos palabras al final de una línea)© para © (copyright)® para ® (marca registrada)€ para € (euro)© también es ©.¿Cuándo las uso?
Debes usarlas principalmente cuando necesites mostrar caracteres reservados como texto, o para insertar símbolos específicos y espacios de no ruptura de manera fiable.
<p>Para escribir la etiqueta <body> en tu texto, debes usar entidades.</p>
<p>El precio es de 100 € y está protegido por derechos de autor © Mi Empresa.</p>
Lenguaje del código: PHP (php)El uso de UTF-8 como codificación de caracteres ha reducido la necesidad de usar entidades para muchos caracteres acentuados comunes, pero siguen siendo indispensables para los casos mencionados.
Para mostrar código (HTML, CSS, JavaScript, Python, etc.) directamente en una página HTML de forma que se vea como texto y no sea interpretado por el navegador, tienes un par de herramientas principales y una consideración muy importante:
<code> con una fuente monoespaciada (como Courier o Consolas), que es la convención para visualizar código. <pre> (de «preformatted text» o texto preformateado) es crucial cuando quieres mostrar bloques de código más grandes, ya que conserva los espacios en blanco, tabulaciones y saltos de línea tal como los has escrito en tu archivo HTML. <pre>, el navegador colapsaría múltiples espacios en uno solo y no respetaría los saltos de línea.<code> dentro de una etiqueta <pre>.Consideración crucial: Escapar caracteres HTML
Dentro del código que quieres mostrar, si este contiene caracteres que HTML usa para su propia sintaxis (como <, > o &), debes reemplazarlos por sus entidades HTML correspondientes: < para <, > para >, y & para &.
Si no lo haces, el navegador intentará interpretar ese código como parte de la estructura de tu página, rompiendo la visualización.
Ejemplo de cómo anidar las etiquetas <pre> y <code> para mostrar un bloque de código HTML.
Observa cómo los caracteres especiales de HTML (como <, > y &) dentro del código que se quiere mostrar están «escapados» utilizando sus respectivas entidades HTML (<, >, &):
<!DOCTYPE <strong>html</strong>>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Mostrando Código de Ejemplo</title>
<style>
/* Estilo opcional para el bloque de código */
pre {
background-color: #f4f4f4;
border: 1px solid #ddd;
padding: 10px;
overflow-x: auto; /* Para scroll horizontal si el código es muy largo */
}
code {
font-family: Consolas, "Courier New", monospace;
}
</style>
</head>
<body>
<h1>Ejemplo de Código HTML Anidado</h1>
<p>Aquí abajo se muestra cómo definir un párrafo y un enlace en HTML:</p>
<pre><code class="language-html"><p>Este es un párrafo que contiene un <a href="pagina.html">enlace de ejemplo</a>.</p>
<!-- Esto es un comentario HTML y también se muestra -->
<div>
<span>Más código aquí.</span>
</div></code></pre>
<p>Como puedes ver, el navegador muestra el código tal cual, sin interpretarlo, gracias al uso de <code><pre></code>, <code><code></code> y el escape de caracteres.</p>
</body>
</html>
Lenguaje del código: PHP (php)En este ejemplo:
<pre> asegura que se respeten los espacios en blanco y los saltos de línea del código.<code> indica semánticamente que el contenido es un fragmento de código.< y > se usan para mostrar los < y > literales sin que el navegador los interprete como inicio o fin de una etiqueta HTML.<style> para que el bloque de código se distinga visualmente, lo cual es una práctica común. language-html en la etiqueta <code> es útil si luego quisieras aplicar un resaltador de sintaxis JavaScript.Los encabezados en HTML se utilizan para definir los títulos y subtítulos de tu contenido, estableciendo una jerarquía que ayuda a estructurar la información de la página.
Existen seis niveles de encabezados, que van desde <h1> (el de mayor importancia) hasta <h6> (el de menor importancia).
Cómo crearlos:
Para crear un encabezado, simplemente envuelves el texto del título o subtítulo con la etiqueta de encabezado correspondiente.
<h1>Este es el título principal (nivel 1)</h1>
<h2>Este es un subtítulo (nivel 2)</h2>
<h3>Esto es un sub-subtítulo (nivel 3)</h3>
<h4>Encabezado de nivel 4</h4>
<h5>Encabezado de nivel 5</h5>
<h6>Encabezado de nivel 6 (el menos prominente)</h6>
Lenguaje del código: PHP (php)Cuándo usar cada uno (jerarquía y semántica):
La elección del nivel de encabezado no debe basarse únicamente en el tamaño visual que produce el navegador por defecto (para controlar la apariencia está CSS), sino en la estructura lógica y jerárquica del contenido:
<h1>: Debería usarse para el título principal y más importante de la página. Generalmente, se recomienda usar un solo <h1> por página, representando el tema central.<h2>: Se utiliza para los subtítulos de las secciones principales que se derivan del <h1>.<h3>: Se usa para subdividir las secciones de un <h2>.<h4> bajo <h3>, etc.), manteniendo siempre un orden lógico. Es importante no saltarse niveles (por ejemplo, no ir de un <h2> directamente a un <h4> sin un <h3> intermedio), ya que esto rompe la estructura lógica.¿Por qué es importante usarlos correctamente?
En resumen, usa los encabezados para dar un esquema claro y semántico a tu contenido, no solo para conseguir un efecto visual.
La etiqueta <a> (de «anchor» o ancla) es la que utilizas en HTML para crear hipervínculos, permitiendo la navegación entre páginas web o secciones dentro de una misma página.
Para controlar su comportamiento y significado, dispone de varios atributos importantes:
href (Hypertext Reference): Es el atributo más esencial. <a href="https://www.ejemplo.com">Visita Ejemplo</a><a href="otra_pagina.html">Otra Página</a><a href="#seccion2">Ir a Sección 2</a><a href="mailto:info@ejemplo.com">Enviar correo</a><a href="tel:+34000000000">Llamar ahora</a>target: Indica dónde se abrirá el recurso enlazado. _self: (Valor por defecto) Abre el enlace en la misma ventana o pestaña._blank: Abre el enlace en una nueva ventana o pestaña. <a href="externo.html" target="_blank">Abrir en nueva pestaña</a>_parent, _top o el nombre de un <iframe>.rel (Relationship): Define la relación entre el documento actual y el recurso enlazado. noopener: Se recomienda usarlo con target="_blank" para mejorar la seguridad, impidiendo que la nueva pestaña pueda manipular la pestaña original.noreferrer: Similar a noopener, pero además evita que se envíe la cabecera «Referer» al sitio enlazado.nofollow: Indica a los motores de búsqueda que no sigan este enlace (útil para enlaces pagados o contenido no fiable).external: Señala que el enlace dirige a un sitio externo. HTML<a href="externo.html" target="_blank" rel="noopener noreferrer external">Enlace externo seguro</a>download: Este atributo instruye al navegador para que descargue el recurso vinculado en lugar de navegar a él. <a href="/documentos/informe.pdf" download="Informe_Anual.pdf">Descargar Informe PDF</a>id, class, style, o title.Estos son los atributos principales que te permitirán controlar la mayoría de los aspectos de tus enlaces.
Para insertar saltos de línea y líneas horizontales en tus documentos HTML, dispones de dos etiquetas específicas. Ambas son lo que se conoce como etiquetas «vacías» o «auto-cerradas» en HTML5, lo que significa que no requieren una etiqueta de cierre explícita como </br> (aunque en sintaxis XHTML se escribirían como <br /> o <hr />).
1. Salto de Línea (<br>)
La etiqueta <br> (proveniente de «break» o ruptura) se utiliza para forzar un salto de línea en un punto específico dentro de un bloque de texto, como un párrafo. El texto que sigue a un <br> comenzará en la línea inmediatamente inferior.
Es útil para casos donde la división de líneas es semánticamente importante, como en direcciones postales, poemas o fragmentos de código que deben mantener un formato específico.
Ejemplo de uso de <br>:
<p>Mi dirección es:<br>
Calle Mayor, Número 123<br>
Piso 4, Puerta A<br>
28001, Madrid</p>
<p>El poema dice así:<br>
En un lugar de la Mancha,<br>
de cuyo nombre no quiero acordarme...</p>
Lenguaje del código: HTML, XML (xml)Importante: No deberías usar múltiples etiquetas <br> seguidas para crear espacio vertical entre párrafos u otros elementos. Para eso, es mucho más apropiado y semántico utilizar propiedades de CSS como margin o padding.
2. Línea Horizontal (<hr>)
La etiqueta <hr> (proveniente de «horizontal rule» o regla horizontal) se utiliza para representar una ruptura temática o una separación entre párrafos o secciones de contenido a nivel de bloque. Visualmente, los navegadores la renderizan por defecto como una línea horizontal que ocupa el ancho disponible.
En HTML5, <hr> tiene un significado semántico; no es simplemente una línea decorativa. Indica un cambio de tema o una transición dentro del flujo del contenido.
Ejemplo de uso de <hr>:
<h2>Capítulo 1: El Comienzo</h2>
<p>Este capítulo introduce los personajes principales y el escenario donde se desarrollará la historia inicial.</p>
<hr>
<h2>Capítulo 2: El Conflicto</h2>
<p>Aquí, la trama se complica y surgen los primeros desafíos para nuestros protagonistas.</p>
Lenguaje del código: HTML, XML (xml)Si quieres modificar la apariencia de la línea (grosor, color, estilo), puedes hacerlo utilizando CSS.
La etiqueta <blockquote> en HTML se utiliza para marcar un bloque de texto que ha sido citado textualmente desde otra fuente. Es decir, se usa para representar contenido que es una cita extensa, como un párrafo completo o varios párrafos extraídos de un libro, un artículo, un discurso, otra página web, etc.
La principal función de <blockquote> es semántica: indica claramente que el texto encerrado no es original del autor de la página, sino una reproducción de palabras ajenas.
Por defecto, los navegadores suelen aplicar un cierto margen o sangría al contenido dentro de un <blockquote> para distinguirlo visualmente, aunque este estilo se puede personalizar completamente con CSS.
Para atribuir la fuente de la cita, tienes principalmente dos formas:
cite en la etiqueta <blockquote>:cite a la propia etiqueta <blockquote>, y su valor debería ser una URL que apunte al documento o recurso original de donde se extrajo la cita. <blockquote cite="https://www.fuente-del-articulo.com/pagina-ejemplo"> <p>Esta es una cita larga e interesante que he tomado de otra página web para ilustrar un punto importante en mi contenido.</p> </blockquote><footer> y/o <cite> para atribución visible:<footer> después (o a veces dentro, al final) del <blockquote>. <cite> se utiliza específicamente para referenciar el título de una obra (como un libro, una película, un poema, etc.), no para el nombre de una persona.<blockquote> <p>El comienzo es la parte más importante de la obra.</p> </blockquote> <footer>— Platón, <cite>La República</cite></footer>Importante: No debes usar <blockquote> simplemente para conseguir un efecto de sangría en el texto. Su propósito es estrictamente para citas. Para citas más cortas que van integradas dentro de un párrafo, se utiliza la etiqueta <q>.
La etiqueta <q> (del inglés «quote» o cita) se utiliza en HTML para marcar citas cortas que se integran directamente en línea dentro de un párrafo o una frase.
Se diferencia de la etiqueta <blockquote>, que está pensada para citas más largas que constituyen un bloque de texto independiente.
El propósito principal de la etiqueta <q> es indicar semánticamente que el texto que encierra es una cita breve extraída de otra fuente.
Una característica importante y muy útil de la etiqueta <q> es que los navegadores web suelen añadir automáticamente las comillas apropiadas (por ejemplo, comillas dobles “ ”, comillas simples ‘ ’, o comillas angulares « ») alrededor del contenido citado.
El tipo exacto de comillas puede depender del idioma de la página (especificado por el atributo lang en la etiqueta <html> o en un elemento padre) y de la configuración del navegador o los estilos CSS aplicados. Esto significa que, al usar <q>, no necesitas escribir tú mismo las comillas en el código HTML.
Al igual que <blockquote>, la etiqueta <q> también puede llevar un atributo cite, cuyo valor debería ser una URL que apunte al documento o recurso original de donde se tomó la cita. Esta URL no se muestra visiblemente al usuario por defecto.
Cómo usarla:
Simplemente envuelves la cita corta con las etiquetas <q> y </q>.
Ejemplos:
<p>Mi madre siempre decía: <q>A quien madruga, Dios le ayuda</q>. Y cuánta razón tenía.</p>
<p>El artículo mencionaba que el descubrimiento fue <q cite="http://www.ejemplo.com/articulo-ciencia">un hito inesperado para la comunidad científica</q>.</p>
<p>Cuando le pregunté, él simplemente respondió <q>no lo sé</q> y se encogió de hombros.</p>
Lenguaje del código: PHP (php)En resumen, usa <q> para fragmentos cortos de texto citados que fluyen naturalmente dentro de tu contenido, y deja que el navegador se encargue de las comillas. Para citas más extensas, recuerda usar <blockquote>.
El HTML semántico se refiere a la práctica de utilizar las etiquetas HTML de acuerdo con el significado o propósito del contenido que encierran, en lugar de basar la elección de la etiqueta únicamente en cómo se va a ver visualmente en el navegador.
Se trata de elegir el elemento HTML que describe con mayor precisión la naturaleza de la información que contiene.
Por ejemplo, en lugar de usar etiquetas genéricas como <div> para todo y depender de clases para darles sentido (como <div class="articulo-noticias">), el HTML semántico te anima a usar etiquetas más descriptivas introducidas en HTML5, como <article>, <section>, <nav>, <header>, <footer>, <main>, <aside>, <figure>, etc.
Ejemplo:
<div id="cabecera"> <div class="logo">Mi Empresa</div> <div class="menu-principal">...</div></div> <div class="contenido-principal"> <div class="noticia">...</div> </div> <div id="pie-pagina">...</div><header> <div class="logo">Mi Empresa</div> <nav>...</nav> </header> <main> <article>...</article> </main> <footer>...</footer>Beneficios clave del HTML semántico:
La regla general es: prioriza siempre el uso de una etiqueta semántica si existe una que describa adecuadamente el propósito de tu contenido.
Cuándo usar etiquetas semánticas:
Debes optar por etiquetas semánticas (como <article>, <section>, <nav>, <aside>, <header>, <footer>, <main>, <figure>, <figcaption>, <time>, etc.) siempre que el bloque de contenido que estás creando tenga un significado estructural o un propósito claro en el documento.
<article>: Para contenido independiente y auto-contenido (un post de blog, un comentario, un widget).<section>: Para agrupar contenido temáticamente relacionado.<nav>: Para bloques de enlaces de navegación principales.<aside>: Para contenido tangencialmente relacionado con el contenido principal (barras laterales, llamadas).<header> y <footer>: Para las cabeceras y pies de página de un documento o de una sección.<main>: Para el contenido principal o central del documento.<article>
<header>
<h2>Título de mi Artículo</h2>
<p>Publicado el <time datetime="2025-05-28">28 de mayo de 2025</time></p>
</header>
<p>Este es el contenido principal del artículo...</p>
<footer>
<p>Autor: HTML Moderno</p>
</footer>
</article>
Lenguaje del código: PHP (php)Cuándo usar <div>:
El <div> es un contenedor genérico de bloque sin ningún significado semántico inherente. Su uso es apropiado en las siguientes situaciones:
<div class="contenedor-tarjetas">
<article class="tarjeta">...</article>
<article class="tarjeta">...</article>
</div>
Lenguaje del código: PHP (php)La idea es evitar la «divitis» (el uso excesivo de <div>s donde podrían usarse etiquetas semánticas). Para agrupaciones genéricas que son en línea (dentro de un párrafo, por ejemplo) en lugar de en bloque, la etiqueta equivalente sin semántica es <span>.
La etiqueta <main> en HTML se utiliza para definir el contenido principal o dominante del <body> de un documento.
El contenido que se encuentra dentro del elemento <main> debería ser único para esa página en particular y no debería incluirse en otras secciones que se repiten a lo largo de múltiples páginas de un sitio, como pueden ser las barras de navegación, los logotipos del sitio, las cabeceras y pies de página generales, o las barras laterales.
El propósito fundamental de <main> es semántico: ayuda a las tecnologías de asistencia (como los lectores de pantalla para personas con discapacidad visual) y a los motores de búsqueda a identificar y acceder directamente al bloque de contenido más importante de la página, distinguiéndolo claramente de otros elementos estructurales como <header>, <footer>, <nav> o <aside>. Esto mejora significativamente la accesibilidad y puede contribuir al SEO.
¿Cuántas etiquetas <main> puede haber por página?
Según el estándar HTML actual (mantenido por el WHATWG), no debe haber más de un elemento <main> visible en un documento. Esto significa que, para la gran mayoría de las páginas web, utilizarás una única etiqueta <main>.
Es técnicamente posible tener múltiples elementos <main> en un mismo documento si todos, excepto uno, están ocultos utilizando el atributo hidden. Este caso podría darse en algunas aplicaciones de página única (SPA) donde diferentes vistas principales se muestran u ocultan dinámicamente. Sin embargo, la regla general y la práctica más común es tener solo un <main> activo y visible.
Además, es importante destacar que el elemento <main> no debe ser descendiente de elementos como <article>, <aside>, <footer>, <header> o <nav>.
Ejemplo de uso típico:
<!DOCTYPE <strong>html</strong>>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Página con Contenido Principal</title>
</head>
<body>
<header>
<h1>Logo y Título del Sitio</h1>
<nav>
</nav>
</header>
<main>
<h2>El Contenido Principal de Esta Página</h2>
<p>Aquí va toda la información central y única de esta vista específica del sitio web...</p>
<article>
<h3>Un artículo dentro del contenido principal</h3>
<p>Más detalles...</p>
</article>
</main>
<footer>
<p>© 2025 - Información de copyright y otros enlaces.</p>
</footer>
</body>
</html>
Lenguaje del código: PHP (php)Usar <main> correctamente es un paso importante hacia una web más semántica y accesible.
Tanto <article> como <section> son etiquetas semánticas de HTML5 para estructurar el contenido de tu página, pero sirven para propósitos ligeramente diferentes.
<article> (Artículo)
<article> como algo que tendría sentido por sí mismo si lo extrajeras de la página actual y lo leyeras en otro contexto (por ejemplo, sindicado en un lector de noticias RSS).<article> tendrá su propia cabecera (<header>) y/o pie de página (<footer>).<section> (Sección)
<article>, el contenido de una <section> no necesariamente es auto-contenido o independientemente distribuible; su significado a menudo depende del contexto que la rodea.<section> tenga un encabezado (<code><h1></code>-<code><h6></code>) que identifique su tema, lo cual es importante para la accesibilidad y el esquema del documento.Diferencia principal y cuándo usar cada una:
La diferencia fundamental radica en la autonomía del contenido:
<article> si el contenido es una pieza independiente que podría existir por sí sola.<section> para agrupar contenido temáticamente relacionado que forma parte de un todo mayor. Una <section> puede no tener mucho sentido si se saca de su contexto.Anidación:
<article> puede estar dividido en varias <section>s internas. (Ej: un post de blog (<article>) con secciones para «Introducción», «Desarrollo», «Conclusión»).<section> puede contener varios <article>s. (Ej: una sección de «Últimas Noticias» (<section>) que agrupa varios artículos individuales (<article>)).Ejemplo combinado:
<body>
<header>...</header>
<nav>...</nav>
<main>
<h1>Mi Blog de Viajes</h1>
<section> <h2>Posts Recientes</h2>
<article> <h3>Un Viaje a las Montañas</h3>
<p>Descripción breve del viaje...</p>
<a href="viaje-montanas.html">Leer más</a>
</article>
<article> <h3>Explorando la Costa</h3>
<p>Aventuras en la playa...</p>
<a href="explorando-costa.html">Leer más</a>
</article>
</section>
<aside>...</aside>
</main>
<footer>...</footer>
</body>
Lenguaje del código: PHP (php)En resumen: si el contenido puede «vivir por sí solo», probablemente sea un <article>. Si estás agrupando partes de contenido bajo un tema común dentro de un contexto mayor, es una <section>.
La etiqueta <aside> en HTML se utiliza para marcar contenido que está relacionado tangencialmente con el contenido principal que lo rodea, pero que podría considerarse como algo separado o «al margen» de dicho contenido principal. Es información que complementa el flujo principal, pero no es esencial para su comprensión.
Piensa en el contenido de un <aside> como notas al margen, información adicional, o secciones que, aunque relacionadas, podrían leerse de forma independiente o incluso omitirse sin que el entendimiento del contenido principal se vea afectado drásticamente.
Tipos de contenido que suelen ir en una etiqueta <aside>:
<aside> está dentro de un <article> específico).Ejemplo de uso común (como una barra lateral):
<!DOCTYPE <strong>html</strong>>
<html lang="es">
<head>
<title>Artículo con Barra Lateral</title>
<style>
/* Estilos básicos para demostración */
body { display: flex; }
main { flex: 3; margin-right: 20px; }
aside { flex: 1; border-left: 1px solid #ccc; padding-left: 15px; }
</style>
</head>
<body>
<header><h1>Mi Sitio de Noticias</h1></header>
<main>
<article>
<h2>Avances en la Inteligencia Artificial</h2>
<p>El campo de la IA ha visto progresos significativos este año...</p>
<p>Más contenido del artículo principal aquí...</p>
</article>
</main>
<aside>
<h3>Artículos Relacionados</h3>
<ul>
<li><a href="#">El futuro del aprendizaje automático</a></li>
<li><a href="#">Ética en la IA</a></li>
</ul>
<h3>Glosario</h3>
<dl>
<dt>IA</dt>
<dd>Inteligencia Artificial.</dd>
</dl>
</aside>
<footer><p>© 2025 Mi Sitio</p></footer>
</body>
</html>
Lenguaje del código: PHP (php)Es importante recordar que el contenido de un <aside> debe estar relacionado con el contenido que lo rodea.
Si el <aside> está dentro de un <article>, su contenido debe estar relacionado con ese artículo.
Si está fuera de cualquier <article> pero dentro de <main>, se relaciona con el contenido principal de la página.
La presentación visual (si aparece a un lado, arriba, abajo, etc.) se controla con CSS.
La etiqueta <nav> en HTML5 se utiliza para definir una sección de una página cuyo propósito principal es proporcionar enlaces de navegación. Estos pueden ser enlaces a otras páginas dentro del mismo sitio web o a diferentes secciones dentro de la página actual.
El uso de <nav> es semántico, lo que significa que ayuda a los navegadores, a las tecnologías de asistencia (como los lectores de pantalla) y a los motores de búsqueda a comprender que esa parte de la página está dedicada a la navegación.
Esto es especialmente útil para la accesibilidad, ya que los usuarios de lectores de pantalla pueden, por ejemplo, saltar directamente a los bloques de navegación o evitarlos si así lo desean.
¿Qué tipo de contenido suele ir dentro de una etiqueta <nav>?
Es una práctica común y recomendable estructurar los enlaces de navegación dentro de un elemento <nav> utilizando una lista no ordenada (<ul>), donde cada elemento de la lista (<li>) contiene un enlace (<a>).
Ejemplo de un menú de navegación principal:
<nav aria-labelledby="menu-principal-titulo">
<h2 id="menu-principal-titulo" class="sr-only">Navegación Principal</h2> <ul>
<li><a href="/">Inicio</a></li>
<li><a href="/productos.html">Productos</a></li>
<li><a href="/acerca-de.html">Sobre Nosotros</a></li>
<li><a href="/contacto.html">Contacto</a></li>
</ul>
</nav>
Lenguaje del código: PHP (php)En el ejemplo anterior, se incluye un <h2> (que podría estar visualmente oculto con CSS usando una clase como sr-only o «screen-reader-only») referenciado por aria-labelledby para dar un nombre accesible al bloque de navegación, lo cual es una buena práctica, especialmente si tienes múltiples elementos <nav> en la misma página.
Importante: No todos los grupos de enlaces de una página deben estar dentro de una etiqueta <nav>.
Por ejemplo, una simple lista de enlaces a redes sociales en el pie de página, o enlaces dentro del contenido de un <footer> (como «Términos y Condiciones» o «Política de Privacidad») no necesariamente requieren estar envueltos en <nav>, a menos que constituyan bloques de navegación primarios o muy significativos para la estructura del sitio.
Utiliza <nav> para las secciones de navegación más importantes. Un documento puede tener varios elementos <nav>.
Las etiquetas <header> y <footer> en HTML5 se utilizan para definir, respectivamente, la cabecera y el pie de su contexto semántico más cercano.
Este contexto puede ser toda la página (el <body>) o una sección específica dentro de ella, como un <article>, una <section>, un <aside> o un <nav>.
Son elementos semánticos que ayudan a definir la estructura de una página y de sus secciones internas, como <article> o <section>.
Su función depende del contexto en el que se encuentren.
No están limitadas a aparecer solo una vez en la parte superior e inferior de la página.
<header> (Cabecera):
<body> o no está dentro de otra sección de contenido principal): Típicamente contiene el logotipo del sitio, el título principal de la página (a menudo un <h1>), el menú de navegación principal (<nav>), un formulario de búsqueda, etc.<article>, <section>, etc.): Sirve como cabecera para esa sección específica. Puede contener el título de la sección (un <h2> - <h6>), información sobre el autor, fecha de publicación, una tabla de contenidos para esa sección, etc.<footer> (Pie de página):
Ejemplo de uso:
<body>
<header> <img src="logo.png" alt="Logo del Sitio">
<nav> <ul>...</ul>
</nav>
</header>
<main>
<article>
<header> <h2>Título de Este Artículo</h2>
<p>Publicado por: Juan Pérez el <time datetime="2025-05-28">28 de mayo de 2025</time></p>
</header>
<p>Contenido del artículo...</p>
<section>
<h3>Subsección del Artículo</h3>
<p>Más detalles...</p>
</section>
<footer> <p>Etiquetas: <a href="#">HTML</a>, <a href="#">Semántica</a></p>
</footer>
</article>
</main>
<footer> <p>© 2025 Mi Sitio Web. Todos los derechos reservados.</p>
<p><a href="/contacto.html">Contacto</a></p>
</footer>
</body>
</html>
Lenguaje del código: PHP (php)Puedes y debes usar múltiples etiquetas <header> y <footer> en un mismo documento HTML, cada una aplicando a su sección contenedora para mejorar la estructura y semántica de tu página.
Las etiquetas <figure> y <figcaption> en HTML5 trabajan juntas para marcar semánticamente contenido auto-contenido, como ilustraciones, diagramas, fotografías, fragmentos de código, citas extensas, etc., junto con su correspondiente leyenda o título.
<figure>
<figure> se utiliza para encapsular cualquier contenido que se considera una unidad independiente y que se referencia desde el flujo principal del documento, pero cuya posición exacta no es crítica para la comprensión de dicho flujo. <figure> a otra parte de la página (como un apéndice) o incluso lo eliminaras, el flujo principal del texto debería seguir teniendo sentido.<img>), gráficos (SVG, <canvas>), bloques de código (<pre><code>), diagramas, audio (<audio>), vídeo (<video>), o incluso texto como poemas o citas. <figure> puede contener varios elementos si todos forman parte de la misma unidad lógica descrita por la leyenda.<figcaption>
<figcaption> proporciona un título, leyenda o descripción para el contenido de su elemento <figure> padre. Es el texto que explica o da contexto a la figura.<figure> que la contiene.<figure> puede tener como máximo una etiqueta <figcaption>.<figure> puede existir sin <figcaption>), su uso es altamente recomendado porque mejora significativamente la accesibilidad (las tecnologías de asistencia pueden asociar la descripción con la figura) y la comprensión del contenido.¿Cómo y cuándo usarlas juntas?
Se utilizan cuando tienes un bloque de contenido (como una imagen, un diagrama, un ejemplo de código) que quieres acompañar de una descripción o título que esté semánticamente ligado a él.
Beneficios:
<figure> está pensado para ser auto-contenido, lo que teóricamente facilita su redistribución (por ejemplo, en un feed).Ejemplo:
<article>
<h2>Los Planetas del Sistema Solar Interior</h2>
<p>Los planetas interiores son Mercurio, Venus, Tierra y Marte. Son los más cercanos al Sol y son principalmente rocosos.</p>
<figure>
<img src="planetas_rocosos.jpg" alt="Comparación de tamaño de Mercurio, Venus, Tierra y Marte.">
<img src="orbita_tierra.jpg" alt="Órbita de la Tierra alrededor del Sol.">
<figcaption>
Figura 1: Representación de los planetas rocosos del Sistema Solar y la órbita terrestre. (Nótese que un figure puede contener múltiples imágenes bajo una sola leyenda).
</figcaption>
</figure>
<p>La Tierra es el único planeta conocido con vida...</p>
<h3>Ejemplo de Código para Calcular Distancia</h3>
<figure>
<pre><code>// Pseudocódigo para distancia orbital
function calcularDistancia(planetaA, planetaB) {
let dA = planetaA.distanciaSol;
let dB = planetaB.distanciaSol;
return Math.abs(dA - dB);
}</code></pre>
<figcaption>
Listado 1: Ejemplo de pseudocódigo para una función simple.
</figcaption>
</figure>
</article>
Lenguaje del código: PHP (php)En estos ejemplos, tanto las imágenes como el bloque de código se presentan como figuras con sus respectivas leyendas, clarificando su papel dentro del contenido.
Las etiquetas <details> y <summary> en HTML5 trabajan juntas para crear un widget de revelación nativo, a menudo conocido como un «acordeón» o «desplegable».
Este componente permite al usuario mostrar u ocultar interactivamente un bloque de información adicional con un simple clic, y lo mejor es que esta funcionalidad básica se consigue sin necesidad de escribir JavaScript.
<details>
<summary>) como el contenido detallado que se puede mostrar u ocultar.<details> (a excepción del <summary>) está oculto.open: HTML<details open> </details><summary>
<details>.<summary> dentro de un <details>, el navegador generalmente mostrará un texto predeterminado como «Detalles» (o «Details» en inglés) como etiqueta clicable.¿Cómo funcionan en conjunto?
La etiqueta <summary> actúa como la «palanca» del widget. El texto dentro de <summary> es siempre visible. Al hacer clic en el <summary>, se alterna la visibilidad del resto del contenido que se encuentra dentro del elemento <details> (es decir, todo el contenido que sigue a la etiqueta <summary> dentro de <details>).
Beneficios y Casos de Uso Comunes:
<summary> y la respuesta el contenido desplegable.Ejemplo de uso:
<h2>Preguntas frecuentes sobre nuestro producto</h2>
<details>
<summary>¿Cuáles son los requisitos del sistema?</summary>
<p>Para utilizar nuestro producto, necesitas un sistema operativo Windows 10 o superior, macOS 11 (Big Sur) o posterior, o una distribución de Linux compatible. Se recomiendan al menos 8GB de RAM.</p>
</details>
<details>
<summary>¿Ofrecen un período de prueba gratuito?</summary>
<p>Sí, ofrecemos un período de prueba completamente funcional de 14 días. No se requiere tarjeta de crédito para iniciar la prueba.</p>
<p>Puedes <a href="/prueba-gratuita">descargarlo aquí</a>.</p>
</details>
<details open> <summary>¿Cómo contacto con el soporte técnico?</summary>
<p>Puedes contactar con nuestro equipo de soporte técnico a través de:</p>
<ul>
<li>Correo electrónico: soporte@empresa.com</li>
<li>Teléfono: +34 900 123 456</li>
<li>Chat en vivo en nuestro sitio web (de 9:00 a 18:00 CET).</li>
</ul>
</details>
Lenguaje del código: PHP (php)Este par de etiquetas ofrece una manera muy eficiente y semántica de gestionar la visibilidad del contenido de forma interactiva.
Estructurar una página web compleja con HTML semántico implica utilizar las etiquetas de HTML5 de manera que describan con precisión el significado y la organización del contenido, en lugar de basarse solo en su apariencia visual. Esto mejora la accesibilidad, el SEO y la mantenibilidad del código.
1. Define los hitos principales de la página (Landmarks):
Toda página suele tener una estructura global común. Identifícala primero:
<header> (Cabecera global del sitio): Utiliza esta etiqueta para la parte superior de tu página. Normalmente contiene el logo del sitio, el nombre o título principal del sitio (a menudo un <h1>), la navegación principal (<nav>), y quizás un formulario de búsqueda.<nav> (Navegación principal): Define el bloque principal de enlaces de navegación del sitio. Puede estar dentro del <header> global o ser un elemento separado.<main> (Contenido principal): Esta etiqueta es crucial y debe envolver el contenido central y único de la página específica que estás construyendo. Todo lo que no sea repetitivo (cabeceras, pies, navegación común) debería ir aquí. Solo debe haber un elemento <main> visible por página.<footer> (Pie de página global del sitio): Para la parte inferior de la página. Usualmente contiene información de copyright, enlaces a políticas de privacidad, términos de servicio, información de contacto o enlaces secundarios del sitio.2. Estructura el contenido dentro de <main>:
Una vez definidos los hitos globales, enfócate en el contenido principal dentro de <main>:
<article>: Utiliza esta etiqueta para cada pieza de contenido que sea auto-contenida, completa e independientemente distribuible. <article> puede, a su vez, tener su propio <header> y <footer> internos.<section>: Emplea <section> para agrupar contenido que está temáticamente relacionado, ya sea dentro de <main> directamente o dentro de un <article>. <section> debería, idealmente, tener un encabezado (<h2>) que identifique su tema. <section> no es tan independiente como un <article>.<aside>: Reserva esta etiqueta para contenido que está relacionado tangencialmente con el contenido principal que lo rodea. 3. Utiliza una jerarquía de encabezados lógica (<h1> - <h6>):
Los encabezados son vitales para la estructura del documento y la accesibilidad.
<h1> por página, generalmente para el título más importante (ya sea el nombre del sitio en el <header> global o el título único de la página dentro de <main>).<h2> para las secciones principales, <h3> para subsecciones de los <h2>, y así sucesivamente, sin saltarte niveles. Esto crea un esquema del documento claro.4. Aplica otras etiquetas semánticas donde corresponda:
No olvides usar otras etiquetas semánticas para refinar aún más tu estructura:
<figure> y <figcaption> para imágenes, diagramas o fragmentos de código que necesitan una leyenda.<ul>, <ol>, <dl> para diferentes tipos de listas.<blockquote> y <q> para citas.<time> para representar fechas y horas.<address> para información de contacto.5. Piensa en el significado, no solo en la apariencia:
La pregunta clave al elegir una etiqueta debe ser: «¿Qué etiqueta describe mejor el propósito de este contenido?». La apariencia visual se controla con CSS.
Ejemplo conceptual de estructura:
<!DOCTYPE <strong>html</strong>>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Página Compleja Semántica</title>
</head>
<body>
<header> <a href="/" id="logo">NombreDelSitio</a>
<nav> <ul>
<li><a href="/">Inicio</a></li>
<li><a href="/blog">Blog</a></li>
<li><a href="/contacto">Contacto</a></li>
</ul>
</nav>
</header>
<main>
<h1>Título Principal de Esta Página Única</h1>
<section id="novedades">
<h2>Últimas Novedades</h2>
<article>
<header>
<h3>Gran Noticia de Hoy</h3>
<p>Publicado: <time datetime="2025-05-28">28 de mayo de 2025</time></p>
</header>
<p>Este es el resumen de la gran noticia...</p>
<a href="/noticias/gran-noticia">Leer más</a>
<footer>
<p>Categoría: Actualidad</p>
</footer>
</article>
</section>
<section id="sobre-nosotros">
<h2>Sobre Nosotros</h2>
<p>Información sobre la empresa o proyecto...</p>
<figure>
<img src="equipo.jpg" alt="Foto del equipo">
<figcaption>Nuestro dedicado equipo.</figcaption>
</figure>
</section>
<aside>
<h3>Enlaces de Interés</h3>
<ul>
<li><a href="#">Recurso Externo 1</a></li>
<li><a href="#">Otro Sitio Relacionado</a></li>
</ul>
</aside>
</main>
<footer> <address>
Contacto: info@nombredelsitio.com
</address>
<p>© 2025 NombreDelSitio. Todos los derechos reservados.</p>
</footer>
</body>
</html>
Lenguaje del código: PHP (php)Para páginas muy complejas, puede ser útil dibujar un esquema o «wireframe» de la estructura antes de escribir el código.
Recuerda usar <div> y <span> con moderación, principalmente para fines de agrupación estilística o para «hooks» de JavaScript cuando ninguna etiqueta semántica más específica sea apropiada.
La etiqueta <time> en HTML5 se utiliza para representar semánticamente una fecha específica en el calendario, una hora del día, o ambas cosas. Su principal ventaja es que permite que esta información temporal sea comprensible tanto para los seres humanos (a través del contenido visible de la etiqueta) como para las máquinas (navegadores, motores de búsqueda, lectores de pantalla, etc.), gracias al atributo datetime.
Función principal:
El propósito de <time> es dotar de significado semántico a las fechas y horas dentro de tu contenido. Esto puede ser aprovechado por los navegadores para ofrecer funcionalidades adicionales (como añadir un evento al calendario del usuario), por los motores de búsqueda para indexar contenido temporalmente relevante de forma más precisa, o por tecnologías de asistencia para interpretar y anunciar correctamente las fechas y horas.
El atributo datetime:
Este es el atributo más importante de la etiqueta <time>. Su valor debe ser una fecha y/o hora en un formato estandarizado y válido que las máquinas puedan procesar sin ambigüedad. El contenido textual dentro de las etiquetas <time>...</time> es lo que el usuario ve, y puede ser más informal o localizado.
Algunos formatos comunes para el atributo datetime incluyen:
YYYY-MM-DD (ejemplo: 2025-05-28)YYYY-MM (ejemplo: 2025-05)YYYY (ejemplo: 2025)YYYY-Www (ejemplo: 2025-W22 para la semana 22 del 2025)hh:mm o hh:mm:ss (ejemplo: 14:30 o 14:30:15)Z indica UTC):YYYY-MM-DDThh:mm (ejemplo: 2025-05-28T14:30)YYYY-MM-DDThh:mm:ss (ejemplo: 2025-05-28T14:30:15)YYYY-MM-DDThh:mm:ssZ (ejemplo: 2025-05-28T14:30:15Z)YYYY-MM-DDThh:mm:ss±hh:mm (ejemplo: 2025-05-28T14:30:15+02:00 para UTC+2)PT2H30M para 2 horas y 30 minutos), aunque este uso es menos común en la práctica diaria para muchos desarrolladores.¿Cuándo y cómo usar la etiqueta <time>?
Debes usar <time> siempre que menciones una fecha o una hora específica que tenga relevancia para el contenido:
Ejemplos:
<p>Este artículo fue publicado el <time datetime="2025-05-28">28 de mayo de 2025</time>.</p>
<p>Nuestra conferencia anual se celebrará el <time datetime="2025-10-15">15 de octubre</time>.</p>
<p>La oferta especial termina <time datetime="2025-06-01T23:59:59Z">mañana a medianoche (UTC)</time>.</p>
<p>Nos vemos a las <time datetime="19:00">siete de la tarde</time> para cenar.</p>
<p>El evento duró <time datetime="PT3H15M">3 horas y 15 minutos</time>.</p>
Lenguaje del código: PHP (php)Al usar la etiqueta <time> con el atributo datetime correctamente, enriqueces la semántica de tu página y facilitas que tanto usuarios como software puedan interactuar de forma más inteligente con la información temporal que proporcionas.
Sí, la jerarquía de encabezados (es decir, el uso correcto y ordenado de las etiquetas <h1>, <h2>, <h3>, <h4>, <h5> y <h6>) es extremadamente importante para la semántica de un documento HTML y también tiene un impacto significativo en la accesibilidad y el SEO.
Los encabezados no son simplemente una forma de hacer que el texto se vea más grande o en negrita; su propósito fundamental es definir la estructura y el esquema del contenido de tu página. Piensa en ellos como los títulos y subtítulos de un libro o un informe bien organizado:
<h1>: Debería representar el título principal y más importante de la página. Generalmente, se recomienda tener un solo <h1> por página, que encapsule el tema central del documento. Dentro de elementos de seccionamiento como <article> o <section>, el encabezado principal de esa sección también puede ser un <h1> si el contenido es auto-contenido, aunque es más común que dentro de <main>, las secciones principales usen <h2>.<h2>: Se utilizan para los títulos de las secciones principales que son directamente subordinadas al tema del <h1>.<h3>: Se usan para los títulos de las subsecciones que están dentro de un <h2>.<h6>. La clave es mantener un orden lógico y descendente, sin saltarse niveles (por ejemplo, no deberías pasar de un <h2> directamente a un <h4> sin tener un <h3> entre ellos).¿Por qué es tan importante esta jerarquía?
Prácticas Recomendadas:
<h1>.<h3> debe estar precedido por un <h2> en su sección padre).Ejemplo de estructura correcta vs. incorrecta:
<body>
<h1>Título Principal de la Página</h1>
<section>
<h2>Sección Importante 1</h2>
<p>Contenido de la sección 1...</p>
<h3>Subsección 1.1</h3>
<p>Detalles de la subsección 1.1...</p>
</section>
<section>
<h2>Sección Importante 2</h2>
<p>Contenido de la sección 2...</p>
</section>
</body>
<body>
<h1>Título Principal de la Página</h1>
<section>
<h4>Esto es incorrecto: un H4 después de un H1</h4>
<p>Contenido...</p>
</section>
</body>
Lenguaje del código: PHP (php)En conclusión, una jerarquía de encabezados bien implementada es un pilar fundamental de un documento HTML semántico, accesible y bien estructurado.
Aunque no existe una única herramienta que te diga «esta página es 100 % semánticamente perfecta» (ya que la semántica también depende mucho del contexto y la intención del contenido), sí dispones de varias herramientas y enfoques que te ayudan enormemente a verificar y mejorar la semántica de tu HTML:
<article> donde semánticamente correspondía, sí pueden detectar usos incorrectos de etiquetas que tienen implicaciones semánticas.<h1>-<h6>), el uso de puntos de referencia (landmarks) como <main>, <nav>, <aside>, la correcta asociación de etiquetas en formularios, el texto alternativo en imágenes, y el uso de ARIA donde sea necesario (y donde no se suple con HTML semántico).Te recomiendo un enfoque combinado:
Al integrar estas prácticas en tu flujo de trabajo, mejorarás significativamente la calidad semántica de tus páginas web.
Directamente, el uso de HTML semántico no mejora el rendimiento de carga o ejecución de tu sitio web de forma significativa en términos de velocidad pura, como lo harían la optimización de imágenes, la minificación de código o una buena gestión de la caché. Un <nav> no se renderiza más rápido que un <div> con una clase .nav.
Los principales beneficios del HTML semántico son:
¿Existen beneficios indirectos o correlaciones con el rendimiento?
<div> anidados solo para estilos (conocido como «divitis»). Sin embargo, el impacto en el tamaño total de la página suele ser mínimo.Para mejorar el rendimiento tangible de tu sitio web, debes centrarte en otras técnicas:
En resumen, adopta el HTML semántico por sus enormes ventajas en accesibilidad, SEO y mantenibilidad, que son cruciales para un sitio web de calidad. Para la velocidad pura, necesitarás aplicar otras estrategias de optimización del rendimiento.
Además de <em> y <strong>, HTML5 ofrece una amplia gama de etiquetas semánticas diseñadas para describir con precisión el significado de diferentes partes de tu contenido. Usar la etiqueta correcta para el propósito adecuado es clave. Aquí tienes algunas de las más importantes:
Para estructurar la página:
<header>: Representa el encabezado de una sección o de la página. Suele contener logotipos, el título principal, menús de navegación.<footer>: Representa el pie de una sección o de la página. Comúnmente incluye información de copyright, enlaces a términos y condiciones, datos de contacto.<nav>: Define una sección con enlaces de navegación principales, ya sea dentro de la página o hacia otras páginas.<main>: Especifica el contenido principal o central del documento. Solo debería haber un <main> por página y no debería estar anidado dentro de <article>, <aside>, <footer>, <header> o <nav>.<article>: Representa una composición autocontenida en un documento, página, aplicación o sitio, que es distribuible o reutilizable de forma independiente (ej. una entrada de blog, un artículo de noticias, un comentario de foro).<section>: Define una sección genérica de un documento o aplicación. Es un agrupador temático de contenido, típicamente con un encabezado.<aside>: Contenido que está tangencialmente relacionado con el contenido principal que lo rodea (como una barra lateral, «pull quotes» o grupos de anuncios).Para texto y contenido específico:
<figure> y <figcaption>: <figure> se usa para contenido independiente (diagramas, ilustraciones, fotos, listados de código) y <figcaption> proporciona un título o leyenda para ese <figure>.<blockquote> y <cite>: <blockquote> para indicar una cita extensa de otra fuente. <cite> se usa para referenciar el título de una obra creativa (libro, película, poema) o el origen de la cita.<time>: Para representar fechas, horas o duraciones. Puede incluir el atributo datetime con un formato legible por máquinas.<address>: Proporciona información de contacto para el <article> o <body> más cercano.<mark>: Representa texto marcado o resaltado por su relevancia en un contexto particular (como resultados de búsqueda).<abbr>: Para abreviaturas o acrónimos, usando el atributo title para la expansión completa.Para listas:
<ul>: Lista no ordenada.<ol>: Lista ordenada.<li>: Elemento de lista.<dl>, <dt>, <dd>: Lista de definiciones (término-descripción).Utilizar estas etiquetas según su propósito semántico, en lugar de depender de <div> y <span> genéricos, hace que tu contenido sea más comprensible para los navegadores, los motores de búsqueda y, fundamentalmente, para las tecnologías de asistencia como los lectores de pantalla.
Los atributos globales en HTML son un conjunto de atributos estándar que tienen la particularidad de poder ser aplicados a prácticamente cualquier etiqueta HTML.
Esto significa que, sin importar si estás trabajando con un párrafo (<p>), una imagen (<img>), un enlace (<a>), una sección (<section>) o casi cualquier otro elemento, puedes utilizar estos atributos comunes para añadirle ciertas funcionalidades o información.
Aunque son «globales», es posible que algunos de estos atributos no tengan un efecto visible o práctico en ciertos tipos de elementos muy específicos (por ejemplo, aplicar hidden a un elemento <meta> que ya es invisible por naturaleza no cambiaría nada).
El propósito de los atributos globales es proporcionar una base común de funcionalidades, como:
Aquí tienes algunos de los atributos globales más importantes y utilizados:
id: Asigna un identificador único a un elemento dentro de todo el documento HTML. No puede haber dos elementos con el mismo id en una página. Se usa comúnmente para:#id-del-elemento).<div id="cabecera-principal">...</div>class: Especifica uno o más nombres de clase para un elemento, separados por espacios si son varios. Las clases son fundamentales para:<p class="texto-destacado error urgente">Mensaje importante.</p>style: Permite aplicar reglas de CSS directamente en línea sobre el elemento. Aunque es válido, para una mejor organización y mantenibilidad del código, generalmente se recomienda usar hojas de estilo externas o la etiqueta <style> dentro del <head>. <span style="color: red; font-weight: bold;">Atención</span>title: Proporciona información adicional o consultiva sobre el elemento. Los navegadores suelen mostrar este texto como una pequeña etiqueta emergente («tooltip») cuando el usuario pasa el cursor del ratón sobre el elemento durante unos segundos. <abbr title="Organización Mundial de la Salud">OMS</abbr>lang: Define el idioma del contenido del elemento y de sus atributos textuales. Se puede aplicar al elemento <html> para definir el idioma de toda la página, o a elementos específicos si contienen texto en un idioma diferente al principal. <p>La palabra <em lang="fr">rendez-vous</em> significa cita en francés.</p>hidden: Es un atributo booleano que indica que el elemento ya no es relevante o no debe ser mostrado por el navegador. Los elementos con hidden no se renderizan. <div id="mensaje-confirmacion" hidden>¡Operación completada!</div>tabindex: Controla si un elemento puede recibir el foco del teclado y el orden en que lo recibe durante la navegación con la tecla Tab. Valores positivos definen un orden, 0 lo incluye en el orden natural, y -1 permite que reciba foco mediante programación pero no por tabulación.contenteditable: Un atributo booleano que, si se establece en true, permite que el contenido del elemento sea editable por el usuario directamente en el navegador.data-*: Permite almacenar datos personalizados privados en cualquier elemento HTML. Estos atributos deben empezar con el prefijo data- seguido por el nombre que quieras (ej. data-id-usuario, data-tipo-producto). Son muy útiles para ser leídos y manipulados con JavaScript sin interferir con otros atributos estándar. <article data-post-id="12345" data-categoria="noticias">...</article>Otros atributos globales incluyen dir (para la direccionalidad del texto: ltr o rtl), draggable (para la API de arrastrar y soltar), spellcheck, y atributos relacionados con ARIA (como role y diversos aria-*) que son cruciales para la accesibilidad.
Conocer y utilizar correctamente estos atributos globales te da un control mucho más fino sobre la estructura, presentación, comportamiento y accesibilidad de tus elementos HTML.
Los atributos id y class son dos de los atributos globales más utilizados en HTML. Aunque ambos sirven para identificar y referenciar elementos, tienen propósitos y reglas de uso distintos, especialmente cuando se trata de CSS y JavaScript.
Atributo id (Identificador)
id se utiliza para asignar un identificador único a un elemento HTML específico dentro de todo el documento.id debe ser absolutamente único en la página. No puede haber dos elementos diferentes compartiendo el mismo id. Piensa en ello como el número de DNI de un elemento: solo uno puede tenerlo.id debe comenzar con una letra (a-z, A-Z) y puede ser seguido por letras, números (0-9), guiones (-), guiones bajos (_), dos puntos (:) y puntos (.). No debe contener espacios.<a href="#capitulo1"> llevaría al elemento <section id="capitulo1">.document.getElementById ('miIdUnico').id en CSS (ej. #miIdUnico { ... }) tiene una alta especificidad, lo que significa que sus reglas tienden a prevalecer sobre otras.Ejemplo de id:
<article id="post-principal-hoy">
<h2 id="titulo-del-post">Un Día en el Desarrollo Web</h2>
<p>Contenido del artículo...</p>
</article>
<a href="#titulo-del-post">Saltar al título</a>
Lenguaje del código: PHP (php)Atributo class (Clase)
class se utiliza para asignar uno o más nombres de clase a uno o varios elementos HTML. Estos nombres de clase sirven para agrupar elementos que comparten características comunes.id:class="noticia importante urgente").id (sin espacios dentro de un solo nombre de clase), pero puedes listar varios separados por espacios..texto-destacado { color: blue; }) y luego aplicas esa clase a todos los elementos HTML que necesiten ese estilo. Esto promueve la reutilización y la organización del CSS.document.getElementsByClassName ('nombre-clase') o, de forma más moderna y versátil, document.querySelectorAll ('.nombre-clase')).Ejemplo de class:
<p class="aviso texto-pequeno">Este es un aviso importante.</p>
<div class="tarjeta producto-destacado">
<h3>Producto Estrella</h3>
<p class="descripcion texto-pequeno">Descripción breve del producto...</p>
</div>
<span class="aviso">Otra advertencia.</span>
Lenguaje del código: PHP (php)/* En tu archivo CSS */
.aviso {
color: red;
font-weight: bold;
}
.texto-pequeno {
font-size: 0.9em;
}
.tarjeta {
border: 1px solid #ccc;
padding: 10px;
}
.producto-destacado {
background-color: #f0f0f0;
}
Lenguaje del código: PHP (php)Diferencias Clave Resumidas:
| Característica | id (identificador) | class (clase) |
| Unicidad | Debe ser único en toda la página. | Puede ser usado por múltiples elementos. |
| Cantidad por elemento | Solo un valor de id. | Un elemento puede tener múltiples clases (separadas por espacios). |
| Uso principal | Identificación única para anclajes, JavaScript específico. | Agrupación para estilos CSS reutilizables, selección múltiple en JavaScript. |
| Selector CSS | #nombre-del-id | .nombre-de-la-clase |
| Especificidad CSS | Muy alta. | Media (menor que id). |
En general, se recomienda usar id con moderación para aquellos elementos que realmente necesitan ser identificados de forma única. Para la mayoría de los propósitos de estilización y agrupación, class es la herramienta más flexible y adecuada.
Sí, HTML cuenta con varios atributos que, aunque no solucionan todos los problemas de seguridad web por sí solos (la seguridad es un esfuerzo conjunto que involucra al servidor, JavaScript, y buenas prácticas de desarrollo), sí contribuyen significativamente a mitigar ciertos riesgos y a fortalecer tus páginas.
<a> que abren en nuevas pestañas): rel="noopener noreferrer"target="_blank", es una práctica de seguridad crucial añadir el atributo rel con los valores noopener y noreferrer.noopener: Impide que la página recién abierta tenga acceso al objeto window.opener de la página original. Esto protege contra un tipo de ataque llamado «tabnabbing» o «reverse tabnabbing», donde la nueva pestaña podría cambiar la URL de la pestaña original a un sitio malicioso (phishing) sin que te des cuenta.noreferrer: Evita que el navegador envíe la cabecera HTTP Referer al sitio de destino. Esto significa que el sitio de destino no sabrá desde qué página llegó el usuario, lo cual es bueno para la privacidad y también puede ser un pequeño plus de seguridad al no revelar información de tu sitio. <a href="https://un-sitio-externo.com" target="_blank" rel="noopener noreferrer">Visitar sitio externo (seguro)</a><iframe>): El atributo sandboxsandbox aplica un conjunto de restricciones de seguridad al contenido incrustado dentro de un <iframe>. Es especialmente útil cuando incrustas contenido de terceros que podría no ser completamente confiable.sandbox sin valor o con un valor vacío), el iframe no podrá ejecutar scripts, enviar formularios, abrir ventanas emergentes (pop-ups), acceder a cookies o al almacenamiento local de la página padre, ni navegar por la página contenedora, entre otras restricciones.allow-scripts, allow-forms, allow-popups, allow-same-origin, etc. (ej. sandbox="allow-scripts allow-same-origin"). Úsalas con precaución y solo si son estrictamente necesarias. <iframe src="widget_externo.html" sandbox="allow-scripts allow-popups" title="Widget interactivo"></iframe><script>, <link rel="stylesheet">): El atributo integrity (Subresource Integrity - SRI)<script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous"> El atributo crossorigin="anonymous" es a menudo necesario para que SRI funcione correctamente con recursos de terceros.Además de estos atributos HTML, es fundamental conocer y aplicar la Content Security Policy (CSP). Aunque CSP se configura principalmente a través de cabeceras HTTP enviadas por el servidor, también se puede definir una política usando la etiqueta <meta http-equiv="Content-Security-Policy" content="...">. CSP es una capa de seguridad muy potente que ayuda a prevenir ataques de Cross-Site Scripting (XSS) y otros ataques de inyección, al permitirte especificar qué recursos dinámicos tiene permitido cargar el navegador.
Para lograr que un enlace (<a>) inicie la descarga de un archivo en lugar de que el navegador intente mostrarlo (por ejemplo, un PDF o una imagen que quieres que el usuario guarde directamente), puedes utilizar el atributo download. Este atributo le indica al navegador que el destino del enlace (especificado en el atributo href) debe ser tratado como un archivo para descargar.
¿Cómo se usa el atributo download?
El atributo download se puede usar de dos maneras dentro de la etiqueta <a>:
<p>Descarga nuestro catálogo completo:</p> <a href="/ficheros/catalogo_productos_2025.pdf" download> Descargar Catálogo (PDF) </a> catalogo_productos_2025.pdf.<p>Descarga tu informe personalizado:</p> <a href="/api/informe-usuario?id=123&tipo=mensual" download="mi_informe_mensual_mayo_2025.docx"> Descargar mi informe de mayo (DOCX) </a> <p>Guarda esta imagen con un nombre amigable:</p> <a href="/galeria/img_7890_raw.jpg" download="Atardecer_en_la_playa.jpg"> Descargar foto del atardecer </a> mi_informe_mensual_mayo_2025.docx.Consideraciones Importantes:
download funciona de manera más consistente y predecible para los recursos que se encuentran en el mismo dominio que la página web que contiene el enlace.download (especialmente el nombre de archivo sugerido) si el servidor del recurso externo no envía las cabeceras CORS (Cross-Origin Resource Sharing) adecuadas que permitan este tipo de interacción (por ejemplo, Access-Control-Allow-Origin).Content-Disposition: attachment; filename="nombre.ext" enviada por el servidor del recurso tendrá prioridad para forzar la descarga y determinar el nombre del archivo. Si esta cabecera no está presente, el navegador podría simplemente navegar al recurso en lugar de descargarlo, o descargarlo usando el nombre de la URL.Los microdatos en HTML son una especificación del W3C diseñada para permitirte incrustar información estructurada y semántica detallada directamente dentro de tu código HTML existente.
Actúan como una capa adicional de metadatos que añades a tu contenido visible, con el objetivo principal de ayudar a las máquinas —especialmente a los motores de búsqueda como Google, Bing, etc.— a comprender con mayor precisión el significado, el tipo y las propiedades específicas de la información que presentas en tus páginas web.
El beneficio más significativo de utilizar microdatos es la posibilidad de que los motores de búsqueda muestren «resultados enriquecidos» (conocidos como «rich snippets» o «rich results») para tus páginas.
Estos son los resultados de búsqueda que se destacan visualmente con información adicional, como valoraciones con estrellas para productos o reseñas, tiempos de preparación para recetas, fechas y lugares de eventos, precios de artículos, y mucho más.
Estos resultados enriquecidos pueden mejorar la visibilidad de tus páginas y aumentar la tasa de clics desde los motores de búsqueda.
Para implementar microdatos, te basarás en un conjunto de atributos HTML globales, siendo los tres principales:
itemscope:itemscope="true").<div>, <article>, <span>), declara que ese elemento y todos sus descendientes contienen información sobre un «ítem» o entidad específica. Crea un nuevo ámbito para el ítem, y las propiedades definidas dentro de él se asociarán a este ítem.itemtype:itemscope.itemtype usando Schema.org:https://schema.org/Person (para describir a una persona)https://schema.org/Product (para un producto)https://schema.org/Event (para un evento)https://schema.org/Recipe (para una receta)https://schema.org/Review (para una reseña)itemprop (item property):itemscope para definir las propiedades específicas de ese ítem.itemprop se considera el valor de esa propiedad. Para ciertos elementos, como <img>, <a>, o <meta>, el valor de la propiedad se toma de atributos como src, href, o content, respectivamente.itemprop) también provienen del vocabulario especificado en itemtype. Por ejemplo, para un itemtype="http://schema.org/Person", algunas propiedades comunes de Schema.org son name, jobTitle, image, email, address, description, url, etc.itemprop) puede ser, a su vez, otro ítem anidado con su propio itemscope e itemtype (por ejemplo, la propiedad address de una Person puede ser un ítem de tipo PostalAddress).Ejemplo sencillo (describiendo una película):
<div itemscope itemtype="http://schema.org/Movie">
<h1 itemprop="name">Inception</h1>
<p>Dirigida por: <span itemprop="director" itemscope itemtype="http://schema.org/Person"><span itemprop="name">Christopher Nolan</span></span></p>
<p>Género: <span itemprop="genre">Ciencia ficción</span></p>
<img itemprop="image" src="inception_poster.jpg" alt="Póster de la película Inception">
<p>
<span itemprop="description">Un ladrón que roba información infiltrándose en los sueños de sus víctimas, recibe la tarea inversa: plantar una idea en la mente de un objetivo.</span>
</p>
<div>
Valoración:
<div itemprop="aggregateRating" itemscope itemtype="http://schema.org/AggregateRating">
<span itemprop="ratingValue">8.8</span>/10 basado en
<span itemprop="ratingCount">2.1</span> millones de votos.
</div>
</div>
<a itemprop="url" href="https://www.imdb.com/title/tt1375666/">Ver en IMDb</a>
</div>
Lenguaje del código: PHP (php)Aunque otros formatos para datos estructurados como JSON-LD (que se puede incluir en un bloque <script> en el <head> o <body>) son también muy populares y, de hecho, el formato generalmente preferido por Google por su facilidad de implementación y mantenimiento, los microdatos siguen siendo una forma válida y completamente funcional de añadir esta rica capa semántica directamente en tu contenido HTML. La elección entre uno u otro puede depender de las preferencias del proyecto o de las herramientas que estés utilizando.
La etiqueta <meta charset="UTF-8"> es una declaración crucial en HTML que especifica la codificación de caracteres que utiliza tu documento web. Esta se coloca dentro de la sección <head>.
Cada carácter que ves en una pantalla (letras, números, símbolos como la «ñ», acentos como «á», o emojis como 😊) necesita ser representado internamente por el ordenador mediante un código numérico (bytes).
Una codificación de caracteres es, en esencia, el sistema o «diccionario» que define la correspondencia entre esos caracteres y sus representaciones numéricas.
Si no se especifica una codificación, o si se usa una incorrecta, el navegador podría interpretar mal estos códigos numéricos. El resultado es que el texto podría mostrarse con caracteres extraños (a menudo llamados «mojibake», como por ejemplo �), haciendo que tu contenido sea ilegible, especialmente si usas caracteres que no pertenecen al alfabeto inglés básico.
UTF-8: El estándar recomendadoPara el desarrollo web moderno, la codificación de caracteres universalmente recomendada y más utilizada es UTF-8. Las razones principales son:
UTF-8 puede representar prácticamente cualquier carácter de casi todos los idiomas del mundo, así como una amplia gama de símbolos y emojis. Esto lo hace ideal para sitios web con contenido multilingüe o que simplemente quieren asegurar la correcta visualización de cualquier carácter.UTF-8 usa solo un byte, siendo eficiente. Para otros caracteres, puede usar hasta cuatro bytes.Al declarar <meta charset="UTF-8">, le estás diciendo al navegador de forma explícita que use este «diccionario» UTF-8 para interpretar los bytes del archivo HTML y convertirlos en el texto que el usuario ve.
La forma estándar y simplificada de declarar la codificación de caracteres en HTML5 es la siguiente:
<!DOCTYPE <strong>html</strong>>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Título de mi Página</title>
</head>
<body>
<h1>¡Bienvenido!</h1>
<p>Esta página utiliza UTF-8 para mostrar correctamente la «ñ», los acentos como «á», «é», «í», «ó», «ú», y símbolos como «€».</p>
</body>
</html>
Lenguaje del código: PHP (php)Es muy importante colocar la etiqueta <meta charset="UTF-8"> lo más arriba posible dentro del elemento <head>. Idealmente, debería ser el primer elemento hijo de <head>, o al menos encontrarse dentro de los primeros 1024 bytes del documento. Esto asegura que el navegador conozca la codificación antes de empezar a procesar la mayoría del contenido de la página, previniendo que intente «adivinar» la codificación y se equivoque.
El «atributo viewport» configura mediante una etiqueta <meta> específica dentro de la sección <head> de tu documento HTML.
Esta etiqueta controla cómo se muestra tu página web en diferentes tamaños de pantalla, especialmente en dispositivos móviles, y es una piedra angular del diseño web adaptable («responsive web design»).
El «viewport» o «ventana gráfica» es el área rectangular visible de una página web en la pantalla del usuario. Sus dimensiones varían enormemente dependiendo del dispositivo: un monitor de escritorio grande tendrá un «viewport» mucho más ancho que la pantalla de un teléfono móvil.
Inicialmente, los navegadores de los primeros smartphones intentaban solucionar el problema de mostrar webs diseñadas para escritorio mostrando la página completa en un «viewport» virtual muy ancho (por ejemplo, 960 o 980 píxeles) y luego encogiendo el resultado para que cupiera en la pequeña pantalla física. Esto hacía que el texto fuera diminuto y la experiencia de usuario muy pobre, obligando a hacer zoom constantemente.
<meta name="viewport">Para dar a los desarrolladores control sobre este comportamiento, se introdujo la etiqueta <meta name="viewport">. La configuración más común y esencial es:
HTML
<!DOCTYPE <strong>html</strong>>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mi Página Adaptable</title>
</head>
<body>
</body>
</html>
Lenguaje del código: PHP (php)Función principal:
Esta etiqueta instruye al navegador sobre cómo debe establecer las dimensiones y la escala del «viewport» de la página.
contentEl atributo content de esta etiqueta <meta> es donde defines las reglas para el «viewport». Las directivas más importantes son:
width=device-width: Esta directiva es fundamental. Le dice al navegador que establezca el ancho del «viewport» de la página igual al ancho de la pantalla del dispositivo en píxeles independientes del dispositivo (DIPs). Esto asegura que la página utilice el ancho real disponible en el dispositivo como base para su diseño.initial-scale=1.0: Esta directiva establece el nivel de zoom inicial cuando la página se carga por primera vez. Un valor de 1.0 significa que no habrá zoom, es decir, 1 píxel CSS se corresponderá a 1 píxel independiente del dispositivo. Esto permite que tu diseño adaptable se muestre correctamente desde el inicio.Otras directivas comunes (y opcionales) que puedes añadir, separadas por comas:
maximum-scale=1.0: Limita el zoom máximo que el usuario puede aplicar a la página.minimum-scale=1.0: Limita el zoom mínimo.user-scalable=no (o yes, que es el valor por defecto si no se especifica): Determina si el usuario puede hacer zoom en la página o no. Generalmente, se recomienda permitir el zoom (user-scalable=yes o simplemente no incluir user-scalable=no) por razones de accesibilidad, ya que algunos usuarios pueden necesitar ampliar el contenido para verlo mejor. Restringir el zoom puede frustrar a los usuarios.Incluir y configurar correctamente la etiqueta <meta name="viewport"> es esencial para el diseño web adaptable. Permite que tus hojas de estilo CSS, especialmente las «media queries» que aplican diferentes estilos según el ancho de la pantalla, funcionen como se espera. Sin ella, tu sitio podría no verse bien en dispositivos móviles, apareciendo demasiado pequeño o no ajustándose correctamente al espacio disponible, lo que resultaría en una mala experiencia de usuario. Es una de las primeras etiquetas que deberías añadir a cualquier proyecto web moderno.
El atributo loading="lazy" es una potente característica nativa de HTML diseñada para implementar la carga diferida («lazy loading») de imágenes (<img>) e iframes (<iframe>). Su objetivo principal es mejorar significativamente el rendimiento de carga inicial de tus páginas web y optimizar el uso de recursos.
loading="lazy"?Cuando un navegador moderno encuentra una etiqueta <img> o <iframe> que tiene el atributo loading="lazy", no descarga inmediatamente el recurso (la imagen o el contenido del iframe) si este se encuentra fuera de la pantalla visible actual («off-screen») o lejos del «viewport» (el área de la página que el usuario está viendo en ese momento).
En lugar de ello, el navegador monitoriza el desplazamiento (scroll) del usuario. Solo cuando el usuario se desplaza hacia abajo y el espacio reservado para la imagen o el iframe está a punto de entrar en el «viewport», el navegador inicia la petición y descarga del recurso correspondiente.
El navegador utiliza heurísticas internas para determinar cuán «cerca» debe estar un elemento para empezar a cargarlo, buscando un equilibrio entre ahorrar recursos y asegurar que el contenido esté listo cuando el usuario lo vea.
El atributo loading con el valor lazy se aplica principalmente a dos tipos de elementos:
<img src="ruta_imagen.jpg" loading="lazy" alt="Descripción de la imagen"><iframe src="ruta_contenido_embebido.html" loading="lazy" title="Título del iframe"></iframe>loadingEl atributo loading puede tener principalmente tres valores:
lazy: Habilita la carga diferida. El navegador retrasa la carga del recurso hasta que determina que es probable que el usuario lo vea.eager: Carga el recurso inmediatamente, sin importar si está visible o no. Este es el comportamiento predeterminado si el atributo loading no está presente o si se le asigna un valor inválido.auto: Permite que el navegador decida si aplicar o no la carga diferida. El comportamiento exacto puede variar entre navegadores o basarse en diferentes factores (como la velocidad de conexión). En la práctica, para asegurar la carga diferida, es más fiable usar lazy explícitamente.loading="lazy"loading="lazy"loading="lazy" a imágenes o iframes que son importantes y visibles en la parte superior de la página cuando esta se carga por primera vez (el contenido «above the fold»). eager o sin el atributo loading) para no afectar negativamente la experiencia del usuario ni métricas como el LCP.width y height): Para las etiquetas <img>, es muy recomendable especificar siempre sus atributos width y height. Ejemplo de uso:
<body>
<header>
<img src="logo.png" alt="Logo del sitio" width="150" height="50"> </header>
<main>
<h1>Artículo Interesante</h1>
<p>Mucho texto aquí...</p>
<img src="imagen_grande_del_articulo.jpg" loading="lazy" alt="Imagen descriptiva del artículo" width="800" height="600">
<p>Más texto...</p>
<iframe src="https
: //www.youtube.com/embed/VIDEO_ID" loading="lazy" title="Vídeo de YouTube" width="560" height="315" frameborder="0" allowfullscreen></iframe>
</main>
<footer>...</footer>
</body>
Lenguaje del código: PHP (php)En resumen, loading="lazy" es una herramienta nativa de HTML muy eficaz para optimizar la carga de imágenes e iframes, mejorando el rendimiento general de tu sitio web sin necesidad de recurrir a bibliotecas JavaScript externas para esta funcionalidad básica.
Los atributos async y defer se utilizan en las etiquetas <script> que enlazan a archivos JavaScript externos (<script src="ruta/al/script.js">) y sirven para controlar cómo y cuándo se descargan y ejecutan dichos scripts, con el objetivo principal de mejorar el rendimiento de carga de la página y la experiencia del usuario.
async ni defer)Para entender la utilidad de async y defer, primero veamos qué ocurre sin ellos:
<script src="..."></script>: a. Detiene el análisis del HTML. b. Descarga el archivo JavaScript desde la red. c. Una vez descargado, ejecuta el script JavaScript. d. Solo después de que el script ha terminado de ejecutarse, el navegador reanuda el análisis del HTML. Este comportamiento se conoce como «bloqueo del parser» («parser-blocking»). Si el script es grande o la conexión de red es lenta, la página puede tardar mucho en mostrarse completamente, ya que el navegador está esperando.asyncEl atributo async (asíncrono) modifica este comportamiento de la siguiente manera:
async se descarga por completo, el análisis del HTML se pausa y el script se ejecuta inmediatamente.async, no hay garantía del orden en que se ejecutarán. Se ejecutarán en el orden en que terminen de descargarse, no necesariamente en el orden en que aparecen en el HTML.Ejemplo:
HTML
<script async src="scripts/analiticas.js"></script>
<script async src="scripts/publicidad.js"></script>
Lenguaje del código: PHP (php)deferEl atributo defer (diferido) también modifica el comportamiento de carga y ejecución:
async, el navegador descarga el archivo JavaScript de forma asíncrona, sin bloquear el análisis del HTML.DOMContentLoaded).defer, se ejecutarán en el orden en que aparecen en el documento HTML. Esto es muy útil si un script depende de otro.defer se ejecutan después de que todo el HTML ha sido analizado, pueden acceder y manipular de forma segura cualquier elemento del DOM.async para la mayoría de los casos de uso.Ejemplo:
HTML
<script defer src="scripts/libreria-jquery.js"></script>
<script defer src="scripts/mi-script-que-usa-jquery.js"></script>
Lenguaje del código: PHP (php)| Característica | Sin Atributo | async | defer |
| Bloqueo del HTML al descargar | Sí | No | No |
| Bloqueo del HTML al ejecutar | Sí | Sí | No (ejecuta después del parseo del HTML) |
| Momento de Ejecución | Inmediato tras la descarga | Inmediato tras la descarga | Después del parseo completo del HTML |
| Orden de Ejecución | En el orden de aparición | Sin orden garantizado | En el orden de aparición |
Importante:
async y defer son atributos booleanos; no necesitan un valor (simplemente <script async src="...">).src). No afectan a los scripts en línea (código JavaScript escrito directamente entre las etiquetas <script>...</script>).Elegir entre async, defer, o ninguno, dependerá de las necesidades específicas de cada script: si es independiente, si necesita acceder al DOM inmediatamente, si depende de otros scripts, y lo crítico que es para la carga inicial de la página. Usarlos correctamente es una técnica clave para la optimización del rendimiento web.
El atributo contenteditable es un atributo global de HTML que, como su nombre indica, te permite especificar si el contenido de un elemento HTML puede ser editado directamente por el usuario en el navegador. Cuando este atributo se establece en true para un elemento, el usuario puede hacer clic sobre él y empezar a modificar su contenido (texto, y a veces incluso la estructura HTML interna, dependiendo de la implementación del navegador y el uso de JavaScript).
contenteditable es un atributo enumerado que puede aceptar principalmente tres valores:
true (o una cadena vacía "", o simplemente la presencia del atributo sin valor asignado): Hace que el contenido del elemento sea editable. El usuario podrá seleccionar texto, borrarlo, escribir nuevo texto, y en algunos navegadores, realizar acciones básicas de formato enriquecido (como negrita o cursiva) usando atajos de teclado si el contexto de edición lo permite.false: Hace que el contenido del elemento no sea editable. Este es el estado predeterminado para la mayoría de los elementos HTML si el atributo no está presente o no se hereda.inherit: El elemento hereda el estado de editabilidad de su elemento padre. Si no hay un padre con un estado de editabilidad explícito, generalmente se considera false.Ejemplo básico:
HTML
<!DOCTYPE <strong>html</strong>>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Ejemplo de ContentEditable</title>
<style>
[contenteditable="true"] {
border: 1px dashed #ccc;
padding: 5px;
cursor: text;
}
[contenteditable="true"]:focus {
outline: 2px solid dodgerblue;
border-style: solid;
}
</style>
</head>
<body>
<h1>Título de la Página (No editable)</h1>
<div id="mi-nota" contenteditable="true">
<h2>Haz clic aquí para editar este subtítulo</h2>
<p>Este es un párrafo que puedes modificar directamente en el navegador. ¡Inténtalo!</p>
<ul>
<li>También puedes editar elementos de lista.</li>
</ul>
</div>
<p>Este párrafo fuera del div editable no se puede modificar.</p>
<button onclick="guardarNota()">Guardar Nota</button>
<script>
function guardarNota() {
const notaEditada = document.getElementById('mi-nota').innerHTML;
// Aquí normalmente enviarías 'notaEditada' a un servidor o la guardarías localmente.
alert("Contenido de la nota:\n" + notaEditada);
console.log(notaEditada);
}
</script>
</body>
</html>
Lenguaje del código: PHP (php)En el ejemplo, el div con id="mi-nota" y todo su contenido (el <h2>, el <p> y el <ul>) se vuelven editables.
contenteditable proporciona la funcionalidad fundamental de edición del contenido subyacente.<textarea>.contenteditable solo hace que el contenido sea editable en el navegador. HTML por sí mismo no guarda los cambios. Para hacer que las modificaciones sean permanentes (por ejemplo, guardarlas en una base de datos), necesitarás usar JavaScript para capturar el contenido editado (generalmente a través de la propiedad innerHTML o textContent del elemento) y luego enviarlo a un servidor (usando fetch o AJAX).innerHTML de un elemento contenteditable y luego lo vas a mostrar en otro lugar o a otros usuarios, debes ser extremadamente cuidadoso y sanitizar ese HTML para prevenir ataques de Cross-Site Scripting (XSS). Los usuarios podrían intentar inyectar código HTML o JavaScript malicioso.contenteditable es la base, la creación de editores de texto enriquecido consistentes y con todas las funciones es una tarea compleja debido a las diferencias en cómo los navegadores implementan los comandos de edición.En resumen, contenteditable es una herramienta nativa de HTML muy útil para habilitar la edición de contenido directamente en la página, simplificando ciertas interacciones y sirviendo como base para funcionalidades más complejas con la ayuda de JavaScript.
El atributo hidden es un atributo global booleano en HTML. Su función principal es indicar que un elemento no es relevante en el contexto actual de la página y, por lo tanto, los navegadores no deben mostrarlo al usuario.
hidden?hidden, los navegadores no lo renderizan. Es decir, el elemento no se muestra en la página y no ocupa espacio en el diseño. Su efecto visual es muy similar a aplicar la propiedad CSS display: none;.hidden también se oculta a las tecnologías de asistencia, como los lectores de pantalla. El elemento y su contenido se eliminan del árbol de accesibilidad, lo que significa que no serán anunciados ni estarán disponibles para la interacción a través de estas herramientas. Esto refuerza la idea de que el contenido es actualmente irrelevante.hidden no puede recibir el foco del teclado (por ejemplo, mediante la tecla Tab) y su contenido no es interactivo (no se puede hacer clic en enlaces o botones dentro de él).Al ser un atributo booleano, su simple presencia en la etiqueta activa su comportamiento. Por ejemplo, <div hidden> es la forma estándar de usarlo. Escribir hidden="hidden" o hidden="" también es válido y tiene el mismo efecto. Para que el elemento vuelva a ser visible, se debe eliminar el atributo hidden (o establecer su propiedad hidden en false mediante JavaScript).
hidden?El atributo hidden es útil en diversas situaciones:
<details> y <summary> son más semánticos).Ejemplo de uso y manipulación con JavaScript:
<!DOCTYPE <strong>html</strong>>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Uso del Atributo Hidden</title>
<style>
.panel-oculto {
border: 1px solid #ccc;
padding: 15px;
margin-top: 10px;
background-color: #f9f9f9;
}
</style>
</head>
<body>
<button id="toggleBoton">Mostrar/Ocultar Panel</button>
<div id="miPanel" class="panel-oculto" hidden>
<h2>Información Adicional</h2>
<p>Este contenido estaba inicialmente oculto usando el atributo 'hidden'.</p>
<p>Ahora puedes verlo porque hemos interactuado con el botón.</p>
</div>
<script>
const boton = document.getElementById('toggleBoton');
const panel = document.getElementById('miPanel');
boton.addEventListener('click', function() {
// Alterna el estado de 'hidden' del panel
panel.hidden = !panel.hidden;
});
</script>
</body>
</html>
Lenguaje del código: PHP (php)En este ejemplo, el div con id="miPanel" está oculto al cargar la página. Al hacer clic en el botón, JavaScript cambia el valor de la propiedad hidden del panel, lo que hace que se muestre u oculte.
display: none; o visibility: hidden;)Aunque el resultado visual de hidden es similar a display: none;, la principal diferencia es semántica:
hidden: Indica que el elemento es semánticamente irrelevante en el estado actual. Es una declaración sobre la pertinencia del contenido.display: none;: Es una directiva puramente presentacional que oculta un elemento sin implicar nada sobre su relevancia semántica.visibility: hidden;: Oculta el elemento, pero este sigue ocupando su espacio en el diseño, a diferencia de hidden y display: none;.Si bien es posible que una regla CSS con alta especificidad (por ejemplo, display: block !important;) anule el efecto del atributo hidden y haga visible el elemento, esto generalmente se considera una mala práctica, ya que contradice la intención semántica de hidden.
En conclusión, hidden es la forma preferida en HTML para controlar la visibilidad de los elementos basándose en su relevancia actual, asegurando que tanto la presentación visual como la accesibilidad reflejen ese estado.
Los atributos data-* (leídos como «data guion lo que sea») son una característica estándar de HTML5 que te permite incrustar datos personalizados y privados directamente en tus elementos HTML.
Estos atributos están diseñados para almacenar información que es útil para tu página o aplicación (generalmente para ser utilizada por JavaScript), pero para la cual no existe un atributo o elemento HTML semánticamente más apropiado.
La idea principal detrás de los atributos data-* es proporcionar una forma válida y estándar de añadir «metadatos» a nivel de elemento sin tener que recurrir a crear atributos no estándar (lo que haría tu HTML inválido) o sobrecargar los atributos class o id.
La sintaxis es sencilla:
data-.data-, el nombre puede contener letras (se recomienda usar minúsculas), números, guiones (-), puntos (.), dos puntos (:) y guiones bajos (_). No debe contener letras mayúsculas ASCII (los navegadores las convertirán a minúsculas para el acceso mediante dataset).data-id-usuario o data-opcion-seleccionada.Ejemplo en HTML:
<div id="producto-123"
class="tarjeta-producto"
data-producto-id="123"
data-categoria="electronica"
data-precio-oferta="49.99"
data-stock-disponible="true">
<h3>Teclado Mecánico RGB</h3>
<p>Un teclado excelente para gaming y escritura.</p>
<button data-accion="anadir-al-carrito">Añadir al carrito</button>
</div>
Lenguaje del código: PHP (php)En este ejemplo, hemos almacenado el ID del producto, su categoría, un precio de oferta y si hay stock directamente en el div del producto, además de una acción en el botón.
data-* con JavaScript?La forma más moderna y recomendada de acceder y manipular estos atributos en JavaScript es a través de la propiedad dataset disponible en los elementos HTML. Esta propiedad es un objeto DOMStringMap que contiene todos los atributos data-* del elemento.
Cuando accedes a un atributo data-* a través de dataset, el nombre del atributo se convierte de «kebab-case» (en HTML) a «camelCase» (en JavaScript):
data-producto-id se convierte en elemento.dataset.productoIddata-categoria se convierte en elemento.dataset.categoriaEjemplo en JavaScript:
const productoDiv = document.getElementById('producto-123');
// Leer valores
const idProducto = productoDiv.dataset.productoId; // "123"
const categoria = productoDiv.dataset.categoria; // "electronica"
const precioOferta = parseFloat(productoDiv.dataset.precioOferta); // Convertir a número si es necesario
const stockDisponible = productoDiv.dataset.stockDisponible === 'true'; // Convertir a booleano
console.log(`ID: ${idProducto}, Categoría: ${categoria}, Precio: ${precioOferta}, Stock: ${stockDisponible}`);
// Modificar un valor
productoDiv.dataset.stockDisponible = 'false';
console.log(productoDiv.dataset.stockDisponible); // "false"
// Añadir un nuevo atributo data-* dinámicamente
productoDiv.dataset.ultimaVista = new Date().toISOString();
console.log(productoDiv.getAttribute('data-ultima-vista')); // Muestra la fecha en el atributo HTML
// También puedes usar getAttribute y setAttribute, aunque dataset es más directo:
// console.log(productoDiv.getAttribute('data-producto-id'));
// productoDiv.setAttribute('data-otra-cosa', 'valor');
Lenguaje del código: PHP (php)data-*class) limpios y enfocados en su propósito principal (estilos, agrupación semántica ligera).dataset simplifica enormemente la lectura y escritura de estos datos.Importante: Los atributos data-* y sus valores son visibles en el código fuente HTML de la página. Por lo tanto, no debes usarlos para almacenar información sensible o secreta que no quieras que sea accesible públicamente (como contraseñas, tokens privados, etc.). Son ideales para datos que tu interfaz de usuario necesita para funcionar o para pasar información simple del servidor al cliente.
El atributo download se utiliza en las etiquetas de enlace (<a>) de HTML para indicarle al navegador que el recurso al que apunta el atributo href debe ser descargado por el usuario en lugar de que el navegador intente navegar a él y mostrarlo directamente en la ventana o pestaña.
downloadCuando un usuario hace clic en un enlace que contiene el atributo download, el navegador inicia el proceso de descarga del archivo vinculado. Esto es especialmente útil para ofrecer archivos que no están pensados para ser visualizados directamente en el navegador (como archivos .zip, .exe, .docx) o cuando quieres que el usuario guarde una copia local de un recurso que sí podría visualizarse (como un PDF, una imagen de alta resolución o un archivo de audio).
En esencia, el atributo download cambia el comportamiento predeterminado de un enlace de «navegar a» por «descargar».
download?El atributo download puede usarse de dos formas principales dentro de la etiqueta <a>:
<a href="/recursos/documento_importante.pdf" download> Descargar Documento Importante (PDF) </a> Al hacer clic, el navegador comenzará a descargar documento_importante.pdf.<a href="/api/generar_reporte.php?id=123" download="reporte_anual_ventas_2025.xlsx"> Descargar Reporte Anual de Ventas (Excel) </a> <a href="/imagenes_galeria/IMG_0042.JPG" download="Vacaciones_Playa_Soleada.jpg"> Descargar foto de las vacaciones </a>downloaddownload funciona de manera más fiable y predecible para los archivos que están alojados en el mismo dominio que tu página web.download puede ser inconsistente entre navegadores debido a políticas de seguridad. download (especialmente el nombre de archivo sugerido) a menos que el servidor del recurso externo envíe las cabeceras HTTP CORS (Cross-Origin Resource Sharing) adecuadas que permitan este tipo de interacción. Content-Disposition: attachment; filename="nombre.ext" enviada por el servidor del recurso tendrá más peso para forzar la descarga y determinar el nombre del archivo.download para cualquier tipo de archivo que desees que el usuario pueda descargar fácilmente.El atributo download es una herramienta sencilla pero muy efectiva para mejorar la experiencia del usuario al ofrecer descargas directas de archivos desde tus páginas web.
El atributo tabindex es un atributo global de HTML que te permite controlar si un elemento puede recibir el foco del teclado y cómo participa en la navegación secuencial por teclado (generalmente utilizando la tecla Tab para avanzar y Shift+Tab para retroceder). Es una herramienta fundamental para mejorar la accesibilidad de tu sitio web, especialmente para usuarios que no utilizan un ratón.
tabindex?El comportamiento del atributo tabindex varía significativamente según el valor numérico que le asignes:
tabindex="0"<div>, <span>, <p>) pueda recibir el foco.Tab.<div>, un menú desplegable, etc.). Al añadir tabindex="0", los haces accesibles mediante el teclado. HTML<div role="button" tabindex="0" onclick="miAccion()" onkeypress="miAccion()"> Haz clic o pulsa Enter </div>tabindex="-1"elemento.focus()), pero lo excluye de la secuencia de navegación por tabulación natural.Tab directamente.<div id="notificacionError" tabindex="-1" role="alert">Error: El campo es obligatorio.</div> <button onclick="document.getElementById('notificacionError').focus()">Mostrar y enfocar error</button>tabindex con un valor positivo (ej. tabindex="1", tabindex="5", tabindex="10")tabindex positivo recibirán el foco antes que cualquier elemento con tabindex="0" o elementos enfocables por defecto. El orden entre ellos será de menor a mayor valor de tabindex (primero los tabindex="1", luego los tabindex="2", etc.).tabindex puede crear una experiencia de navegación por teclado muy confusa y poco intuitiva para los usuarios, ya que el orden del foco puede no coincidir con el orden visual de los elementos en la página. Esto es un anti-patrón de accesibilidad. Es mucho mejor estructurar tu HTML de forma lógica para que el orden natural de tabulación sea el correcto y usar tabindex="0" y tabindex="-1" solo cuando sea estrictamente necesario.Recuerda que muchos elementos HTML son enfocables por defecto y se incluyen automáticamente en el orden de tabulación sin necesidad de tabindex. Estos incluyen:
<a> con atributo href)<button>)<input>, <select>, <textarea>)contenteditable establecido en true.tabindex="0" con moderación: Solo para elementos personalizados que realmente necesitan ser interactivos y no tienen una alternativa nativa. Asegúrate de que también respondan a eventos de teclado como Enter o Espacio si actúan como botones.tabindex="-1" estratégicamente: Para la gestión del foco mediante JavaScript en componentes dinámicos.tabindex con valores positivos (> 0) en la medida de lo posible.Dominar el uso de tabindex es un aspecto importante para crear sitios web que sean accesibles para todos los usuarios, independientemente de cómo interactúen con la web.
El atributo role es una pieza fundamental de ARIA. Es un atributo global que puedes añadir a cualquier elemento HTML para definir explícitamente cuál es la función o el propósito de ese elemento en la interfaz de usuario.
Cuando usas un elemento HTML estándar con una semántica clara (como <button>, <nav>, o <input type="checkbox">), el navegador ya comunica su rol implícito a las tecnologías de asistencia. Sin embargo, si estás creando componentes de interfaz más complejos o personalizados (por ejemplo, usando elementos <div> y <span> con JavaScript para simular un menú desplegable, una pestaña, un control deslizante, etc.), estos elementos genéricos no tienen una semántica inherente que describa su función.
Aquí es donde entra el atributo role. Al añadir role="[nombre-del-rol]", le dices a la tecnología de asistencia: «este <div> no es solo un <div>, sino que actúa como un button» o «este grupo de elementos funciona como un tablist».
Ejemplos de roles comunes:
button, checkbox, dialog, slider, tab, tabpanel, tooltip, menu, menuitem.banner (similar a <header>), navigation (similar a <nav>), main (similar a <main>), complementary (similar a <aside>), contentinfo (similar a <footer>), form, search, region.article, document, img, heading, list, listitem, table.<div role="button" tabindex="0" onclick="hacerAlgo();" onkeypress="hacerAlgo();">
Acción Personalizada
</div>
<ul role="menubar">
<li role="menuitem"><a href="/">Inicio</a></li>
<li role="menuitem"><a href="/productos">Productos</a></li>
</ul>
<div role="main">
<p>Contenido principal de la página...</p>
</div>
Lenguaje del código: PHP (php)role y ARIAEl atributo role es el punto de partida. Una vez que un elemento tiene un role definido, a menudo necesitarás usar otros atributos ARIA (que comienzan con aria-, como aria-label, aria-labelledby, aria-describedby, aria-expanded, aria-hidden, aria-required, aria-checked, etc.) para describir sus estados y propiedades específicos. Por ejemplo, un elemento con role="tab" podría necesitar aria-selected para indicar si es la pestaña activa, y un role="checkbox" necesitaría aria-checked.
Es crucial recordar la «primera regla de ARIA»: Si puedes usar un elemento HTML nativo que ya proporciona la semántica y el comportamiento que necesitas, úsalo en lugar de añadir un rol ARIA a un elemento genérico.
<button> en lugar de <div role="button">.<nav> en lugar de <div role="navigation">.<input type="checkbox"> en lugar de <span role="checkbox" aria-checked="false">.ARIA está para suplir las carencias de HTML, no para reemplazar su semántica nativa. Usar ARIA incorrectamente (por ejemplo, contradiciendo la semántica nativa de un elemento) puede empeorar la accesibilidad en lugar de mejorarla. También, si usas ARIA para crear controles interactivos, eres responsable de implementar el comportamiento de teclado esperado y la gestión del foco con JavaScript.
En resumen, el atributo role es una herramienta poderosa de ARIA para añadir semántica a tus elementos HTML, haciéndolos más comprensibles para las tecnologías de asistencia y, por ende, más accesibles, especialmente cuando se construyen interfaces de usuario personalizadas y dinámicas.
WAI-ARIA (Web Accessibility Initiative – Accessible Rich Internet Applications) es una especificación técnica del W3C diseñada para hacer que el contenido web y las aplicaciones web, especialmente aquellas con interfaces de usuario complejas o componentes personalizados construidos con JavaScript, sean más accesibles para personas con diversidad funcional.
Funciona proporcionando un conjunto de atributos HTML (principalmente el atributo role y diversos atributos aria-*) que puedes añadir a tus elementos para darles un significado semántico adicional que las tecnologías de asistencia (AT), como los lectores de pantalla, puedan entender e interpretar. ARIA no cambia la apariencia ni el comportamiento de los elementos para los usuarios que no usan AT, solo afecta al «árbol de accesibilidad» que usan estas tecnologías.
La regla de oro es la primera regla de ARIA: «No uses ARIA si puedes usar HTML nativo». Esto significa:
<button>, <nav>, <input type="checkbox">, <details>, etc.) o un atributo HTML (como required, hidden, checked) que ya proporciona la semántica y el comportamiento que necesitas, ¡úsalo! El HTML nativo es inherentemente más accesible y robusto.<button>Un botón</button> que <div role="button" tabindex="0">Un botón</div>.Debes usar atributos ARIA principalmente en las siguientes situaciones, cuando el HTML nativo no es suficiente:
role para definir qué es el componente (ej. role="tablist", role="dialog") y atributos aria-* para sus estados y propiedades (ej. aria-selected="true" para una pestaña, aria-expanded="false" para un menú contraído, aria-hidden="true" para un diálogo oculto).<div role="tablist"> <div role="tab" aria-selected="true" aria-controls="panel1" tabindex="0">Pestaña 1</div> <div role="tab" aria-selected="false" aria-controls="panel2" tabindex="-1">Pestaña 2</div> </div> <div id="panel1" role="tabpanel">Contenido de la Pestaña 1...</div> <div id="panel2" role="tabpanel" hidden>Contenido de la Pestaña 2...</div><button aria-expanded="false" aria-controls="menu-contenido"> Menú </button><div id="menu-contenido" hidden> </div>Importante:
role="button", eres responsable de añadir la interactividad de teclado (Enter, Espacio) y la lógica con JavaScript. ARIA solo comunica la semántica.En resumen, WAI-ARIA es un complemento poderoso al HTML semántico, diseñado para cubrir los vacíos de accesibilidad en aplicaciones web ricas e interactivas, pero siempre debe usarse con conocimiento y priorizando las soluciones nativas de HTML.
La accesibilidad web, comúnmente abreviada como a11y (donde «11» representa el número de letras entre la «a» inicial y la «y» final de la palabra inglesa «accessibility»), se refiere al diseño y desarrollo de sitios web, herramientas y tecnologías de tal manera que puedan ser utilizados por todas laspersonas, independientemente de sus capacidades físicas, sensoriales o cognitivas.
El objetivo es garantizar que personas con diversidad funcional (visual, auditiva, motora, neurológica, del habla, cognitiva, etc.), así como aquellas con limitaciones temporales (como un brazo roto) o situacionales (como estar en un entorno ruidoso o bajo luz solar intensa), puedan percibir, entender, navegar e interactuar con la web de forma efectiva, y también contribuir a ella.
La accesibilidad web es fundamental por una multitud de razones que abarcan desde los derechos humanos hasta los beneficios comerciales y la mejora de la experiencia para todos los usuarios:
alt): Fundamental para usuarios ciegos que usan lectores de pantalla, pero también útil si una imagen no se carga o para el SEO.En definitiva, la accesibilidad web no es solo una consideración técnica o una «característica extra», sino un aspecto fundamental del desarrollo web ético, responsable y de calidad, que beneficia a la sociedad en su conjunto.
Un buen HTML semántico es, sin duda, uno de los pilares fundamentales para construir un sitio web accesible (a11y).
Cuando utilizas las etiquetas HTML de acuerdo con su significado o propósito real (por ejemplo, <nav> para la navegación, <article> para un artículo autocontenido, <h1> para el encabezado principal), proporcionas una estructura clara y rica en información que las tecnologías de asistencia (AT), como los lectores de pantalla que utilizan las personas con discapacidad visual, pueden interpretar y transmitir de manera efectiva a sus usuarios.
<header> (cabecera), <nav> (navegación), <main> (contenido principal), <aside> (contenido complementario) y <footer> (pie de página) definen regiones o «hitos» clave. Los usuarios de lectores de pantalla pueden listar estos hitos y navegar directamente a la sección que les interesa, lo que facilita enormemente la exploración de páginas complejas. Sin estos, la página podría parecer un bloque indiferenciado de contenido. <body> <header>...</header> <nav>...</nav> <main>...</main> <aside>...</aside> <footer>...</footer> </body><h1> a <h6>) crea un esquema del documento. Los usuarios de AT pueden listar los encabezados o navegar de uno a otro para entender la estructura del contenido y encontrar rápidamente la información que buscan.<button> es anunciado como «botón» por un lector de pantalla y es operable por teclado (con Enter y Espacio) por defecto. Si intentaras crear un botón visualmente con un <div> y CSS, un lector de pantalla solo lo vería como un div genérico, a menos que añadieras atributos ARIA (role="button", tabindex="0") y gestionaras los eventos de teclado con JavaScript. El HTML semántico te da esto «gratis». <button onclick="realizarAccion()">Comprar Ahora</button> <div class="mi-boton-falso" onclick="realizarAccion()">Comprar Ahora</div><label> asociado correctamente con sus controles <input>, <select>, etc. (mediante el atributo for y el id del control) es vital. Permite que los lectores de pantalla anuncien la etiqueta descriptiva cuando el usuario enfoca el control del formulario.<ul> (no ordenada), <ol> (ordenada) y <dl> (de descripción), junto con <li>, <dt> y <dd>, informan a las AT sobre la estructura de la lista y el número de elementos, ayudando al usuario a entender el contexto.<table> con <caption>, <thead>, <tbody>, <tfoot>, <th> (con atributos scope para indicar si son cabeceras de fila o columna) permite a los usuarios de AT navegar y comprender las relaciones complejas entre los datos de una tabla.En conclusión, el HTML semántico es la base sobre la cual se construye una web accesible. Al describir el «qué» y el «por qué» de tu contenido, en lugar de solo el «cómo se ve», permites que una gama más amplia de usuarios y tecnologías puedan acceder y comprender tu información de manera efectiva.
Hacer que las imágenes de tu sitio web sean accesibles es fundamental para garantizar que todos los usuarios, incluyendo aquellos con discapacidad visual que utilizan lectores de pantalla o personas que tienen las imágenes desactivadas, puedan comprender la información y la función que estas transmiten.
La herramienta principal para lograr esto en HTML es el atributo alt.
alt (Texto Alternativo)El atributo alt se utiliza dentro de la etiqueta <img> para proporcionar una descripción textual alternativa de la imagen.
alt se presenta en su lugar. Los lectores de pantalla leen este texto en voz alta. Los motores de búsqueda también lo utilizan para entender el contenido de la imagen.alt es obligatorio para la etiqueta <img> según los estándares de HTML. Omitirlo hace que el HTML sea inválido y es una barrera de accesibilidad.alt para imágenes informativas?Cuando una imagen transmite información o tiene una función específica, el texto alternativo debe ser:
alt depende del contexto en el que se usa la imagen. La misma imagen podría necesitar diferentes descripciones en diferentes páginas.alt.alt debe describir el destino o la función del enlace, no solo la imagen. Por ejemplo, si un logo enlaza a la página de inicio, un buen alt sería «Nombre de la Empresa - Ir a la página de inicio».Ejemplos de texto alt para imágenes informativas:
<img src="grafico_crecimiento_anual.png"
alt="Gráfico de líneas mostrando el crecimiento de usuarios activos mensuales de 10.000 en enero a 50.000 en diciembre.">
<a href="/perfil/juan-perez">
<img src="juan_perez_avatar.jpg" alt="Perfil de Juan Pérez">
</a>
<button type="submit">
<img src="icono_buscar.svg" alt="Buscar"> </button>
Lenguaje del código: PHP (php)Una imagen se considera decorativa si su único propósito es estético o de diseño, y no añade ninguna información o funcionalidad importante al contenido.
Ejemplos: bordes ornamentales, patrones de fondo (si se usan como <img>), iconos que están acompañados de texto que ya describe su acción.
Para las imágenes decorativas, la práctica correcta es:
alt vacío: alt="" HTML<img src="separador_floral.png" alt="">alt=""? Esto indica explícitamente a las tecnologías de asistencia que la imagen es decorativa y que pueden ignorarla de forma segura. El lector de pantalla no anunciará nada por ella, lo cual es preferible a que lea el nombre del archivo o una descripción irrelevante.alt por completo: Esto invalida el HTML y puede causar que los lectores de pantalla lean el src (nombre del archivo), lo cual es una mala experiencia.alt=" " (un espacio) o palabras como alt="decorativa" o alt="imagen": Un alt vacío (alt="") es la única forma correcta y semántica de marcar una imagen como decorativa para que sea ignorada.Alternativa para imágenes decorativas (CSS):
Siempre que sea posible, la mejor manera de incluir imágenes puramente decorativas es mediante CSS, utilizando la propiedad background-image.
Las imágenes de fondo de CSS son ignoradas por defecto por la mayoría de las tecnologías de asistencia, ya que se consideran parte de la presentación y no del contenido.
Si una imagen transmite información compleja (como un gráfico detallado, un organigrama o un mapa), el atributo alt debería proporcionar una descripción concisa de la información esencial. Para una descripción más detallada, puedes:
aria-describedby para asociar la imagen con un texto descriptivo más extenso que esté presente en la página.Proporcionar un texto alternativo adecuado y significativo es uno de los pilares de la accesibilidad web y asegura que tu contenido visual sea comprensible para un público más amplio.
Indicar el idioma del contenido en tus páginas HTML es una práctica esencial para la accesibilidad, la correcta interpretación por parte de los navegadores y los motores de búsqueda, y para una mejor experiencia de usuario en general. Esto se logra principalmente mediante el uso del atributo global lang.
Declarar el idioma de tu contenido tiene varios beneficios clave:
:lang() en CSS para aplicar estilos específicos al contenido según su idioma (por ejemplo, p:lang(fr) { font-style: italic; }).La declaración de idioma más importante es la que se aplica a todo el documento HTML. Esto se hace añadiendo el atributo lang al elemento raíz <html>.
Ejemplo:
<!DOCTYPE <strong>html</strong>>
<html lang="es"> <head>
<meta charset="UTF-8">
<title>Mi Página Web en Español</title>
</head>
<body>
<h1>Título Principal</h1>
<p>Todo el contenido dentro de esta página se considera en español por defecto.</p>
</body>
</html>
Lenguaje del código: PHP (php)El valor del atributo lang debe ser un código de idioma IETF (BCP 47) válido.
Los más comunes son códigos de dos letras (ISO 639-1) como es (español), en (inglés), fr (francés), de (alemán), etc.
También puedes usar códigos más específicos con subetiquetas de región, como es-ES (español de España), es-MX (español de México), en-US (inglés de Estados Unidos) o en-GB (inglés del Reino Unido), si necesitas diferenciar una variante regional específica.
Generalmente, se recomienda usar el código de idioma principal (es, en) a menos que haya una razón fuerte para la especificidad regional.
Si una sección de tu página contiene texto en un idioma diferente al idioma principal declarado en la etiqueta <html>, debes indicar este cambio utilizando el atributo lang en el elemento HTML que envuelve ese fragmento de texto. Esto puede ser un <span>, <p>, <div>, <blockquote>, <em>, etc.
Ejemplo:
<html lang="es">
<head>
<title>Un Artículo Bilingüe</title>
</head>
<body>
<p>Este es un párrafo en español. A continuación, citaremos una frase en inglés.</p>
<blockquote lang="en"> <p>The quick brown fox jumps over the lazy dog.</p>
</blockquote>
<p>La palabra francesa <em lang="fr">"déjà vu"</em> es muy conocida.</p> <p>El resto del contenido sigue en español.</p>
</body>
</html>
Lenguaje del código: PHP (php)En este ejemplo, un lector de pantalla sabría cambiar a la pronunciación inglesa para la cita y a la francesa para la palabra «déjà vu», mejorando significativamente la comprensión para el usuario.
Declarar el idioma correctamente es un paso sencillo pero muy poderoso para hacer tu web más global, accesible y profesional. No traduce el contenido, simplemente informa al software sobre el idioma en el que ya está escrito.
Crear formularios accesibles en HTML es esencial para asegurar que todas las personas, independientemente de sus capacidades, puedan interactuar con tu sitio web y completar tareas cruciales como registrarse, iniciar sesión, realizar compras o enviar consultas. Un formulario inaccesible puede ser una barrera insuperable para muchos usuarios.
Aquí te explico los aspectos clave, incluyendo el uso de <label>, la agrupación de controles e indicaciones claras:
<label>Cada control de formulario (<input>, <textarea>, <select>) necesita una etiqueta descriptiva. El elemento <label> se utiliza para esto, y es fundamental asociarlo correctamente con su respectivo control. La forma más robusta y recomendada es usar el atributo for en el <label>, cuyo valor debe coincidir con el id del control del formulario:
<label for="nombreUsuario">Nombre de usuario:</label>
<input type="text" id="nombreUsuario" name="username">
<label for="aceptoTerminos">Acepto los términos y condiciones</label>
<input type="checkbox" id="aceptoTerminos" name="terminos">
Lenguaje del código: PHP (php)Beneficios de <label for="...">:
<input>), el software lee en voz alta el texto de la etiqueta asociada, informando al usuario qué dato debe introducir.Aunque también existe la asociación implícita (envolver el <input> dentro del <label>), la asociación explícita con for e id es generalmente más fiable y versátil.
<fieldset> y <legend>Cuando tienes un grupo de controles de formulario que están lógicamente relacionados (por ejemplo, un conjunto de botones de radio para una única pregunta, o los diferentes campos que componen una dirección postal), debes agruparlos utilizando el elemento <fieldset>. Dentro del <fieldset>, el primer elemento debería ser un <legend>, que actúa como el título o la leyenda para ese grupo de controles.
<fieldset>
<legend>Elige tu método de contacto preferido:</legend>
<div>
<input type="radio" id="contactoEmail" name="metodoContacto" value="email">
<label for="contactoEmail">Correo electrónico</label>
</div>
<div>
<input type="radio" id="contactoTelefono" name="metodoContacto" value="telefono">
<label for="contactoTelefono">Teléfono</label>
</div>
</fieldset>
Lenguaje del código: PHP (php)El texto del <legend> es anunciado por los lectores de pantalla cuando el usuario entra en el grupo de controles, proporcionando un contexto esencial para los elementos dentro del <fieldset>.
required de HTML5 en el control: <input type="text" id="nombre" required>.aria-required="true": <input type="text" id="nombre" aria-required="true">. (El atributo required de HTML5 ya implica esto para AT).DD/MM/AAAA, un número de teléfono, o una contraseña con ciertos requisitos), proporciona estas instrucciones de forma clara y visible, preferiblemente antes del campo. Puedes usar texto descriptivo asociado mediante aria-describedby. HTML<label for="fechaNacimiento">Fecha de nacimiento:</label> <input type="text" id="fechaNacimiento" name="fechaNac" aria-describedby="formatoFecha"> <span id="formatoFecha" class="instruccion">Formato: DD/MM/AAAA</span>placeholder: Aunque puede usarse para dar una pista breve, no confíes en placeholder para información crítica o etiquetas, ya que desaparece cuando el usuario empieza a escribir y no es un sustituto de <label>.required, type="email", type="url", pattern, min, max, minlength, maxlength). Estos proporcionan una validación básica en el lado del cliente.aria-describedby apuntando al id del mensaje de error, y usando aria-invalid="true" en el control.Idealmente, el foco debería moverse al primer campo con error, o se debería proporcionar un resumen de errores al principio del formulario.<label for="clave">Contraseña:</label> <input type="password" id="clave" name="password" required aria-describedby="errorClave" aria-invalid="true"> <div id="errorClave" role="alert" class="mensaje-error">La contraseña debe tener al menos 8 caracteres.</div>Asegúrate de que todos los controles del formulario sean completamente operables utilizando solo el teclado y que el orden de tabulación sea lógico y predecible (generalmente siguiendo el orden visual y el orden del código fuente). Los elementos de formulario nativos son operables por teclado por defecto.
Si bien la base es un HTML semántico y nativo, WAI-ARIA puede ser necesario para:
aria-label o aria-labelledby si una <label> visible no es suficiente o posible, y aria-describedby para descripciones más largas.aria-live): Para anunciar errores o mensajes de estado que aparecen dinámicamente.Crear formularios accesibles requiere atención al detalle, pero resulta en una experiencia mucho mejor para una gama más amplia de usuarios y es una parte esencial del desarrollo web responsable.
Las etiquetas <table> deben usarse para presentar datos tabulares (información organizada en filas y columnas lógicas), y no para maquetar el diseño de una página (una práctica obsoleta).
<caption> (Título de la tabla): <caption> proporciona un título o descripción para la tabla. Debe ser el primer elemento hijo de la etiqueta <table>. Un buen <caption> ayuda a los usuarios a entender el contexto y el propósito de la tabla antes de examinar sus datos. HTML<table> <caption>Ventas mensuales por región - Q1 2025</caption> </table><thead>, <tbody> y <tfoot>: <thead>: Contiene las filas de encabezado de la tabla (generalmente una o más filas <tr> con celdas <th>).<tbody>: Contiene las filas con los datos principales del cuerpo de la tabla (filas <tr> con celdas <td> y a veces <th> para encabezados de fila).<tfoot>: (Opcional) Contiene las filas de pie de tabla, que podrían usarse para sumarios o totales. Usar estos elementos no solo mejora la semántica, sino que también permite a los navegadores, por ejemplo, repetir los encabezados (<thead>) si la tabla se imprime en varias páginas o mantenerlos visibles mientras se desplaza por un <tbody> largo.<th>) y el Atributo scope:<th> (table header) para todas las celdas que actúan como encabezados, ya sea para una columna o para una fila. Los navegadores suelen mostrar el texto de <th> en negrita y centrado por defecto.El atributo scope en un elemento <th> es crucial para la accesibilidad. Define explícitamente a qué celdas se aplica ese encabezado:scope="col": El encabezado se aplica a todas las celdas de esa columna.scope="row": El encabezado se aplica a todas las celdas de esa fila.scope="colgroup": El encabezado se aplica a un grupo de columnas (definido con <colgroup>).scope="rowgroup": El encabezado se aplica a un grupo de filas (implícito con <thead>, <tbody>, <tfoot>).<table> <caption>Horario de Clases</caption> <thead> <tr> <th scope="col">Hora</th> <th scope="col">Lunes</th> <th scope="col">Martes</th> <th scope="col">Miércoles</th> </tr> </thead> <tbody> <tr> <th scope="row">09:00 - 10:00</th> <td>Matemáticas</td> <td>Historia</td> <td>Matemáticas</td> </tr> <tr> <th scope="row">10:00 - 11:00</th> <td>Lengua</td> <td>Física</td> <td>Lengua</td> </tr> </tbody> </table> scope permite a los lectores de pantalla asociar correctamente las celdas de datos (<td>) con sus encabezados (<th>), de modo que cuando un usuario navega a una celda de datos, el lector de pantalla puede anunciar los encabezados correspondientes, proporcionando el contexto necesario.id y headers): scope puede no ser suficiente para definir todas las relaciones. En estos casos más avanzados:id único a cada celda <th> relevante.En cada celda de datos <td>, utiliza el atributo headers, cuyo valor es una lista de los id de las celdas <th> que se aplican a esa celda <td>, separados por espacios.<th id="h_nombre">Nombre</th> <td headers="h_nombre">Ana</td> Este método requiere más trabajo pero es esencial para la accesibilidad de tablas realmente complejas.colspan y rowspan) si complican la comprensión de la estructura, especialmente para los usuarios de tecnologías de asistencia. Si las usas, asegúrate de que las asociaciones de encabezado (con scope o id/headers) sigan siendo claras y precisas.Al seguir estas pautas, te aseguras de que la información presentada en tus tablas sea accesible y comprensible para una audiencia más amplia, incluyendo aquellos que dependen de tecnologías de asistencia para navegar por la web.
El contraste de color en el contexto del diseño web se refiere a la diferencia en luminosidad (o brillo percibido) y/o color entre dos elementos visuales adyacentes.
Normalmente, cuando hablamos de legibilidad en HTML, nos referimos al contraste entre el color del texto y el color de su fondo.
Un contraste alto implica que los colores son muy distintos (por ejemplo, texto negro sobre fondo blanco), lo que facilita la distinción.
Un contraste bajo implica que los colores son similares (por ejemplo, texto gris claro sobre un fondo blanco o texto azul sobre un fondo verde de similar tonalidad), lo que dificulta la distinción.
Este concepto también es crucial para otros elementos de la interfaz, como iconos, bordes de campos de formulario y otros componentes gráficos que necesitan ser percibidos claramente.
El contraste de color tiene un impacto directo y muy significativo en la legibilidad de la información que presentas en tus páginas HTML y, por consiguiente, es un factor fundamental de la accesibilidad web (a11y).
Las Pautas de Accesibilidad para el Contenido Web (WCAG), desarrolladas por el W3C (World Wide Web Consortium), son el estándar internacional para la accesibilidad web. Las WCAG establecen unos ratios de contraste mínimos que deben cumplirse:
Estos ratios también se aplican, con ciertas especificaciones, a los componentes de la interfaz gráfica (como los bordes de los campos de entrada o los iconos que transmiten información) y a los estados visuales de los controles (por ejemplo, el estado de foco).
Aunque el contenido textual se estructura con HTML (párrafos <p>, encabezados <h1>-<h6>, etc.), los colores del texto y del fondo de estos elementos se definen utilizando CSS (Hojas de Estilo en Cascada). Por lo tanto, asegurar un contraste de color adecuado es una responsabilidad compartida entre el diseño visual y la implementación CSS.
Existen numerosas herramientas en línea y extensiones de navegador que te ayudan a verificar los ratios de contraste entre dos colores, facilitando la elección de combinaciones accesibles. Algunas populares son:
En conclusión, prestar atención al contraste de color no es solo una cuestión de estética, sino un requisito fundamental para que tu contenido HTML sea legible y accesible para la mayor cantidad de personas posible, en la mayor cantidad de situaciones posible.
<a> con href), botones (<button>) y controles de formulario (<input>, <select>, <textarea>) son enfocables. Utiliza estos elementos semánticos siempre que sea posible.outline: none;). ¡No lo hagas sin proporcionar una alternativa clara! Personaliza el estado :focus para que sea evidente./* Un ejemplo de indicador de foco personalizado y accesible */ a:focus, button:focus, input:focus, select:focus, textarea:focus { outline: 2px solid #007bff; /* Un contorno azul bien visible */ outline-offset: 2px; box-shadow: 0 0 0 4px rgba(0, 123, 255, 0.25); /* Un brillo sutil adicional */ }tabindex con precaución:tabindex="0": permite que un elemento que normalmente no es enfocable (como un <div> con un evento de clic) se incluya en el orden natural de tabulación. <div tabindex="0" role="button" onclick="miFuncion()">Acción</div>tabindex="-1": permite que un elemento sea enfocable mediante programación (con JavaScript, usando elemento.focus()), pero lo excluye del orden de tabulación natural. Útil para gestionar el foco en componentes dinámicos.tabindex con valores positivos (ej. tabindex="1", tabindex="2"), ya que crean un orden de tabulación confuso y poco mantenible.<body> que permita a los usuarios saltar directamente al contenido principal. Este enlace puede estar oculto visualmente hasta que recibe el foco. <body> <a href="#contenido-principal" class="skip-link">Saltar al contenido principal</a> <header> </header> <main id="contenido-principal"> </main> </body> CSS.skip-link { position: absolute; top: -40px; /* Oculto fuera de la pantalla */ left: 0; background: #000; color: white; padding: 8px; z-index: 100; } .skip-link:focus { top: 0; /* Visible al recibir foco */ }Siguiendo estos puntos, mejorarás significativamente la navegabilidad por teclado de tu sitio.
Existen varias herramientas que te ayudarán a evaluar y mejorar la accesibilidad de tu HTML. Combinar varias de ellas suele dar los mejores resultados.
Aquí tienes algunas categorías y ejemplos:
eslint-plugin-jsx-a11y si trabajas con React).Recuerda que ninguna herramienta automática puede detectar todos los problemas de accesibilidad. Son una ayuda excelente, pero siempre es recomendable complementarlas con pruebas manuales y, si es posible, con usuarios reales con diversidad funcional.
El «focus management» o «gestión del foco» se refiere al control consciente de qué elemento de tu página web tiene la atención del teclado en un momento dado y cómo se transfiere ese foco entre elementos. Es fundamental para la accesibilidad, especialmente para usuarios que navegan exclusivamente con teclado o utilizan lectores de pantalla.
¿Por qué es importante para la accesibilidad?
Los usuarios de teclado necesitan que el foco se mueva de manera lógica y predecible para poder interactuar con todos los elementos interactivos. Los lectores de pantalla, a su vez, suelen anunciar el elemento que recibe el foco. Una mala gestión puede hacer que los usuarios se pierdan, no puedan acceder a ciertas partes de la web o se sientan desorientados si el foco salta inesperadamente.
Relación con HTML:
HTML proporciona las bases para la gestión del foco:
<a> con href), botones (<button>), y controles de formulario (<input>, <select>, <textarea>, <summary>) son naturalmente enfocables y se incluyen en el orden de tabulación secuencial del documento.tabindex:tabindex="0": Permite que elementos que no son interactivos por naturaleza (como un <div> que actúa como botón mediante JavaScript) reciban foco secuencialmente con el teclado. HTML<div id="miBotonCustom" tabindex="0" role="button">Púlsame</div>tabindex="-1": Hace que un elemento pueda recibir foco mediante programación (usando JavaScript: elemento.focus()), pero lo excluye del orden de tabulación natural. Es muy útil para dirigir el foco a elementos dinámicos como ventanas modales, mensajes de error o contenido que aparece y desaparece. HTML<div id="miModal" tabindex="-1" role="dialog">Contenido del modal</div>tabindex con valores positivos (ej. tabindex="1"), ya que alteran el orden natural de forma que suele ser confusa y difícil de mantener.El papel de JavaScript:
Mientras HTML define qué puede recibir foco, JavaScript es a menudo necesario para gestionar activamente dónde y cuándo se mueve el foco, especialmente en interfaces dinámicas:
Una buena gestión del foco implica que sea visible, predecible y que, en componentes como modales, esté contenido.
El HTML semántico consiste en utilizar las etiquetas HTML según su significado y propósito, no solo por cómo se ven. Esto es increíblemente útil para los lectores de pantalla, que son programas que convierten el contenido de la pantalla en voz o braille para usuarios con discapacidad visual.
Así es como el HTML semántico ayuda específicamente:
<header>, <footer>, <nav>, <main>, <article>, <section> y <aside> definen las diferentes regiones de una página. Los lectores de pantalla reconocen estas regiones, permitiendo a los usuarios entender rápidamente la disposición del contenido y navegar directamente a secciones específicas (por ejemplo, «saltar a la navegación principal» o «ir al contenido principal»). <body> <header>...</header> <nav>...</nav> <main> <article>...</article> </main> <footer>...</footer> </body><h1> a <h6>) crean una jerarquía de contenido. Los usuarios de lectores de pantalla pueden listar todos los encabezados y saltar al que les interese, facilitando la «lectura rápida» de la página.<ul> o <ol>) se anuncia como tal, indicando el número de elementos, lo que da contexto antes de leer los ítems.<table>, con <caption>, <th> para encabezados de tabla y scope para asociarlos) son interpretadas correctamente, permitiendo al usuario entender las relaciones entre filas y columnas.<strong> (importancia) o <em> (énfasis) pueden ser comunicadas por el lector de pantalla con una inflexión de voz diferente.<button> se anuncia como «botón», y un enlace (<a>) como «enlace», indicando su interactividad y propósito. Si usaras un <div> estilizado como botón, el lector de pantalla podría no identificarlo como un elemento interactivo a menos que añadas atributos ARIA.navigation. Esto significa menos trabajo para ti al no tener que añadir explícitamente estos roles.Si en lugar de usar HTML semántico, construyes tu página usando solo <div> y <span> con clases CSS para la apariencia, un lector de pantalla vería una estructura plana y sin significado. El usuario tendría dificultades para distinguir un encabezado de un párrafo, o una barra de navegación de un pie de página, haciendo la experiencia de navegación tediosa y confusa.
En resumen, el HTML semántico proporciona un mapa claro y significativo de tu contenido, que los lectores de pantalla utilizan para ofrecer una experiencia de usuario mucho más rica y eficiente.
Los formularios accesibles son cruciales para que todos los usuarios puedan interactuar con tu sitio. Aquí tienes las consideraciones más importantes:
<label>) claras y asociadas: cada control de formulario (<input>, <textarea>, <select>) necesita una etiqueta descriptiva. Asócialas correctamente usando el atributo for en la etiqueta, que coincida con el id del control, o envolviendo el control con la etiqueta. <label for="nombre">Nombre:</label> <input type="text" id="nombre" name="nombre"> <input type="checkbox" id="acepto" name="acepto_terminos"> <label for="acepto">Acepto los términos y condiciones</label><fieldset> y <legend>): cuando tengas un grupo de controles relacionados (como varios botones de radio para una misma pregunta), agrúpalos con <fieldset> y proporciona un título para el grupo con <legend>. <fieldset> <legend>Tipo de notificación preferida:</legend> <input type="radio" id="email" name="notificacion" value="email"> <label for="email">Correo electrónico</label> <br> <input type="radio" id="sms" name="notificacion" value="sms"> <label for="sms">SMS</label> </fieldset>required en el control del formulario. Para mayor robustez, considera aria-required="true". <label for="correo">Correo electrónico <span aria-hidden="true">*</span>:</label> <input type="email" id="correo" name="correo" required aria-required="true">aria-describedby para que los lectores de pantalla los anuncien. El foco debería moverse al primer campo con error tras un intento de envío fallido.placeholder desaparece al escribir y no es un sustituto accesible para una <label>. Úsalo solo para sugerencias o ejemplos de formato.Prestando atención a estos puntos, tus formularios serán mucho más usables para personas con diversas capacidades.
Crear un formulario básico en HTML es sencillo. La estructura fundamental se basa en la etiqueta <form>, que englobará todos los campos y el botón de envío. Aquí te muestro los pasos y un ejemplo:
<form>: action: Especifica la URL a la que se enviarán los datos del formulario cuando se envíe. Si quieres procesarlo en la misma página o con JavaScript, puedes dejarlo vacío o usar "#".method: Indica el método HTTP que se usará para enviar los datos. Los más comunes son GET (los datos se añaden a la URL, útil para búsquedas) y POST (los datos se envían en el cuerpo de la petición, útil para datos sensibles o formularios más largos).<label>) y campos de entrada (<input>):<label> asociada para mejorar la accesibilidad. La asociación se hace mediante el atributo for en <label> que coincide con el id del <input>.name en cada <input> es crucial, ya que será el nombre de la variable que contenga el dato enviado al servidor.type en <input> define el tipo de campo (texto, email, contraseña, etc.).<button type="submit"> o <input type="submit">.Aquí tienes un ejemplo básico de un formulario de contacto:
<form action="/procesar-formulario" method="post">
<div>
<label for="nombre">Nombre:</label>
<input type="text" id="nombre" name="usuario_nombre" required>
</div>
<div>
<label for="email">Correo electrónico:</label>
<input type="email" id="email" name="usuario_email" required>
</div>
<div>
<label for="mensaje">Mensaje:</label>
<textarea id="mensaje" name="usuario_mensaje" rows="5" required></textarea>
</div>
<div>
<input type="checkbox" id="suscripcion" name="usuario_suscripcion" value="si">
<label for="suscripcion">Suscribirme al boletín</label>
</div>
<button type="submit">Enviar mensaje</button>
</form>
Lenguaje del código: PHP (php)En este ejemplo:
<div> para agrupar cada par de etiqueta y campo, lo que ayuda a la estructura y al estilo (aunque no es estrictamente necesario para la funcionalidad básica).required es un atributo booleano que indica que el campo debe ser rellenado antes de enviar el formulario.textarea permite introducir múltiples líneas de texto.checkbox permite una opción de sí/no.Este es un punto de partida. Puedes añadir muchos más tipos de campos y atributos para formularios más complejos.
La etiqueta <form> en HTML posee varios atributos que controlan su comportamiento y cómo se envían los datos. Aquí te presento los más importantes:
<form action="/procesar-datos">GET: Los datos del formulario se añaden a la URL especificada en el atributo action como una cadena de consulta (query string). Es el método por defecto si no se especifica. Útil para formularios de búsqueda o cuando los datos no son sensibles.POST: Los datos del formulario se envían en el cuerpo de la petición HTTP. Es más seguro para enviar información sensible (como contraseñas) y permite enviar mayor cantidad de datos, además de archivos. <form action="/registro" method="post">application/x-www-form-urlencoded: Valor por defecto. Todos los caracteres se codifican antes de ser enviados (los espacios se convierten en «+», los caracteres especiales se convierten a valores hexadecimales ASCII).multipart/form-data: Necesario si el formulario incluye campos de subida de archivos (<input type="file">).text/plain: Los datos se envían sin ninguna codificación. No se recomienda su uso general.<form action="/suscribir" method="post" novalidate>_self: (Valor por defecto) Carga la respuesta en el mismo marco o ventana._blank: Carga la respuesta en una nueva ventana o pestaña._parent: Carga la respuesta en el marco padre._top: Carga la respuesta en el cuerpo completo de la ventana.Estos son los atributos que más utilizarás. Conocerlos bien te permitirá gestionar tus formularios de manera eficaz.
La etiqueta <input> es muy versátil gracias a su atributo type. Este atributo define cómo se verá y comportará el campo de entrada.
Aquí tienes algunos de los tipos más comunes que encontrarás y usarás en tus formularios HTML:
text: El tipo por defecto. Un campo de texto de una sola línea para introducir texto genérico. <label for="nombre">Nombre:</label> <input type="text" id="nombre" name="nombre_usuario">password: Similar a text, pero los caracteres introducidos se ocultan (normalmente con asteriscos o puntos) por seguridad. <label for="contrasena">Contraseña:</label> <input type="password" id="contrasena" name="clave">email: Diseñado para direcciones de correo electrónico. Los navegadores pueden realizar una validación básica del formato y, en dispositivos móviles, suelen mostrar un teclado optimizado.number: Para introducir números. A menudo muestra controles para incrementar o decrementar el valor y permite atributos como min, max y step.date: Proporciona un selector de fecha nativo del navegador, facilitando la elección de una fecha. Otros relacionados son time, datetime-local, month, week.checkbox: Permite al usuario seleccionar cero, una o más opciones de un conjunto. Cada checkbox es independiente a menos que se gestione con JavaScript. <input type="checkbox" id="terminos" name="acepta_terminos" value="si"> <label for="terminos">Acepto los términos</label>radio: Permite al usuario seleccionar solo una opción de un grupo de opciones mutuamente excluyentes. Todos los botones de radio de un mismo grupo deben compartir el mismo atributo name. <input type="radio" id="opcion1" name="eleccion" value="1"> <label for="opcion1">Opción 1</label> <input type="radio" id="opcion2" name="eleccion" value="2"> <label for="opcion2">Opción 2</label>file: Permite al usuario seleccionar uno o más archivos de su dispositivo para ser enviados al servidor (requiere enctype="multipart/form-data" en la etiqueta <form>).submit: Crea un botón que, al pulsarlo, envía el formulario a la URL especificada en el atributo action del formulario. El texto del botón se define con el atributo value.reset: Crea un botón que restablece todos los campos del formulario a sus valores iniciales.button: Crea un botón genérico sin comportamiento predeterminado. Se suele utilizar junto con JavaScript para ejecutar acciones personalizadas.HTML5 introdujo muchos más tipos (como search, tel, url, color, range) que ofrecen mejor semántica y experiencias de usuario más ricas con interfaces nativas. Recuerda siempre asociar una <label> a cada campo de entrada para una buena accesibilidad.
HTML5 enriqueció enormemente las capacidades de los formularios al introducir una variedad de nuevos tipos para la etiqueta <input>. Estos tipos no solo aportan valor semántico, sino que también mejoran la experiencia de usuario al ofrecer controles nativos y, en muchos casos, validación incorporada por el navegador.
Aquí tienes los más destacados:
email: Para direcciones de correo electrónico. Los navegadores suelen validar el formato básico y los dispositivos móviles pueden mostrar un teclado optimizado. <label for="correo">Email:</label> <input type="email" id="correo" name="usuario_email">url: Para direcciones web (URL). Similar a email, puede tener validación de formato y teclado adaptado.tel: Para números de teléfono. No impone un formato específico (dada la variedad internacional), pero puede optimizar el teclado en móviles.number: Para la entrada de números. Permite atributos como min, max y step, y los navegadores suelen mostrar controles para aumentar/disminuir el valor.range: Representa un control para seleccionar un valor numérico dentro de un rango definido (un «slider» o deslizador). <label for="vol">Volumen:</label> <input type="range" id="vol" name="volumen" min="0" max="100">date: Proporciona un selector de fecha nativo.time: Ofrece un selector de hora.datetime-local: Permite seleccionar una fecha y hora específicas, sin información de zona horaria.month: Para seleccionar un mes y año.week: Para seleccionar una semana y año.search: Destinado a campos de búsqueda. Funcionalmente similar a text, pero puede tener un estilo diferente o incluir un icono para borrar el contenido en algunos navegadores.color: Proporciona un selector de color nativo del navegador. <label for="colorfav">Color favorito:</label> <input type="color" id="colorfav" name="color_favorito">La principal ventaja de estos nuevos tipos es que los navegadores pueden ofrecer interfaces de usuario más ricas y adaptadas al tipo de dato, mejorando la usabilidad y reduciendo la necesidad de widgets personalizados con JavaScript para tareas comunes. Y como siempre, recuerda usar una <label> para cada input por accesibilidad.
La etiqueta <label> es fundamental en los formularios HTML para asociar un texto descriptivo con un control de formulario específico (como <input>, <textarea> o <select>). Esta asociación mejora tanto la usabilidad como la accesibilidad de tus formularios.
Hay dos maneras principales de usar la etiqueta <label>:
for en la etiqueta <label> y el atributo id en el control del formulario. El valor del atributo for debe coincidir exactamente con el valor del atributo id del campo al que está asociado. <div> <label for="nombre_usuario">Nombre de usuario:</label> <input type="text" id="nombre_usuario" name="username"> </div> <div> <input type="checkbox" id="acepto_terminos" name="terminos"> <label for="acepto_terminos">Acepto los términos y condiciones</label> </div><label>. No necesitas los atributos for ni id para la asociación, aunque sigue siendo buena práctica incluir un id en el control para otros propósitos (como JavaScript o CSS). <label> Correo electrónico: <input type="email" name="email_usuario"> </label> <label> <input type="radio" name="opcion" value="si"> Sí </label>Aunque ambas formas son válidas, generalmente se prefiere la asociación explícita con for e id por su robustez y flexibilidad.
Usar <label> correctamente es un paso sencillo pero muy importante para crear formularios accesibles y fáciles de usar.
Para agrupar campos relacionados dentro de un formulario HTML, mejorando tanto la organización visual como la accesibilidad, debes usar las etiquetas <fieldset> y <legend>.
¿Por qué agrupar campos?
<legend> antes de leer las opciones individuales.Aquí tienes un ejemplo práctico:
<form action="/procesar" method="post">
<fieldset>
<legend>Datos personales</legend>
<div>
<label for="nombre">Nombre:</label>
<input type="text" id="nombre" name="nombre_usuario">
</div>
<div>
<label for="email">Correo electrónico:</label>
<input type="email" id="email" name="email_usuario">
</div>
</fieldset>
<fieldset>
<legend>Preferencias de notificación</legend>
<div>
<input type="radio" id="notif_email" name="notificacion" value="email" checked>
<label for="notif_email">Recibir por correo electrónico</label>
</div>
<div>
<input type="radio" id="notif_sms" name="notificacion" value="sms">
<label for="notif_sms">Recibir por SMS</label>
</div>
<div>
<input type="radio" id="notif_no" name="notificacion" value="ninguna">
<label for="notif_no">No recibir notificaciones</label>
</div>
</fieldset>
<button type="submit">Enviar</button>
</form>
Lenguaje del código: PHP (php)En este ejemplo, los «datos personales» y las «preferencias de notificación» están claramente separados en sus respectivos <fieldset>, cada uno con una <legend> descriptiva. Por defecto, los navegadores suelen dibujar un borde alrededor del <fieldset>, pero puedes modificarlo con CSS si lo deseas.
HTML5 trajo consigo la validación de formularios integrada en el navegador, lo que te permite realizar comprobaciones básicas en los datos introducidos por el usuario antes de enviarlos al servidor. Esto mejora la experiencia de usuario al proporcionar retroalimentación inmediata.
La validación se realiza principalmente mediante atributos específicos en las etiquetas <input>, <select> y <textarea>:
<label for="nombre">Nombre (obligatorio):</label> <input type="text" id="nombre" name="nombre_usuario" required><label for="correo">Email:</label> <input type="email" id="correo" name="usuario_email"><label for="cp">Código Postal (5 dígitos):</label> <input type="text" id="cp" name="codigo_postal" pattern="[0-9]{5}" title="Introduce 5 dígitos numéricos."> title es útil aquí para explicar el formato esperado al usuario si la validación falla.¿Cómo funciona?
Cuando el usuario intenta enviar el formulario, el navegador comprueba estas reglas. Si alguna validación falla, el envío se detiene y el navegador suele mostrar un mensaje de error junto al primer campo inválido, además de poner el foco en él.
Personalización y anulación:
setCustomValidity().novalidate a la etiqueta <form>: <form novalidate>.Importante: La validación HTML5 es una excelente mejora para la experiencia del usuario, pero siempre debes implementar validación en el lado del servidor. La validación del cliente puede ser eludida, por lo que la del servidor es crucial para la seguridad y la integridad de los datos.
La etiqueta <output> es un elemento introducido en HTML5 que se utiliza para mostrar el resultado de un cálculo o una acción del usuario, generalmente dentro de un formulario.
Su propósito es semántico: indicar que el contenido de esta etiqueta es una salida de datos generada por la interacción del usuario con otros controles.
Características principales de <output>:
for.Atributos comunes:
for: Contiene una lista de ids (separados por espacios) de otros elementos del formulario cuyos valores se utilizaron en el cálculo del resultado. Esto crea una relación explícita que puede ser útil para las tecnologías de asistencia.form: Asocia el elemento <output> con un formulario específico (mediante el id del formulario). Útil si <output> no está anidado directamente dentro del <form>.name: Al igual que otros controles de formulario, el name permite que el valor del <output> sea enviado junto con el formulario (aunque su uso principal es para mostrar resultados en la página, no necesariamente para enviar su valor).Ejemplo de uso:
Imagina un formulario donde el usuario selecciona un valor en un control deslizante (<input type="range">) y quieres mostrar ese valor numéricamente, o el resultado de una operación con él.
<form oninput="resultado.value = parseInt(a.value) + parseInt(b.value)">
<fieldset>
<legend>Suma de dos números:</legend>
<label for="num_a">Número A:</label>
<input type="number" id="num_a" name="a" value="50">
+
<label for="num_b">Número B:</label>
<input type="number" id="num_b" name="b" value="50">
=
<output name="resultado" for="num_a num_b">100</output>
</fieldset>
</form>
Lenguaje del código: PHP (php)En este ejemplo sencillo:
number (num_a y num_b).<output> tiene el name="resultado" y el atributo for="num_a num_b", indicando que su valor depende de esos dos campos.oninput en la etiqueta <form> ejecuta un pequeño script de JavaScript cada vez que cambia el valor de cualquier control dentro del formulario. Este script calcula la suma de a.value y b.value y actualiza el value (contenido) del elemento output llamado resultado. (Nota: parseInt() se usa para asegurar que los valores se traten como números enteros para la suma).La etiqueta <output> ayuda a crear formularios más interactivos y semánticamente correctos, dejando claro qué partes del formulario muestran resultados generados por el usuario.
La etiqueta <button> se utiliza para crear botones interactivos en tus páginas web. Es más versátil de lo que parece a primera vista, especialmente cuando la comparamos con <input type="submit">.
Etiqueta <button>
type.type:submit: (Comportamiento por defecto si <button> está dentro de un <form>) Envía los datos del formulario.reset: Restablece los campos del formulario a sus valores iniciales.button: No tiene comportamiento predeterminado. Se usa principalmente para activar acciones mediante JavaScript.<button> puede contener HTML enriquecido en su interior, como texto, imágenes, iconos (<span>, <img>, iconos SVG, etc.). <button type="submit" name="enviar_formulario"> Enviar <img src="icono_enviar.png" alt=""> </button> <button type="button" onclick="miFuncion()"> Púlsame <span style="color:red;">Ahora</span> </button>Etiqueta <input type="submit">
value. No puede contener HTML interno. Su apariencia es más limitada. <input type="submit" value="Enviar Pedido">Diferencias clave:
<button>: Permite HTML complejo (texto, imágenes, etc.), lo que facilita la creación de botones visualmente atractivos y accesibles (por ejemplo, con iconos y texto).<input type="submit">: Solo puede mostrar el texto plano asignado a su atributo value.type:<button>: Puede ser submit, reset o button (para JavaScript).<input type="submit">: Está específicamente diseñado para enviar formularios. Existen otros tipos de <input> como type="reset" y type="button", pero la etiqueta <button> a menudo los reemplaza por su flexibilidad de contenido.<button> puede contener otros elementos HTML, es generalmente más fácil de estilizar con CSS para lograr diseños complejos.¿Cuándo usar cada uno?
<button>: Es la opción preferida en HTML moderno para la mayoría de los casos, especialmente si necesitas un diseño personalizado, iconos, o si quieres un botón que no sea de tipo submit (como type="button" para acciones de JavaScript). <button type="submit"> es la opción más flexible.<input type="submit">: Puede ser suficiente para formularios muy simples donde un botón de texto básico es todo lo que necesitas, o si estás trabajando con código heredado.En general, <button> te ofrece mayor control y flexibilidad semántica y de presentación.
Incrustar un vídeo en tu página con la etiqueta <video> de HTML5 es bastante sencillo y te da mucho control sobre la reproducción.
src directamente en la etiqueta <video> para enlazar a tu archivo de vídeo. <video src="mi_video.mp4"></video> <source>.<video> <source src="mi_video.mp4" type="video/mp4"> <source src="mi_video.webm" type="video/webm"> Tu navegador no soporta la etiqueta de vídeo. </video> <video> y </video> (después de las etiquetas <source>) se mostrará si el navegador no admite la reproducción de vídeo HTML5.<video>:controls: Imprescindible. Añade los controles de reproducción predeterminados del navegador (play/pausa, volumen, pantalla completa, barra de progreso). <video controls> <source src="mi_video.mp4" type="video/mp4"> </video>width y height: Especifican las dimensiones del reproductor de vídeo en píxeles. <video width="640" height="360" controls> <source src="mi_video.mp4" type="video/mp4"> </video>autoplay: Hace que el vídeo comience a reproducirse automáticamente tan pronto como sea posible. autoplay con sonido o solo lo permiten si el vídeo está silenciado (muted). Úsalo con consideración hacia la experiencia del usuario.muted: Silencia el audio del vídeo por defecto. A menudo necesario para que autoplay funcione.loop: Hace que el vídeo se reproduzca en bucle continuamente.poster="imagen.jpg": Muestra una imagen (la URL especificada) mientras el vídeo se está cargando o hasta que el usuario pulse «play».preload: Indica al navegador cómo debe cargar el vídeo. Valores:auto (el navegador carga lo que considera necesario, incluso el vídeo completo).metadata (carga solo los metadatos del vídeo: dimensiones, duración, etc.).none (no precarga nada hasta que el usuario lo inicie).<video controls> <source src="mi_video.mp4" type="video/mp4"> <track src="subtitulos_es.vtt" kind="subtitles" srclang="es" label="Español"><track src="subtitulos_en.vtt" kind="subtitles" srclang="en" label="English"></video>Ejemplo completo:
<video width="720" height="480" controls poster="poster_del_video.jpg" preload="metadata">
<source src="mi_video_genial.mp4" type="video/mp4">
<source src="mi_video_genial.webm" type="video/webm">
<track src="subtitulos_es.vtt" kind="subtitles" srclang="es" label="Español" default>
<track src="capitulos_video.vtt" kind="chapters" srclang="es">
Lo sentimos, tu navegador no soporta vídeos HTML5. Puedes <a href="mi_video_genial.mp4">descargarlo aquí</a>.
</video>
Lenguaje del código: PHP (php)Con estos elementos y atributos, puedes incrustar vídeos de manera efectiva y accesible en tus páginas web.
Reproducir audio de forma nativa en HTML5 es muy similar a cómo se incrustan vídeos, pero usando la etiqueta <audio>. Esto te permite añadir sonido a tus páginas sin necesidad de «plugins» externos.
<audio src="mi_cancion.mp3"></audio> <source>.<audio> <source src="mi_audio.mp3" type="audio/mpeg"> <source src="mi_audio.ogg" type="audio/ogg"> Tu navegador no soporta la etiqueta de audio. </audio> <audio> y </audio> (después de cualquier etiqueta <source>) se mostrará si el navegador del usuario no es compatible con la etiqueta <audio>.<audio>:controls: Es fundamental. Añade los controles de reproducción de audio predeterminados del navegador (como play/pausa, barra de progreso, control de volumen). <audio controls> <source src="mi_audio.mp3" type="audio/mpeg"> </audio>autoplay: Intenta que el audio comience a reproducirse automáticamente en cuanto se pueda.autoplay para evitar molestias al usuario, especialmente si no hay interacción previa en la página o si el audio no está silenciado.muted: Silencia el audio por defecto.loop: Hace que el audio se reproduzca continuamente en bucle.preload: Sugiere al navegador cómo debe cargar el archivo de audio cuando se carga la página. Los valores posibles son:auto: El navegador carga el archivo de audio completo si lo considera apropiado.metadata: Carga solo los metadatos del audio (como la duración).none: El navegador no precarga el archivo de audio. El audio solo se carga cuando el usuario inicia la reproducción.Ejemplo completo:
<audio controls preload="metadata">
<source src="mi_podcast_episodio1.mp3" type="audio/mpeg">
<source src="mi_podcast_episodio1.ogg" type="audio/ogg">
<source src="mi_podcast_episodio1.wav" type="audio/wav">
Tu navegador no es compatible con la reproducción de audio HTML5.
Puedes <a href="mi_podcast_episodio1.mp3">descargar el archivo MP3</a> en su lugar.
</audio>
Lenguaje del código: PHP (php)Este ejemplo ofrece el audio en tres formatos diferentes para maximizar la compatibilidad, incluye controles para el usuario, sugiere al navegador que solo precargue los metadatos y proporciona un enlace de descarga como alternativa.
Una «imagen adaptable» (o «responsive image» en inglés) es una imagen que se ajusta y optimiza automáticamente según las características del dispositivo del usuario, como el tamaño de la pantalla, la resolución (densidad de píxeles) y, a veces, la orientación o el formato de imagen soportado.
El objetivo principal es doble:
HTML5 proporciona dos mecanismos principales para implementar imágenes adaptables:
1. El atributo srcset y sizes en la etiqueta <img>:
Este enfoque es ideal para «cambio de resolución», es decir, servir la misma imagen pero en diferentes tamaños o densidades.
srcset: Define una lista de posibles fuentes de imagen y sus características. Puede usar:imagen-300w.jpg 300w, imagen-600w.jpg 600w): El navegador elige basándose en el tamaño de la imagen en el «viewport» y la resolución de la pantalla.imagen-1x.jpg 1x, imagen-2x.jpg 2x): Para pantallas con diferentes densidades de píxeles.sizes: Informa al navegador sobre el tamaño que ocupará la imagen en la pantalla en diferentes condiciones de «viewport» (usando media queries). Esto ayuda al navegador a seleccionar la fuente más adecuada de srcset cuando se usan descriptores de ancho.<img srcset="elva-fairy-320w.jpg 320w,
elva-fairy-480w.jpg 480w,
elva-fairy-800w.jpg 800w"
sizes="(max-width: 320px) 280px,
(max-width: 480px) 440px,
800px"
src="elva-fairy-800w.jpg" alt="Elva vestida de hada">
Lenguaje del código: PHP (php)2. La etiqueta <picture>:
Esta etiqueta es más potente y se usa para «dirección de arte», donde quieres mostrar imágenes completamente diferentes o diferentes formatos de imagen (como WebP o AVIF con un «fallback» a JPG/PNG) según el contexto.
Contiene uno o más elementos <source> y un elemento <img> de respaldo. Cada <source> puede tener:
media: Una media query para aplicar la fuente solo si se cumple la condición.srcset: Las fuentes de imagen para esa condición.type: El tipo MIME del formato de imagen (ej. image/webp).El navegador elige el primer <source> que cumpla las condiciones y cuyo formato soporte.
<picture>
<source media="(max-width: 799px)" srcset="elva-480w-close-portrait.jpg">
<source media="(min-width: 800px)" srcset="elva-800w.jpg">
<img src="elva-800w.jpg" alt="Elva sonriendo">
</picture>
Lenguaje del código: PHP (php)Usar imágenes adaptables es crucial para ofrecer una buena experiencia de usuario en la web moderna, independientemente del dispositivo que se utilice.
Puedes insertar código SVG (Scalable Vector Graphics) directamente en tu HTML. Esto se conoce como «SVG en línea» o «inline SVG». Simplemente copias el código del archivo SVG (que es un formato basado en XML) y lo pegas en tu documento HTML donde quieras que aparezca la imagen.
Ejemplo básico:
<body>
<p>Aquí hay un círculo SVG simple:</p>
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
<circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" />
<title>Círculo amarillo</title> </svg>
<p>Y aquí sigue el resto de tu contenido.</p>
</body>
Lenguaje del código: PHP (php)Ventajas de usar SVG en línea:
path, circle, rect, text) directamente desde tus hojas de estilo CSS o etiquetas <style>. :hover). /* En tu CSS */ svg .mi-circulo:hover { fill: red; } <svg> <circle class="mi-circulo" cx="50" cy="50" r="40" fill="blue" /> </svg><text>) es texto real, seleccionable y accesible para lectores de pantalla. Además, puedes incluir etiquetas como <title> (título corto) y <desc> (descripción larga) dentro del SVG para mejorar su accesibilidad.Consideraciones:
.svg externo. Si el mismo SVG se usa en muchas páginas, podría ser más eficiente cargarlo externamente para aprovechar la caché del navegador (a menos que la página HTML completa esté cacheada).En resumen, los SVG en línea son excelentes para iconos, logotipos y gráficos interactivos o que necesitan ser estilizados dinámicamente con CSS y JavaScript.
Aunque la forma fundamental de enlazar una hoja de estilos CSS a un documento HTML sigue siendo la etiqueta <link> dentro del <head>, HTML moderno y las prácticas de desarrollo actuales han introducido mejoras y estrategias más sofisticadas en cómo gestionamos y cargamos estos estilos.
<link rel="stylesheet" href="ruta/a/tu/estilo.css"> <link rel="preload" href="estilos-criticos.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> <noscript><link rel="stylesheet" href="estilos-criticos.css"></noscript>rel="preload" y as="style" le dicen al navegador que descargue el archivo CSS con alta prioridad pero sin bloquear el renderizado.onload cambia el atributo rel a stylesheet una vez cargado, aplicando así los estilos.<noscript> asegura que los estilos se carguen si JavaScript está desactivado. Esta técnica es especialmente útil para el CSS no crítico (el que no es necesario para el contenido «above the fold» o primer pliegue visible).<link rel="stylesheet" href="estilos-base.css"> <link rel="stylesheet" href="estilos-impresion.css" media="print"> <link rel="stylesheet" href="estilos-escritorio.css" media="(min-width: 1024px)"> <link rel="stylesheet" href="estilos-movil.css" media="(max-width: 768px)"> // Ejemplo conceptual de cómo se podría usar dentro de un Web Component const shadow = this.attachShadow({mode: 'open'}); shadow.innerHTML = ` <link rel="stylesheet" href="estilos-del-componente.css"> <p>Contenido del componente con estilos encapsulados.</p> `;En resumen, aunque el <link rel="stylesheet"> básico sigue siendo el pilar, HTML moderno y las tecnologías asociadas nos ofrecen herramientas más potentes para optimizar la carga de CSS (con preload), aplicar estilos condicionalmente (media) y modularizar nuestros estilos (Shadow DOM), todo ello contribuyendo a sitios web más rápidos y mejor estructurados.
HTML no introduce nuevas sintaxis de selectores CSS, ya que la definición de los selectores es responsabilidad de CSS. Sin embargo, HTML moderno sí ha mejorado la forma en que podemos seleccionar elementos al proporcionar estructuras y atributos más ricos y semánticos que sirven como mejores «enganches» (hooks) para los selectores CSS existentes y los nuevos que van surgiendo en las especificaciones de CSS.
/* Antes, con divs genéricos */ .encabezado-principal { /* ... */ } .contenido-principal { /* ... */ } /* Con HTML semántico moderno */ header { /* ... */ } main { /* ... */ }input como ganchos:input en HTML5 (como type="email", type="date", type="number", type="search", etc.) pueden ser seleccionados específicamente usando selectores de atributo:input[type="date"] { border-color: skyblue; }required, pattern, min, max) interactúan directamente con pseudo-clases de CSS como :required, :optional, :valid, :invalid, :in-range, :out-of-range, permitiéndote dar estilos basados en el estado de validación del campo:input:invalid { border-left: 5px solid red; } input:valid { border-left: 5px solid green; }role, aria-label, aria-describedby, aria-hidden, aria-invalid, etc., aunque su propósito principal es la accesibilidad, también pueden usarse como selectores de atributo en CSS. [role="alert"] { background-color: lightyellow; border: 1px solid orange; } [aria-hidden="true"] { display: none !important; /* Ojo con !important, usar con cautela */ }:is() y :where(): Permiten agrupar selectores de forma más concisa.:has() (el «selector padre»): Permite seleccionar un elemento basado en sus descendientes. <figure> que contiene una <figcaption>: figure:has(figcaption) { margin-bottom: 2em; }.:empty, :target, :not(), entre otras, pueden combinarse de formas más expresivas con una estructura HTML semántica.:host y :host-context() para estilizar el elemento anfitrión del shadow tree desde dentro. En resumen, HTML moderno no crea nueva sintaxis de selectores CSS, pero sí enriquece el «vocabulario» de elementos y atributos disponibles, lo que a su vez permite que los selectores CSS (tanto los clásicos como los más nuevos) se utilicen de manera más potente, semántica y mantenible.
JavaScript es fundamental para sacar el máximo partido a los nuevos elementos y características de HTML5, permitiendo crear experiencias web dinámicas e interactivas. La interacción se produce principalmente de dos maneras:
<article>, <section>, <nav>, <header>, <footer>, <aside>, etc.), son accesibles y manipulables por JavaScript usando las API del DOM. document.getElementById(), document.querySelector(), document.querySelectorAll().setAttribute(), getAttribute(), removeAttribute()).innerHTML, textContent, appendChild(), removeChild()).element.style o gestionando clases con element.classList).addEventListener()).let miVideo = document.querySelector('#miVideo'); // miVideo.play(); // console.log(miVideo.duration);let miLienzo = document.querySelector('#miCanvas'); let ctx = miLienzo.getContext('2d'); // ctx.fillStyle = 'green'; // ctx.fillRect(10, 10, 100, 100);show(), showModal() (para un diálogo modal que bloquea el resto de la interfaz) y close(). let miDialogo = document.querySelector('#miModal'); // miDialogo.showModal(); // miDialogo.close();input (ej. date, color, range), leer sus valores, y especialmente interactuar con la API de validación de restricciones de HTML5 (element.validity para ver el estado de validez, element.setCustomValidity('') para mensajes de error personalizados).<template> para declarar fragmentos de HTML inactivos que luego pueden ser clonados (content.cloneNode(true)) y activados (insertados en el DOM) para generar contenido dinámicamente.data-* personalizados en cualquier elemento son una forma moderna y estándar para que HTML almacene datos que JavaScript puede leer y escribir fácilmente a través de la propiedad dataset del elemento (element.dataset.miAtributo).En esencia, mientras HTML define la estructura y el significado, JavaScript proporciona la capacidad de manipular esa estructura y responder a las interacciones del usuario, aprovechando al máximo las capacidades que los nuevos elementos de HTML5 ofrecen.
La ubicación de tus etiquetas <script> de JavaScript puede tener un impacto significativo en el rendimiento de carga de tu página y en cómo interactúan con el DOM.
Tradicionalmente: Antes de cerrar </body> (Recomendado por defecto)
Durante mucho tiempo, la práctica recomendada ha sido colocar la mayoría de las etiquetas <script> justo antes del cierre de la etiqueta </body>.
...
<script src="mi-script.js"></script>
<script src="otro-script.js"></script>
</body>
</html>
Lenguaje del código: PHP (php)Razones para esta práctica:
<script> (sin atributos async o defer), detiene el análisis (parsing) del HTML y la renderización de la página para descargar, analizar y ejecutar el script. <head>, el usuario verá una página en blanco durante más tiempo mientras esto ocurre. <head> intenta acceder a un elemento que aún no ha sido creado, fallará.Alternativas modernas con atributos en el <head>: async y defer
HTML5 introdujo los atributos async y defer para las etiquetas <script>, que te dan más flexibilidad si prefieres (o necesitas) colocar tus scripts en el <head>:
<head>
...
<script src="script-independiente.js" async></script>
<script src="mi-script-principal.js" defer></script>
<script src="otro-script-que-depende-del-anterior.js" defer></script>
...
</head>
Lenguaje del código: PHP (php)defer:DOMContentLoaded.defer se ejecutan en el orden en que aparecen en el documento.async:async.Conclusión y recomendación actual:
<script ... defer> en el <head>: Para la mayoría de los scripts que necesitan el DOM o dependen del orden, esta es a menudo la mejor opción moderna. Permite que el navegador descubra y descargue los scripts antes, sin bloquear el renderizado.</body>: Sigue siendo una práctica sólida y segura, especialmente si no quieres preocuparte por async/defer o si tienes scripts que no son críticos para el renderizado inicial.<script ... async> en el <head>: Para scripts de terceros, independientes, donde el orden no importa.<script> sin async o defer en el <head> a menos que tengas una razón muy específica y bien entendida (por ejemplo, un script que deba modificar algo antes del primer renderizado, lo cual es poco común).Prioriza siempre la experiencia del usuario y el rendimiento de carga de la página.
Los «custom elements» (elementos personalizados), una parte fundamental de la tecnología de Web Components, transforman la manera de escribir HTML al permitirte extender el vocabulario de HTML con tus propias etiquetas. Esto conduce a un HTML más semántico, modular y reutilizable.
Así es como afectan la escritura de HTML:
<div class="tarjeta-usuario perfil-compacto"> <img src="avatar.jpg" alt="Avatar de Usuario" class="tarjeta-usuario-avatar"> <div class="tarjeta-usuario-info"> <h3 class="tarjeta-usuario-nombre">Nombre Usuario</h3> <p class="tarjeta-usuario-detalle">Detalles adicionales...</p> </div> </div><tarjeta-usuario nombre="Nombre Usuario" avatar="avatar.jpg" detalle="Detalles adicionales..." layout="compacto"> </tarjeta-usuario>mi-etiqueta).<dialogo-modal titulo="Confirmación"> <p>¿Estás seguro de que quieres continuar?</p> <button slot="acciones">Aceptar</button> </dialogo-modal>En resumen:
Los «custom elements» te permiten escribir un HTML más limpio, expresivo y semántico al crear tus propias etiquetas que representan componentes complejos de manera sencilla y declarativa.
Fomentan un enfoque de desarrollo basado en componentes, lo que mejora la organización, la reutilización y el mantenimiento de tu código HTML.
Sin embargo, es importante recordar que los «custom elements» requieren JavaScript para definir su comportamiento y «actualizar» las etiquetas personalizadas en el navegador.
La forma estándar y más recomendada para enlazar una hoja de estilos CSS externa a un documento HTML es utilizando la etiqueta <link> dentro de la sección <head> de tu HTML.
Así es como se hace:
estilos.css) con todas las reglas de estilo que deseas aplicar.<link> en el <head>: Dentro de la sección <head> de tu archivo HTML, añade una etiqueta <link> con los siguientes atributos:rel="stylesheet": Este atributo es fundamental. Le indica al navegador que el archivo enlazado es una hoja de estilos.href="ruta/al/archivo.css": Este atributo especifica la ruta (URL) hacia tu archivo CSS. Puede ser una ruta relativa (si el archivo CSS está en el mismo sitio web) o una URL absoluta (si enlazas a un archivo CSS alojado en otro servidor, como una CDN para «frameworks» CSS).Ejemplo:
Supongamos que tienes un archivo HTML llamado index.html y un archivo CSS llamado estilos.css ubicado en una carpeta llamada css que está al mismo nivel que tu index.html. La estructura de carpetas sería:
mi-proyecto/
├── index.html
└── css/
└── estilos.css
Lenguaje del código: PHP (php)En tu archivo index.html, el enlace se vería así:
<!DOCTYPE <strong>html</strong>>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mi Página Web</title>
<link rel="stylesheet" href="css/estilos.css">
</head>
<body>
<header>
<h1>Bienvenido a Mi Página</h1>
</header>
<main>
<p>Este es el contenido principal de mi página.</p>
</main>
<footer>
<p>© 2025 Mi Sitio Web</p>
</footer>
</body>
</html>
Lenguaje del código: PHP (php)¿Por qué en el <head>?
Colocar el enlace a tu CSS en el <head> permite que el navegador cargue y analice los estilos antes de empezar a renderizar el contenido del <body>.
Esto ayuda a evitar el «flash de contenido sin estilo» (FOUC), donde la página se muestra brevemente sin estilos antes de que el CSS se aplique, y asegura que los usuarios vean la página con su diseño correcto desde el inicio.
Aunque existen otras formas de aplicar CSS (como estilos internos con la etiqueta <style> o estilos en línea con el atributo style), enlazar una hoja de estilos externa con <link> es la práctica más común y recomendada para la mayoría de los proyectos, ya que promueve una mejor organización, mantenibilidad y permite que el CSS sea almacenado en caché por el navegador.
Puedes incluir CSS directamente en tu documento HTML de dos maneras principales, además de enlazar hojas de estilo externas.
<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <title>Mi Página con CSS Interno</title> <style> body { font-family: Arial, sans-serif; background-color: #f0f0f0; } h1 { color: navy; text-align: center; } p { color: darkslategray; } </style> </head> <body> <h1>Título de la Página</h1> <p>Este párrafo usa los estilos definidos en la etiqueta style.</p> </body> </html><!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <title>Mi Página con CSS en Línea</title> </head> <body> <h1 style="color: green; margin-left: 20px;">Este título tiene estilos en línea.</h1> <p style="font-size: 18px; font-style: italic;"> Este párrafo también tiene estilos aplicados directamente. </p> <p>Este párrafo no tiene estilos en línea.</p> </body> </html>Consideraciones:
<link rel="stylesheet" href="styles.css">) suele ser la mejor práctica. <style>) y luego los estilos externos, asumiendo selectores de igual peso.En resumen, sí puedes incluir CSS directamente en HTML, pero elige el método que mejor se adapte a tus necesidades, priorizando la mantenibilidad y el rendimiento.
HTML puede funcionar perfectamente por sí solo, sin necesidad de CSS ni de JavaScript.
De hecho, HTML (HyperText Markup Language) es la base fundamental de cualquier página web. Su propósito principal es estructurar el contenido y darle significado semántico.
Piensa en HTML como el esqueleto de tu página: define qué es un encabezado (<h1> a <h6>), qué es un párrafo (<p>), una lista (<ul>, <ol>), una imagen (<img>), un enlace (<a>), un formulario (<form>), etc.
¿Qué significa que HTML "funcione" sin CSS o JavaScript?
¿Qué aportan CSS y JavaScript entonces?
Puedes pensar en ello con una analogía:
Históricamente, la web comenzó solo con HTML. CSS y JavaScript se añadieron después para mejorar la apariencia y la funcionalidad.
El principio de «mejora progresiva» se basa en esta idea: empezar con un HTML sólido y funcional, y luego añadir capas de CSS y JavaScript para mejorar la experiencia.
Así que, sí, HTML es el cimiento y puede sostenerse por sí mismo para entregar contenido estructurado.
Escribir HTML limpio y mantenible es crucial para la colaboración, la accesibilidad y la salud a largo plazo de cualquier proyecto web. Aquí tienes algunas buenas prácticas esenciales:
<!DOCTYPE html>.<nav> para la navegación, <article> para contenido independiente, <aside> para contenido secundario, <button> para acciones, etc.<div>s).<h1> solo uno por página o sección principal, seguido de <h2>, <h3>, etc.).class="mi-clase").alt.<label> explícitamente con sus controles de formulario (<input>, <select>, etc.).style="...") y los manejadores de eventos en línea (onclick="...") siempre que sea posible. <html> (ej. <html lang="es">).<head> (ej. <meta charset="UTF-8">).Siguiendo estas prácticas, tu HTML será más fácil de entender, depurar y mantener por ti y por tu equipo.
Sí, en general, deberías preocuparte y evitar el uso de etiquetas HTML obsoletas.
Las etiquetas obsoletas son aquellas que formaban parte de versiones anteriores de HTML (como HTML4 o XHTML) pero que han sido eliminadas o desaconsejadas en HTML5 y estándares posteriores.
Usarlas puede traer varios problemas:
<font>, <center>). HTML moderno promueve la semántica para la estructura y CSS para la presentación. Estas viejas etiquetas no comunican significado a las tecnologías de asistencia y deben ser reemplazadas por CSS para lograr los efectos visuales deseados.Ejemplos comunes de etiquetas obsoletas y sus alternativas modernas:
<font> y <center>: Completamente obsoletas. Utiliza CSS para estilizar texto ( font-family, color, font-size, text-align, etc.) y para centrar elementos ( text-align: center; o margin: auto; para bloques).<frame>, <frameset>, <noframes>: Obsoletas. Para la estructura de la página, usa CSS (Flexbox, Grid). Si necesitas incrustar otro documento, considera <iframe> con precaución y por razones válidas.<big>, <strike>, <tt>: Reemplazadas por CSS o etiquetas semánticas como <strong>, <em>, <s> (si el tachado tiene significado semántico) o <code>.align, bgcolor, border="0" (en el contexto de tablas para layout), hspace, vspace en <img>, etc., son obsoletos. Su funcionalidad debe lograrse con CSS.¿Qué hacer?
Centrarte en los estándares actuales de HTML y CSS no solo asegura que tu sitio sea robusto y compatible, sino que también mejora su accesibilidad y mantenibilidad.
La estructura del DOM (Document Object Model), la representación jerárquica de tu HTML que el navegador crea, tiene un impacto directo y significativo en el rendimiento de tu web. Un DOM mal estructurado o demasiado complejo puede ralentizar tu sitio de varias maneras:
document.querySelector() o document.querySelectorAll() pueden tardar más en encontrar los elementos deseados si tienen que recorrer una estructura muy extensa.offsetHeight, offsetWidth) después de una modificación, pueden causar un reflujo.background-color, color, visibility). Aunque menos costosos que los reflujos, los repintados frecuentes también consumen recursos.Buenas prácticas para un DOM eficiente:
<div> si no es estrictamente necesario.<template>.DocumentFragment, por ejemplo) y luego añádelos de una vez. Ten cuidado al leer propiedades que fuerzan el layout en bucles.En resumen, un DOM más pequeño, menos profundo y bien estructurado es fundamental para una carga de página más rápida, interacciones más fluidas y una mejor experiencia de usuario general.
No, generalmente no es una buena práctica usar IDs o clases para cada elemento HTML de tu página. Hacerlo puede llevar a un HTML más inflado, a un CSS demasiado específico y a dificultar el mantenimiento. La clave está en el equilibrio y en usar cada herramienta para su propósito.
IDs (Identificadores)
pagina.html#seccion-unica).document.getElementById('miElementoUnico')).Clases
.boton-primario, .alerta-error)..texto-centrado, .oculto).document.querySelectorAll('.mi-clase')).¿Cuándo NO necesitas necesariamente un ID o una clase?
Aprovecha la potencia de CSS y la estructura de tu HTML:
body { font-family: Arial, sans-serif; margin: 0; } p { line-height: 1.6; } img { max-width: 100%; height: auto; }<nav> <ul> <li><a href="#">Enlace 1</a></li> </ul> </nav>/* No necesitas clases para cada 'ul', 'li' o 'a' dentro del nav */ nav ul { list-style-type: none; padding-left: 0; } nav a { text-decoration: none; color: #333; }input[type="text"] { border: 1px solid #ccc; } a[target="_blank"]::after { content: " (externo)"; }a:hover { color: darkblue; } li:nth-child(odd) { background-color: #f9f9f9; } p::first-letter { font-size: 1.5em; }¿Por qué evitar el exceso?
En resumen: Usa IDs con moderación para elementos únicos. Usa clases para estilos y comportamientos reutilizables. Pero antes de añadir un ID o una clase, considera si puedes lograr el mismo resultado de forma elegante usando selectores de tipo, combinadores o pseudo-clases/elementos basados en tu HTML semántico.
Sí, validar tu código HTML es una práctica muy importante y muy recomendable en el desarrollo web.
Validar HTML significa comprobar que tu código cumple con las reglas y la sintaxis definidas por los estándares oficiales del W3C (World Wide Web Consortium) y WHATWG, que son las organizaciones que desarrollan estas tecnologías. Puedes usar herramientas en línea, como el «W3C Markup Validation Service», para subir tu archivo HTML o pegar tu código y recibir un informe de errores o advertencias.
¿Por qué es tan importante validar tu HTML?
Si bien una página con HTML inválido podría «funcionar» visualmente en algunos navegadores, validar tu código es un paso crucial para asegurar la calidad, la robustez y la profesionalidad de tu trabajo. Es como revisar la ortografía y la gramática de un texto antes de publicarlo.
Existen varias herramientas que te ayudarán a validar tu código HTML y asegurarte de que cumple con los estándares. Aquí te presento algunas de las más comunes y efectivas:
validator.w3.org): Esta es la herramienta oficial y la más autorizada, proporcionada por el World Wide Web Consortium (W3C). Es el estándar de referencia. Te permite validar de tres maneras:.html directamente.validator.w3.org/nu/): Es la versión más moderna y activa del validador del W3C, con un excelente soporte para HTML5, ARIA y SVG. Es el motor que usa el validador principal del W3C.npm install -g htmlhint o npm install --save-dev htmlhint) y luego ejecutarlo desde la terminal contra tus archivos HTML (ej. htmlhint mi_pagina.html).html-validate es otro linter moderno que se puede ejecutar desde la terminal y es altamente configurable.Recomendación:
Empieza siempre con el W3C Markup Validation Service o el Nu Html Checker como tu fuente de verdad para la validación estándar. Complementa esto con una extensión en tu editor de código para obtener retroalimentación instantánea mientras trabajas. Esto te ayudará a mantener un código HTML limpio, robusto y compatible.
Optimizar tu HTML para que cargue más rápido es una parte importante del rendimiento web general. Aunque el HTML en sí mismo raramente es el culpable principal de la lentitud (comparado con imágenes pesadas o JavaScript voluminoso), hay varias prácticas que puedes seguir:
<div> innecesarios. Un DOM más pequeño se analiza y renderiza más rápido.<div>s.responsive images): Usa <picture> o <img> con los atributos srcset y sizes para servir imágenes del tamaño adecuado según el dispositivo del usuario.lazy loading): Añade loading="lazy" a tus etiquetas <img> e <iframe> para los elementos que están fuera de la vista inicial («below the fold»). Esto difiere su carga hasta que el usuario se desplace cerca de ellos. HTML<img src="imagen-grande.jpg" loading="lazy" alt="Descripción" width="600" height="400">width y height: En las etiquetas <img> (y <video>), define siempre los atributos width y height. Esto permite al navegador reservar el espacio adecuado, evitando saltos de diseño (CLS - Cumulative Layout Shift) y mejorando la experiencia de carga.<picture> para ofrecer formatos de imagen modernos y más eficientes como WebP o AVIF, con «fallbacks» a JPG/PNG.<head>. Considera cargar CSS crítico en línea o usar rel="preload" para CSS no esencial para el primer renderizado.defer o async para los scripts en el <head>, o colócalos justo antes de cerrar la etiqueta </body> si no usas estos atributos. defer es generalmente preferido para scripts que dependen del DOM.<style> o <script> directamente en tu HTML aumentan su tamaño y no se pueden cachear de forma independiente. Prefiere archivos externos, aunque pequeñas cantidades de CSS crítico en línea pueden ser beneficiosas.Aunque algunas de estas optimizaciones (como la compresión del servidor o el formato de las imágenes) no son cambios directos en cómo escribes el HTML, son cruciales para la velocidad con la que tu HTML y sus recursos asociados llegan y se procesan en el navegador del usuario.
El «prefetch» y el «preload» son directivas de «sugerencias de recursos» (resource hints) que puedes usar en HTML mediante la etiqueta <link>. Le indican al navegador qué recursos podrían ser necesarios pronto o en el futuro, permitiéndole optimizar su carga y mejorar el rendimiento percibido y real de tu sitio web.
rel="preload"
preload no ejecuta ni aplica el recurso; solo lo descarga y lo pone en la caché del navegador.@font-face.href: La ruta al recurso.as: Esencial. Especifica el tipo de contenido (style, script, font, image, fetch, document, worker, etc.). Ayuda al navegador a priorizar correctamente, aplicar la política de seguridad de contenido (CSP) adecuada y establecer las cabeceras Accept correctas.type (opcional): El tipo MIME del recurso (útil para fuentes, ej. type="font/woff2").crossorigin (opcional): Necesario si el recurso se carga desde un dominio diferente y requiere CORS (especialmente para fuentes).<head>
<link rel="preload" href="css/estilos-criticos.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="css/estilos-criticos.css"></noscript>
<link rel="preload" href="fuentes/mi-fuente.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="js/app-principal.js" as="script">
</head>
<body>
<script src="js/app-principal.js" defer></script>
</body>Lenguaje del código: PHP (php)Nota: Para CSS pre-cargado, necesitas cambiar rel='stylesheet' para aplicarlo. Para scripts, necesitas una etiqueta <script> para ejecutarlos.
rel="prefetch"
href: La ruta al recurso.as (opcional, pero puede ayudar): También puede indicar el tipo de recurso.<link rel="prefetch" href="/pagina-siguiente.html" as="document">
<link rel="prefetch" href="/js/script-pagina-siguiente.js" as="script">
<link rel="prefetch" href="/imagenes/imagen-comun-siguiente-pagina.jpg" as="image">Lenguaje del código: PHP (php)Si el usuario navega a /pagina-siguiente.html, los recursos pre-buscados ya podrían estar en la caché del navegador.
Diferencias clave:
| Característica | preload | prefetch |
| Prioridad | Alta | Baja |
| Uso | Recursos críticos para la página actual | Recursos para navegación futura |
| Alcance | Página actual | Próxima(s) página(s) |
as attr. | Obligatorio | Opcional (pero recomendado) |
Otras sugerencias de recursos relacionadas:
rel="preconnect": Inicia una conexión temprana (DNS, TCP, TLS) a un origen importante.rel="dns-prefetch": Realiza solo la resolución DNS para un origen de forma anticipada.Precauciones:
No abuses de preload ni prefetch. Pre-cargar demasiados recursos puede consumir innecesariamente el ancho de banda del usuario y los recursos del navegador, especialmente en conexiones móviles. Úsalos estratégicamente para los recursos más importantes.
Aunque el SEO técnico abarca muchos aspectos más allá del HTML (como la velocidad del servidor, sitemaps, robots.txt, etc.), puedes hacer bastante para mejorarlo usando únicamente HTML.
<h1> a <h6> de forma lógica y ordenada. Idealmente, un solo <h1> por página para el título principal, seguido de <h2> para subsecciones principales, y así sucesivamente. Esto ayuda a los motores de búsqueda a entender la estructura y la importancia del contenido.<main>, <article>, <section>, <nav>, <aside>, <header> y <footer>. Estos elementos proporcionan un significado contextual claro a las diferentes partes de tu página.<a>):rel="noopener" a los enlaces externos que abren en una nueva pestaña (target="_blank") por seguridad.rel="nofollow" si no quieres que se traspase «link equity» (aunque Google ahora lo toma más como una sugerencia).Un HTML bien estructurado, semántico y que utilice estas etiquetas correctamente sienta una base sólida para el SEO técnico de tu sitio.
Los problemas de codificación de caracteres, donde acentos, la letra «ñ», emojis u otros símbolos especiales se muestran incorrectamente (por ejemplo, como �, ñ, o secuencias extrañas), suelen ocurrir por una inconsistencia en cómo se guarda, se declara y se sirve el archivo HTML.
La solución más robusta y recomendada es usar UTF-8 de manera consistente en todo tu proceso:
<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <title>Mi Página Web</title> </head> <body> <p>Aquí van los acentos y la eñe: á, é, í, ó, ú, Ñ, ñ.</p> </body> </html> charset="UTF-8" le indica al navegador que debe interpretar el documento usando la codificación UTF-8. <head>, el navegador podría intentar adivinar la codificación o usar una por defecto que no coincida, causando los problemas.AddDefaultCharset UTF-8 a tu archivo .htaccess.charset utf-8; en tu configuración.header('Content-Type: text/html; charset=utf-8'); al principio de tus scripts.Pasos para solucionar problemas:
<meta charset="UTF-8"> esté presente y correcta en el <head>, y que el servidor envíe la cabecera HTTP adecuada (puedes comprobar esto usando las herramientas de desarrollo de tu navegador, en la pestaña «Red» o «Network», seleccionando el documento HTML y mirando las cabeceras de respuesta).utf8mb4 en MySQL para un soporte completo de Unicode).Entidades HTML (como último recurso):
Si por alguna razón muy específica no puedes usar UTF-8 o un carácter sigue dando problemas, puedes usar entidades HTML (ej. ñ para ñ, á para á, € para €). Sin embargo, con una configuración UTF-8 correcta, esto no suele ser necesario para caracteres comunes.
Adoptar UTF-8 de forma generalizada es la mejor manera de evitar estos problemas y asegurar que tu contenido se muestre correctamente para todos los usuarios, en todos los idiomas.
Que la validación de formularios HTML5 no funcione como esperas es un problema común. Aquí tienes una lista de las razones más frecuentes y cómo solucionarlas:
novalidate en la etiqueta <form>:novalidate, la validación nativa del navegador se desactiva por completo para ese formulario.novalidate de la etiqueta <form> si quieres que el navegador realice la validación.formnovalidate en el botón de envío:formnovalidate del botón si quieres que ese envío active la validación.<input>):required: ¿Está presente en los campos que deben ser obligatorios?input correcto: ¿Estás usando el type adecuado? Por ejemplo, type="email" para correos, type="url" para URLs, type="number" para números. Un <input type="text"> no validará un formato de email por sí solo.pattern: Si usas el atributo pattern para una expresión regular, asegúrate de que la expresión sea correcta y coincida con el formato que esperas.min, max, step: Para tipos numéricos o de fecha, verifica que estos valores sean correctos.minlength, maxlength: Para campos de texto, asegúrate de que las longitudes son las deseadas.event.preventDefault() en el evento submit: Si tienes un script que maneja el envío del formulario, podría estar llamando a event.preventDefault() incondicionalmente, lo que detendría el proceso de validación nativo antes de que pueda mostrar mensajes, o enviando los datos por AJAX sin permitir que el navegador valide.Pasos para depurar:
novalidate y formnovalidate como primer paso.Importante: Recuerda que la validación HTML5 es una validación del lado del cliente. Es una ayuda para la experiencia del usuario, pero siempre debes implementar una validación robusta en el lado del servidor, ya que la validación del cliente puede ser eludida.
Cuando una nueva etiqueta o atributo HTML no funciona en un navegador antiguo, es un desafío común. La estrategia general es asegurar que tu sitio siga siendo usable y accesible, aplicando principios de mejora progresiva (progressive enhancement) y degradación elegante (graceful degradation).
Aquí tienes varias técnicas y consideraciones:
fetch, Promise, o incluso para ciertos tipos de <input>.<article>, <section>, <header>, etc.). Sin esto, IE antiguo los trataría como elementos desconocidos, dificultando su estilización con CSS.Al combinar estas estrategias, puedes utilizar características HTML modernas mientras aseguras que tu sitio siga siendo funcional y accesible para usuarios con navegadores más antiguos.