Introducción a CSS

Cuando abrimos una página web en el navegador, éste interpreta el código HTML para entender qué contenido hay y qué significa cada parte (títulos, párrafos, enlaces, formularios, etc.).

Además de estructura y semántica, una página necesita presentacióny estilo visual (tipografías, tamaños, colores, márgenes, alineación, distribución en columnas, etc).

En los artículos sobre HTML se ha hablado de contenido, semántica y estructura pero nunca hablamos de aspecto visual o diseño. Esto se debe a que HTML, en las versiones más modernas y responsables con la accesibilidad, ha cedido toda la responsabilidad de definir el aspecto visual del contenido a la parte CSS de una página web.

Qué es CSS

CSS son las siglas de Cascading Style Sheets (Hojas de estilo en cascada).

Al igual que ocurre con HTML, CSS no es un lenguaje de programación. No ejecuta lógica como lo haría JavaScript; en su lugar, define reglas de estilo que el navegador aplica sobre los elementos HTML para controlar cómo se muestran en la pantalla.

La idea fundamental es separar responsabilidades entre las distintas partes de una página web. El código HTML describe el contenido y su estructura. El código CSS describe el aspecto visual y parte del comportamiento de presentación (por ejemplo, el diseño adaptable o ciertas animaciones). Por último, el código Javascript describe la funcionalidad y el dinamismo de la página.

Ejemplo básico en CSS

Un ejemplo típico es tener un fichero HTML y, aparte, un fichero CSS enlazado. Por ejemplo, un HTML clásico es:

<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Mi primera página con CSS</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<h1>Mi primera página</h1>
<p>Este es un párrafo con información.</p>
<a href="https://programaraciegas.net">Visitar el blog</a>
</body>
</html>

Y el contenido del fichero styles.css podría ser:

body {
font-family: system-ui, sans-serif;
line-height: 1.5;
}

h1 {
font-size: 2rem;
}

a {
text-decoration: underline;
}

Si guardamos ambos ficheros en la misma carpeta y abrimos el HTML en el navegador, veremos que el contenido es el mismo, pero con el aspecto definido por las reglas CSS.

Por qué estilos en cascada

El término cascading (en cascada) tiene una razón por la forma de aplicarse los estilos en un contenido. Cuando varias reglas podrían aplicarse al mismo elemento, CSS define un sistema para resolver conflictos (origen, orden, especificidad, importancia). 

Partes de una regla CSS

La unidad básica de CSS es la regla (a veces llamada ruleset). Una regla se compone de:

• Un selector, que indica a qué elementos se aplica.
• Un bloque de declaraciones, que indica qué propiedades se aplican y con qué valores.

Veamos un ejemplo simple:

p {
font-size: 1rem;
margin-bottom: 1rem;
}

En este caso:
• p es el selector: selecciona todos los párrafos.
• Dentro de { … } hay declaraciones.
• Cada declaración es un par propiedad: valor; como font-size: 1rem;.

Cómo se aplica CSS a una página web

Hay tres formas habituales de aplicar CSS:

Hoja de estilo externa

Es la forma más común y la recomendada por accesibilidad. Se enlaza desde el <head> de la página:

<link rel="stylesheet" href="styles.css">

Entre las ventajas encontramos la separación del diseño del contenido y permite reutilizar estilos en muchas páginas.

Estilos internos

Se escriben dentro de un bloque <style> en el <head>:

<style>
p { line-height: 1.6; }
</style>

Esto es útil para ejemplos o páginas muy pequeñas, pero no es reutilizable para otras páginas.

Estilos en línea

Se escriben directamente en el atributo style de un elemento del <body>: dentro de la estructura de contenidos de la página.

<p style="line-height: 1.6;">Texto</p>

Aunque este estilo se aplica al contenido, es la opción menos recomendable porque mezcla contenido y presentación y complica el mantenimiento de la página y su estructura.

Los selectores CSS

El selector es la condición que decide qué elementos reciben una regla. 
Los más utilizados son:

Selector por etiqueta

Afecta a todos los elementos de ese tipo:

p { ... }
h1 { ... }

Selector por clase

Afecta a elementos que tengan class=»…»:

.destacado { font-weight: bold; }

Y en HTML:

<p class="destacado">Texto importante</p>

Selector por id

Afecta a un único elemento con id=»…»:

#cabecera { ... }

En HTML:

<header id="cabecera">...</header>

En la práctica, para estilos suele preferirse clases antes que abusar de id, porque son más reutilizables en otros contenidos o componentes.

La cascada: qué pasa cuando hay conflicto

Es habitual que varias reglas intenten aplicar estilos al mismo elemento. CSS resuelve esto con la aplicación en cascada: el navegador decide qué declaración gana según el origen y el orden, y si hace falta entra en juego la especificidad del selector. 

Un ejemplo típico que nos podemos encontrar es:

p { color: black; }
.destacado { color: blue; }

Si un párrafo tiene class=»destacado», el color será azul porque .destacado es más específico que p.

La cascada es una de las razones por las que, al empezar con CSS, a veces parece que no se aplique correctamente a algunos contenidos. normalmente sí funciona, pero otra regla está ganando en prevalencia de la cascada.

Accesibilidad y CSS

CSS puede mejorar mucho la experiencia de navegación y la accesibilidad presente en la página web o romperla con facilidad. Un mal CSS es responsable de estas barreras de accesibilidad:

  • Contraste de color insuficiente entre texto y fondo. 
  • Eliminar el foco del teclado por estética. Evita hacer outline: none; sin ofrecer una alternativa visible.
  • No respetar preferencias del usuario, como reducir animaciones con prefers-reduced-motion. 
  • Uso de tipografía ilegible o no adaptable a las necesidades del usuario.

Estructurar el contenido textual en un documento HTML

Cuando una página HTML tiene una organización  por zonas(landmarks, secciones y encabezados), con la definición del mapa general para navegar, es necesario profundizar más en la organización de los contenidos textuales buscando cómo escribir HTML que se entienda bien tanto visualmente como con lector de pantalla, y que además sea fácil de mantener.

Semántica antes que estilo

Una idea que conviene repetir siempre es que en HTML no se dibuja la página, se describe qué es cada cosa.

El CSS se encarga de cómo se ve.

El objetivo con HTML es que el contenido tenga una estructura que se pueda comprender incluso si no hay estilos visuales, se navega por teclado o con lector de pantallas o se está accediendo desde un dispositivo móvil o de escritorio. 

Párrafos

El párrafo es la unidad mínima de texto con sentido propio. Si se está escribiendo frases que forman una idea, normalmente eso es un <p>.

Ejemplo

<p>HTML es un lenguaje de marcado. Su objetivo es describir el contenido de una página.</p>
<p>Cuando usamos elementos semánticos, hacemos que la web sea más navegable y accesible.</p>

Errores habituales

Muchos desarrolladores suelen usar <br> para construir párrafos pero <br> se debe utilizar para un salto de línea dentro de un mismo bloque, por ejemplo direcciones postales o poesía, no para separar ideas completas.

Un mal ejemplo puede ser:

HTML es un lenguaje de marcado.<br>
Su objetivo es describir el contenido de una página.<br><br>
Cuando usamos elementos semánticos...

Otro error habitual es meter párrafos dentro de cualquier cosa porque funciona en el navegador. Por ejemplo, meter texto plano directamente dentro de un contenedor sin estructura. Se puede, pero se pierde semántica y consistencia.

Listas

Una lista no es solo un párrafo con viñetas bonitas: es una relación estructural entre elementos semánticamente relacionados de forma consecutiva.

Listas no ordenadas: <ul>

Se deben utilizar para elementos sin orden relevante.

<ul>
<li>Texto alternativo</li>
<li>Encabezados jerárquicos</li>
<li>Landmarks</li>
</ul>

Listas ordenadas: <ol>

Se deben utilizar cuando el orden importa (pasos, ranking, instrucciones).

<ol>
<li>Abre el archivo HTML.</li>
<li>Localiza el contenido principal.</li>
<li>Revisa la jerarquía de encabezados.</li>
</ol>

Listas de definición: <dl>

Se deben utilizar para pares término–definición. Son muy útiles en glosarios o fichas.

<dl>
<dt>Landmark</dt>
<dd>Región navegable de una página (main, nav, footer...).</dd>

<dt>Semántica</dt>
<dd>El significado estructural de un elemento HTML.</dd>
</dl>

Errores habituales

Alguno de los errores más comunes a la hora de agrupar contenidos en lista es, por ejemplo, simular listas con <p>• …</p>: visualmente se parece, pero para la accesibilidad no es una lista.
Otros de los errores es usar listas para maquetar (por ejemplo, columnas) cuando en realidad no se está representando un conjunto de elementos relacionados.

Citas

Las citas también son marcas semánticas que ayudan a estructurar mejor el contenido textual. Existen los siguientes marcados de cita:

Cita en línea: <q> utilizada para una cita corta dentro de una frase.

<p>Como dijo alguien una vez: <q>la accesibilidad es usabilidad para todos</q>.</p>

Cita en bloque: <blockquote> utilizada para un fragmento más largo que merece entidad propia o que ocupa más de un párrafo.

<blockquote>
<p>La accesibilidad no es una característica extra. Es parte del diseño.</p>
</blockquote>

Se puede añadir la fuente de forma clara usando <cite> (no es el enlace, es la referencia bibliográfica):

<blockquote>
<p>La accesibilidad no es una característica extra. Es parte del diseño.</p>
<cite>Manual interno del equipo</cite>
</blockquote>

Errores habituales

Se suele usar <blockquote> solo para poner texto sangrado. Eso es CSS.
• Poner comillas visuales y olvidarte de la estructura: el lector de pantalla no sabe que es una cita.

Código: <code>, <pre>, <kbd>, <samp> (sí, hay más de uno)

El contenido técnico es especialmente sensible a accesibilidad y comprensión.

Código en línea: <code>

Para pequeños fragmentos dentro de un párrafo.

<p>El elemento <code>&lt;main&gt;</code> debe aparecer una sola vez por página.</p>

Bloques de código: <pre><code>

Cuando necesitas respetar espacios y saltos de línea.

<pre><code>function hello() {
console.log(Hola);
}</code></pre>

Teclas y atajos: <kbd>

Para representar lo que el usuario pulsa.

<p>Pulsa <kbd>Control</kbd> + <kbd>S</kbd> para guardar.</p>

Salida del sistema: <samp>

Para texto que representa la salida de un programa, terminal, etc.

<p>El sistema mostrará: <samp>Error: file not found</samp></p>

Buenas prácticas muy recomendables:
• Escapa caracteres en código (&lt;, &gt;, &amp;) si estás escribiendo HTML dentro del bloque.
• Si publicas tutoriales, intenta que el texto explique el código antes y después: el bloque de código sin contexto es una pared.

Tablas: solo para datos, y con estructura real

La tabla es el elemento que más se malusa.

Regla de oro:

Una tabla es para datos tabulares, no para maquetar.

¿Cuándo sí usar tabla?

Cuando tienes datos que se entienden por filas/columnas: horarios, comparativas, listados con atributos, etc.

Ejemplo básico con cabecera:

<table>
<caption>Comparativa de planes</caption>
<thead>
<tr>
<th scope=col>Plan</th>
<th scope=col>Precio</th>
<th scope=col>Soporte</th>
</tr>
</thead>
<tbody>
<tr>
<td>Básico</td>
<td>0 €</td>
<td>No</td>
</tr>
<tr>
<td>Pro</td>
<td>10 €</td>
<td>Sí</td>
</tr>
</tbody>
</table>

Claves de accesibilidad:
• <caption>: describe la tabla. Muchísima gente lo olvida.
• <th> con scope=col o scope=row: define encabezados de columna o fila.
• Usa <thead>, <tbody> cuando tenga sentido: ayuda a organizar.

Errores típicos que rompen la experiencia:
• Tablas sin encabezados: el lector de pantalla leerá celdas sin contexto.
• Tablas para alinear cosas (como un grid de diseño): hoy eso es CSS (flex, grid).

¿Cuándo NO usar un <div>?

El <div> es un contenedor genérico sin semántica. No es malo, pero es la última opción, no la primera.

Usa <div> cuando:
• necesitas agrupar elementos para aplicar estilos o layout,
• y no hay un elemento semántico que describa esa agrupación.

No uses <div> cuando exista un elemento que sí describe lo que es:
• ¿Es un párrafo? → <p>
• ¿Es una lista? → <ul>/<ol>/<dl>
• ¿Es una sección temática? → <section>
• ¿Es una pieza de contenido autocontenida? → <article>
• ¿Es navegación? → <nav>
• ¿Es el contenido principal? → <main>
• ¿Es un encabezado de página o sección? → <header>
• ¿Es un pie? → <footer>
• ¿Es complementario? → <aside>
• ¿Es un botón? → <button> (no un <div> clicable)
• ¿Es un enlace? → <a>

Ejemplo clásico (y problemático):

<div onclick=guardar()>Guardar</div>

Eso visualmente puede parecer un botón, pero:
• no es accesible por teclado como un botón real,
• no tiene rol semántico correcto,
• y no hereda comportamientos estándar.

Lo correcto:

<button type=button onclick=guardar()>Guardar</button>

Un mini-checklist para tus artículos y páginas

Cuando estés escribiendo contenido textual, prueba este repaso rápido:
1. ¿Cada idea completa está en un <p> (o elemento equivalente)?
2. ¿Si hay un conjunto de items, está en una lista real?
3. ¿Si cito a alguien, uso <blockquote> o <q> según el caso?
4. ¿El código está marcado como código (<code>, <pre>, <kbd>)?
5. ¿Las tablas tienen caption y encabezados (th, scope)?
6. ¿Estoy usando <div> solo cuando no hay alternativa semántica?

Si quieres, el siguiente artículo encaja muy bien si lo enfocamos en elementos de texto de detalle que suelen aparecer en contenidos reales: <strong>, <em>, <mark>, <abbr>, <time>, enlaces bien escritos, y cómo evitar el haz clic aquí para que la navegación por enlaces tenga sentido.

Estructura del contenido en una página HTML

En los artículos anteriores vimos la estructura general de un documento HTML, qué papel tiene el elemento <head> y cómo el <body> representa el contenido con el que el usuario interactúa.

En este artículo vamos a profundizar en cómo se organiza ese contenido dentro del <body> para que sea comprensible, navegable y accesible: hablaremos de landmarks (regiones), de secciones y de encabezados. La idea es construir una página que no solo se vea bien, sino que esté estructurada de forma que un lector de pantalla, un teclado o cualquier tecnología de asistencia pueda recorrerla como si fuese un mapa.

Estructura dentro del body

Cuando una página crece (menú, buscador, contenido, barras laterales, pie, etc.), el usuario necesita referencias para no perderse.

Visualmente se resuelve con columnas, cajas, colores y tamaños de letra. Pero para accesibilidad lo importante es la semántica, es decir: qué es cada zona y qué función cumple.

Para eso HTML nos ofrece elementos para definir regiones (<header>, <nav>, <main>, <footer>, <aside>), elementos para definir secciones (<article>, <section>) y encabezados: <h1> … <h6> para expresar jerarquía y permitir navegación por títulos de los contenidos.

Cuando se usan bien estas piezas, muchos lectores de pantalla permiten saltar por regiones (landmarks) y por encabezados de forma inmediata. Además, las herramientas de ayuda a la navegación para personas con discapacidad cognitiva entienden mejor la estructura de los contenidos y pueden ofrecer una mejor asistencia a los usuarios con discapacidad.

Landmarks

Los landmarks (regiones) son zonas del documento lo bastante importantes como para que el usuario quiera ir directamente a ellas (por ejemplo: navegación, contenido principal, pie).

A nivel técnico, se exponen como roles/landmarks en el árbol de accesibilidad.

En HTML moderno, muchos landmarks se consiguen sin ARIA, solo usando elementos semánticos:
• <header> (a nivel de página) suele exponerse como banner.
• <nav> como navigation.
• <main> como main.
• <aside> como complementary (contenido complementario).
• <footer> (a nivel de página) como contentinfo.

Importante matiz: el contexto importa. Por ejemplo, un <header> dentro de un <article> deja de ser landmark banner y pasa a ser un contenedor genérico, precisamente para evitar ruido y duplicidades.

Ejemplo de una estructura típica con landmarks y secciones

El siguiente ejemplo presenta una plantilla mental de cómo dividir una página en regiones y cómo dar sentido a cada bloque.

<body>

<a class=skip-link href=#contenido>Saltar al contenido principal</a>

<header>
<h1>Programar a ciegas</h1>
<p>Accesibilidad, usabilidad y desarrollo.</p>
</header>

<nav aria-label=Navegación principal>
<a href=/>Inicio</a>
<a href=/articulos/>Artículos</a>
<a href=/contacto/>Contacto</a>
</nav>

<main id=contenido>
<article>
<header>
<h2>Estructura del contenido en HTML</h2>
<p>Publicado el 1/01/2026</p>
</header>

<section>
<h3>¿Qué son los landmarks?</h3>
<p>
Los landmarks son regiones que ayudan a moverse por la página sin leerla de forma lineal.
</p>
</section>

<section>
<h3>Encabezados y jerarquía</h3>
<p>
Los encabezados crean un mapa del contenido y permiten saltar por secciones.
</p>
</section>
</article>
</main>

<aside aria-label=Contenido relacionado>
<h2>Artículos relacionados</h2>
<ul>
<li><a href=/?p=1331>Introducción a HTML</a></li>
<li><a href=/?p=1332>El head de una página HTML</a></li>
<li><a href=/?p=1344>El body de una página HTML</a></li>
</ul>
</aside>

<footer>
<p>&copy; 2026 Tyflos Accessible Software</p>
<a href=/accesibilidad/>Declaración de accesibilidad</a>
</footer>

</body>

Este ejemplo presenta los siguientes elementos clave:

  • Hay un enlace de salto (Saltar al contenido principal).
  • Hay un solo <main>, con un id para que el salto sea real.
  • La navegación principal está en <nav> y está etiquetada con aria-label para que, si en el futuro hay más de una navegación, podamos diferenciarlas.
  • El contenido principal está dentro de un <article> y dividido en <section> con encabezados.

El enlace para Saltar al contenido

Cuando una web repite cabecera y navegación en todas las páginas, un usuario que navega con teclado o lector de pantalla se encuentra siempre el mismo bloque antes de llegar al contenido real. WCAG exige un mecanismo para saltar bloques repetidos (criterio 2.4.1).

Un enlace de salto es la solución más habitual y sencilla.

Es opcional si ese enlace está siempre visible o si solo se muestra al recibir foco (lo habitual en muchos sitios).

Secciones

La estructuración en secciones y sub secciones definen la ordenación cognitiva general de los contenidos en una página web. Se suelen recomendar las siguientes reglas:

  • Usar <article> cuando el bloque tenga sentido por sí solo (una entrada de blog, una noticia, un comentario, una tarjeta de producto completa).
  • Usar <section> cuando se esté dividiendo un contenido en partes temáticas, normalmente con su propio encabezado.
  • Ambos elementos crean secciones en el documento y definen el alcance de cosas como <header> y <footer> internos.
  • No usar <section> como sustituto de <div>. Si no hay una sección temática real (y normalmente un encabezado que la titule), probablemente ese bloque sea un <div>.

Encabezados

Para una persona con discapacidad para el acceso a los contenidos digitales, como una persona ciega, los encabezados no son texto grande, más bien son un mecanismo de navegación y orientación.

Los encabezados definen la estructura de dependencias entre contenidos.

Un encabezado marca el comienzo de una sección dentro de los contenidos de la página.

Se suelen aplicar las siguientes reglas:

  • Siempre debe haber, al menos, un H1 en la página. 
  • Dentro del contenido del encabezado sólo debe haber texto o una imagen.
  • Ese texto o imagen debe representar el contenido que presenta el encabezado.
  • Nunca se debe usar encabezados para estilo visual.
  • Nunca se debe saltar niveles sin necesidad (por ejemplo, pasar de <h1> a <h4> porque sí).

Buenas prácticas para no crear ruido

Cuando se empieza a usar landmarks y ARIA, es fácil excederse en su uso. Un abuso o el renombrado excesivo de las regiones generan ruido y dificultan entender la página.

Se recomienda seguir estas reglas:

  • Un solo <main> por página.
  • Si hay varios <nav>, Es necesario poner nombre con aria-label (por ejemplo: Navegación principal, Navegación secundaria, Navegación de pie).
  • Se debe evitar crear regiones sin una razón semántica.
  • Usar <aside> para contenido complementario real (relacionado, pero no parte del hilo principal).

Cómo comprobar si la estructura es accesible

Se pueden detectar muchos fallos con herramientas automáticas, pero lo más fiable es realizar una verificación manual utilizando un lector de pantallas.
El lector de pantallas tiene una función para mostrar la estructura de encabezados en la página. De esta forma se puede observar si respetan el orden de anidamiento y si cuentan cómo se organiza el contenido en la página.
El lector de pantallas, por defecto, avisa cuando se ha encontrado una región (landmark). Es necesario revisar si aparecen regiones para la Navegación, Contenido principal, Pie, etc., y si tienen nombres claros cuando hay varias del mismo tipo.

El body de una página HTML

En los artículos anteriores se presentó la estructura general de un documento HTML y se profundizó en el propósito del elemento <head>.

El elemento <body> representa el contenido del documento: aquello que el usuario percibe como la página y con lo que interactúa, incluyendo texto, navegación, imágenes, formularios y componentes de aplicación web.

El <body> no es únicamente un contenedor visual. En términos de accesibilidad y usabilidad, el cuerpo es el lugar donde se materializa la estructura semántica del contenido: cómo se organizan los títulos, qué se considera navegación, cuál es el contenido principal, qué partes son complementarias y qué regiones se repiten entre páginas.

Esta estructura, cuando se expresa con etiquetas semánticas adecuadas, facilita la navegación para lectores de pantalla, y mejora la efectividad general del documento para las personas que utilizan herramientas de apoyo a la comprensión.

Ejemplo completo de body

A continuación se muestra un ejemplo realista de <body> en una página de contenido, utilizando una estructura semántica típica con cabecera, navegación, contenido principal y pie. El objetivo del ejemplo es que se vea cómo se divide el cuerpo en regiones, no que sea un diseño definitivo.

<body>
<h1>Programar a ciegas</h1>
<p>Accesibilidad, usabilidad y desarrollo.</p>
<nav>
<a href="/">Inicio</a>
<a href="/articulos/">Artículos</a>
<a href="/contacto/">Contacto</a>
</nav>

<main>
<h2>El body de una página HTML</h2>
<p>Publicado el 19/01/2026</p>
<p>
El elemento <code>&lt;body&gt;</code> contiene el contenido principal del documento: texto, enlaces,
imágenes y controles interactivos.
</p>

<h3>Un enlace dentro del contenido</h3>
<p>
Un ejemplo de enlace descriptivo puede ser:
<a href="https://programaraciegas.net">Visitar Programar a ciegas</a>.
</p>

<h3>Una imagen con texto alternativo</h3>
<img src="/img/ejemplo.png" alt="Captura de una página mostrando un artículo con estructura semántica.">
</main>

<footer>
<p>&copy; 2026 Tyflos Accessible Software</p>
<a href="/accesibilidad/">Declaración de accesibilidad</a>
</footer>
</body>

En este ejemplo se puede ver que el <body> suele mezclar contenido estático (párrafos, títulos, imágenes) con contenido interactivo (enlaces, formularios) y con regiones que permiten comprender rápidamente la página (por ejemplo, navegación y contenido principal). El elemento <main> representa el contenido dominante de la página y, por buenas prácticas, debería ser único.

Estructura semántica dentro del body

A la hora de diseñar un sitio web hay que tener en cuenta la idea de no es qué se muestra, sino qué significa cada zona. Para expresar esa semántica, HTML ofrece diversos elementos como <header>, <nav>, <main> y <footer>, que ayudan a identificar regiones típicas de una página, y elementos como <article> y <section>, que ayudan a organizar el contenido en bloques con sentido propio.

Desde el punto de vista de la accesibilidad, estas etiquetas semánticas suelen traducirse en regiones o landmarks que muchos lectores de pantalla permiten identificar y recorrer con atajos de teclado.

Es importante matizar que el contexto importa: un <header> puede ser un banner cuando está directamente asociado al documento, pero no necesariamente cuando aparece dentro de un <article> o <section>. De forma equivalente, un <footer> dentro de un <article> no representa el pie global de la página, sino el pie de ese bloque.

Contenido habitual del body

Dentro del <body> se declaran, en primer lugar, los títulos que organizan la información mediante <h1>…<h6>, que permiten expresar jerarquía y ofrecer navegación por encabezados; a continuación se encuentra el texto en sí, normalmente en párrafos con <p>, citas con <blockquote> o fragmentos de código con <code> y <pre>; seguidamente suelen aparecer enlaces con <a>, que conectan el contenido con otras páginas o con secciones internas; y también se incluyen recursos no textuales como imágenes (<img>) o figuras (<figure> y <figcaption>), además de componentes de interacción como formularios (<form>, <label>, <input>, <button>) y otros controles.

Aunque visualmente todo parece contenido, para un lector de pantalla y para muchas herramientas, la diferencia entre un título, un párrafo, un bloque de navegación o un control de formulario es esencial porque define cómo se recorre y se comprende la página. Por eso conviene preferir semántica nativa de HTML frente a contenedores genéricos (<div>, <span>) cuando exista un elemento apropiado.

Accesibilidad en el body

La mayoría de barreras de accesibilidad aparecen dentro del <body> de la página ya que aquí es donde se incluye el contenido y la funcionalidad y se aplica el diseño.

Para evitar los problemas de accesibilidad más graves hay que prestar atención a los siguientes conceptos:

La estructura mediante encabezados debe reflejar la organización real del contenido, porque los títulos se usan para navegación rápida y orientación. Una jerarquía coherente y títulos que describen secciones, en lugar de textos decorativos, facilita que el usuario entienda el documento sin necesidad de leerlo linealmente.

Las regiones principales deberían estar identificadas de forma clara, normalmente con elementos semánticos (<nav>, <main>, <footer>) y, cuando sea necesario, con nombres accesibles (utilizando, por ejemplo, aria-label en una navegación si hay varias). Este enfoque permite saltar directamente a Navegación, Contenido principal o Pie desde el lector de pantalla.

Todo contenido no textual debe tener una alternativa textual cuando aporte información o cumpla una función. En imágenes, el mecanismo principal sigue siendo el atributo alt, que puede describir la imagen o estar vacío (alt=»») cuando sea decorativa y no deba anunciarse.

En los formularios, el control debe tener un nombre accesible. La forma más robusta suele ser asociar un <label> con el control mediante for/id, y solo cuando no sea viable se recurre a mecanismos como aria-label o aria-labelledby.

Por último, incluso con buena semántica, la experiencia se puede degradar si el foco del teclado no sigue un orden lógico o si hay elementos interactivos que no son realmente operables con teclado. El <body> es, por tanto, el lugar donde se debe verificar navegación por tabulador, foco visible, orden de lectura y coherencia entre lo visual y lo programático.

El head de una página HTML

En el artículo de introducción al HTML se mostró la estructura interna de un documento HTML. En esa estructura existe una sección conocida como el head de la página web.

El <head> es el lugar donde se declara la codificación de caracteres, se define el título que aparecerá en la pestaña del navegador, se aportan metadatos descriptivos, se enlazan hojas de estilo y recursos como iconos, y se configuran aspectos de seguridad o comportamiento del documento.

El contenido del <head> no se muestra como parte del cuerpo de la página pero determina cómo se interpreta y se presenta el contenido que aparece en el <body> de la página web.

Ejemplo completo de head

A continuación podemos ver un ejemplo del código que se incluye en una página web habitual y aunque muchos de esos metadatos no sean utilizados si deben aparecer por motivos de accesibilidad.

<head>
<meta charset="utf-8">

<meta name="viewport" content="width=device-width, initial-scale=1">

<title>Guía del elemento head en HTML</title>

<meta name="description" content="Explicación de las etiquetas y elementos más habituales dentro del head de una página web, con ejemplos en HTML.">

<meta name="robots" content="index,follow">

<link rel="canonical" href="https://ejemplo.com/articulos/elemento-head">

<link rel="icon" href="/favicon.ico" sizes="any">
<link rel="icon" href="/icon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">

<link rel="stylesheet" href="/css/styles.css">

<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>

<!-- Metadatos para compartir en redes (Open Graph) -->
<meta property="og:title" content="Guía del elemento head en HTML">
<meta property="og:description" content="Qué incluir en head: metadatos, enlaces, estilos, iconos, rendimiento y seguridad.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://ejemplo.com/articulos/elemento-head">
<meta property="og:image" content="https://ejemplo.com/img/preview.png">

<script src="/js/app.js" defer></script>
</head>

En un primer vistazo puede resultar confuso e incomprensible pero se puede aclarar el código utilizando comentarios.

Comentarios en HTML

Los desarrolladores utilizamos los comentarios para multitud de funciones: describir que hace o va a hacer un trozo de código, incluir un Copyright o copyleft en el código, añadir marcas o secciones en el fichero de código para marcar zonas y movernos más rápido por un fichero de código grande, etc.

En HTML, aunque no sea un lenguaje de programación, también podemos incluir comentarios para poder explicar nuestro código.

Para escribir un comentario en HTML utilizamos una etiqueta que será ignorada por el navegador web. Esta etiqueta tiene una marca de apertura particular y una marca de cierre también particular.

Para abrir el comentario se utiliza la marca <!– y para cerrar el comentario se utiliza la marca –> y entre medio va el texto que se utilizará como comentario. Un ejemplo puede ser:

<!-- Esto es un comentario en HTML -->

Ahora veamos de nuevo nuestro head con comentarios.

<head>
<!-- Codificación de caracteres -->
<meta charset="utf-8">

<!-- Ajuste de la vista en móviles -->
<meta name="viewport" content="width=device-width, initial-scale=1">

<!-- Título de la página (pestaña del navegador, historial, marcadores) -->
<title>Guía del elemento head en HTML</title>

<!-- Descripción para buscadores y previsualizaciones -->
<meta name="description" content="Explicación de las etiquetas y elementos más habituales dentro del head de una página web, con ejemplos en HTML.">

<!-- Control básico de indexación (no es una norma absoluta, pero orienta a robots) -->
<meta name="robots" content="index,follow">

<!-- URL canónica para evitar duplicidades -->
<link rel="canonical" href="https://ejemplo.com/articulos/elemento-head">

<!-- Icono de la pestaña y accesos directos -->
<link rel="icon" href="/favicon.ico" sizes="any">
<link rel="icon" href="/icon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">

<!-- Hoja de estilos -->
<link rel="stylesheet" href="/css/styles.css">

<!-- Sugerencias de rendimiento para recursos de terceros -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>

<!-- Metadatos para compartir en redes (Open Graph) -->
<meta property="og:title" content="Guía del elemento head en HTML">
<meta property="og:description" content="Qué incluir en head: metadatos, enlaces, estilos, iconos, rendimiento y seguridad.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://ejemplo.com/articulos/elemento-head">
<meta property="og:image" content="https://ejemplo.com/img/preview.png">

<!-- Carga de JavaScript no bloqueante -->
<script src="/js/app.js" defer></script>
</head>

Codificación y representación de caracteres

Es necesario asegurarse que el navegador interpretará correctamente tildes, eñes y símbolos. Para ello se utiliza <meta charset=»utf-8″>, que declara la codificación del documento. Aunque hoy en día UTF-8 es la elección estándar en la Web, la etiqueta sigue siendo importante porque evita interpretaciones erróneas en ciertos entornos y garantiza consistencia.

Ajuste en móviles con viewport

Si la página se va a visualizar en smartphones y tablets, es esencial indicar al navegador cómo debe dimensionar el área visible. La etiqueta <meta name=»viewport»> permite controlar el ancho lógico y la escala inicial. La configuración más habitual es width=device-width, initial-scale=1, que adapta el layout al ancho del dispositivo sin ampliar o reducir de forma inesperada.

Título del documento con <title>

A continuación, <title> define el título del documento. Este texto suele aparecer en la pestaña del navegador, en el historial, en los marcadores y en muchas previsualizaciones. Desde el punto de vista de usabilidad, un título preciso ayuda a reconocer rápidamente la página. Desde el punto de vista de buscadores, suele ser una de las piezas más visibles del resultado.
Metadatos descriptivos: description, robots y otros

Después del título, se suelen incluir metadatos con <meta name=»…»>. El caso más conocido es description, que ofrece un resumen del contenido. No garantiza que un buscador muestre exactamente ese texto, pero suele utilizarse como base para la previsualización cuando es relevante. También es frecuente robots, que indica directrices de indexación y seguimiento de enlaces; su interpretación puede variar por motor de búsqueda, por lo que se recomienda entenderlo como una señal orientativa.
En escenarios más específicos pueden aparecer metadatos adicionales, como author para autoría, referrer para controlar qué información se envía al navegar a otros sitios, o theme-color para sugerir un color de interfaz en algunos navegadores móviles. El uso de estos valores debe estar alineado con el objetivo del sitio y con una política de privacidad clara.

Canonical: evitar duplicidades de URL

En el ámbito de SEO y consistencia, es habitual declarar una URL canónica mediante <link rel=»canonical» href=»…»>. Su objetivo es señalar cuál es la versión preferida cuando existen múltiples URLs que muestran el mismo contenido o contenido muy similar, por ejemplo por parámetros de seguimiento o rutas alternativas.
Enlaces a recursos: CSS, iconos y manifiestos
Otro bloque fundamental del <head> es el enlace a recursos externos mediante <link>. En primer lugar suele estar la hoja de estilos principal con rel=»stylesheet», que define cómo se presentará el HTML en pantalla, en impresión y en otros medios. Si existen varias hojas de estilo, el orden importa, porque las reglas posteriores pueden sobrescribir a las anteriores.
Los iconos de sitio también se declaran con <link>. El clásico favicon.ico sigue siendo útil por compatibilidad, pero hoy se suelen añadir variantes como SVG y el icono para pantallas de inicio en iOS mediante apple-touch-icon. En aplicaciones web progresivas puede añadirse además un manifiesto con rel=»manifest».

Metadatos para compartir: Open Graph y Twitter Cards

Cuando una URL se comparte en redes sociales o aplicaciones de mensajería, la previsualización suele basarse en metadatos específicos. En muchos entornos se utiliza Open Graph a través de <meta property=»og:…»>, indicando título, descripción, tipo, imagen y URL. En el ecosistema de X (antes Twitter) siguen siendo comunes las Twitter Cards con <meta name=»twitter:…»>. La idea es proporcionar a cada plataforma la información necesaria para mostrar una tarjeta coherente, con un texto breve y una imagen adecuada.

Scripts en el <head>

Aunque JavaScript puede incluirse en el <body>, se recomienda incluir la carga de los scripts de Javascript en el Head por motivos de accesibilidad.

Rendimiento: preload, preconnect y otras pistas

Además de enlazar recursos, <link> puede aportar pistas al navegador para optimizar la carga. Con rel=»preconnect» se solicita que se establezca cuanto antes la conexión con un dominio externo, algo útil cuando se dependen de CDNs o proveedores de fuentes. Con rel=»preload» se indica que un recurso será necesario muy pronto, por ejemplo una fuente o una hoja de estilos crítica, aunque su uso debe hacerse con cuidado para no saturar la red con descargas anticipadas innecesarias. En general, la mejor práctica consiste en aplicar estas técnicas tras medir y verificar que mejoran la experiencia.

Consideraciones de orden dentro del <head>

Aunque HTML es flexible, el orden de ciertas etiquetas ayuda. La declaración de <meta charset=»utf-8″> suele colocarse al inicio para evitar interpretaciones inconsistentes. A continuación es habitual incluir viewport y el title. Después suelen aparecer metadatos como description y enlaces como canonical, y a partir de ahí recursos como CSS, iconos y scripts diferidos. Este orden no es una regla rígida, pero mejora la legibilidad, reduce errores y favorece un comportamiento predecible.

Accesibilidad en el head

Según WCAG para considerar que el head de un documento HTML cumple con la accesibilidad es necesario que se incluya un título para el documento y que se defina el lenguaje principal de la página.

Hay otras recomendaciones como las de incluir los metadatos de description y encoding para ayudar a la interpretación correcta del contenido por parte de navegadores y de personas con herramientas que utilicen los metadatos del documento.

Introducción a HTML

Al abrir una página web con nuestro navegador lo que está haciendo la aplicación del navegador web es, principalmente, interpretar un fichero con extensión HTM o HTML.

HTML son las siglas de HyperText Markup Language (Lenguaje de Marcado de Hipertexto). Es importante resaltar lo de lenguaje de marcado: HTML no es un lenguaje de programación. No “ejecuta” lógica como lo haría Swift, Python o JavaScript, sino que marca el contenido para indicar diversa información semántica como qué título tiene la página, en qué idioma está el contenido principal, qué elementos hay en la página (párrafos, imágenes, controles de formulario, etc) indicando qué es cada trozo de contenido en la página.

HTML se usa principalmente para estructurar contenido en la Web, aportar semántica en los contenidos y ser el nexo de unión para otras tecnologías de la web como CSS y Javascript.

Ejemplo básico en HTML

Un ejemplo básico del código HTML de un fichero .htm podría ser el siguiente:

<!doctype html>

<html>

  <head>

    <title>Mi primera página</title>

  </head>

  <body>

    <h1>Mi primera página</h1>
    <p>Este es un párrafo con información.</p>
    <a href=»https://programaraciegas.net»>Visitar el blog</a>

  </body>

</html>

 

Si copiamos el contenido anterior en un fichero con la extensión .htm, por ejemplo «prueba.htm» y lo abrimos con nuestro navegador web veremos lo que hemos creado.

Partes de un fichero HTML

Un archivo HTML suele tener extensión .html (por ejemplo, index.html). Aunque puede contener muchas secciones, la estructura base se repite casi siempre.

Declaración del tipo de documento

La primera línea típica es:

<!doctype html>

Esta declaración indica al navegador que el documento debe interpretarse como HTML moderno.

Elemento raíz: <html>

Todo el contenido se engloba dentro de <html>…</html>:

<!doctype html>
<html>
...
</html>

Cabecera del documento: <head>

La sección <head> contiene metadatos: información para el navegador y para otros sistemas, pero que normalmente no se muestra como contenido principal en pantalla.

Ejemplo:

<head>
<meta charset="utf-8">
<title>Introducción a HTML</title>
</head>

La línea <meta charset=»utf-8″> indica la codificación de caracteres (muy importante para tildes y caracteres especiales).

La línea <title> define el título que suele verse en la pestaña del navegador.
Cuerpo del documento: <body>

En <body> va el contenido visible o “principal”: textos, enlaces, imágenes, formularios, etc.

<body>
<h1>Introducción a HTML</h1>
<p>HTML estructura el contenido de una página web.</p>
</body>

Las etiquetas HTML

Una etiqueta (tag) es una marca que indica al navegador qué tipo de elemento es un fragmento de contenido.

La mayoría de elementos HTML se representan con una sintaxis básica consistente en un nombre de etiqueta encerrado entre los signos menor que y mayor que (< y >).

<hr>

Algunas etiquetas requieren otra etiqueta de cierre. Esta etiqueta de cierre suele ser la misma etiqueta pero su nombre comienza con el símbolo de barra (/). Entre la etiqueta de apertura y la de cierre va el contenido.

<p>Esto es un contenido.</p>

Además, hay etiquetas que incluyen atributos para poder realizar ciertas acciones.

<a href=»https://programaraciegas.net»>
Visita Programar a ciegas
</a>

El atributo href permite indicar qué dirección URL se abrirá el enlace identificado por la etiqueta a.