UT02 - Lenguajes de Marcas para Entornos Web

Conexión legislativa

En esta Unidad de Trabajo nos centraremos en:


Introducción

HTML (HyperText Markup Language) es el lenguaje de marcas más conocido y utilizado para la estructuración de contenidos en la World Wide Web (WWW). Se trata de un lenguaje de marcas presentacional. Es decir: junto con el texto, incorpora etiquetas que ayudan a componer un documento web: encabezados, párrafos, imágenes, tablas, formularios... aportando, incluso, algo de carga semántica para indicar a las herramientas de accesibilidad y motores de búsqueda el significado de cada parte del documento.

Desde su propuesta por Tim Berners-Lee a principios de los 90, HTML ha evolucionado a través de distintas versiones coordinadas por organismos de estandarización como el W3C y el WHATWG. Esta evolución culminó con el estándar HTML5, que consolida un principio clave en el desarrollo web actual: la separación estricta entre estructura semántica (HTML) y presentación visual (CSS). Mientras HTML construye el esqueleto del documento, las hojas de estilo en cascada (CSS) asumen la apariencia, el diseño y la adaptabilidad a distintas pantallas.

ut02-tim.jpg500
Fuente: Getty Images

A diferencia de los lenguajes de intercambio de datos procesados exclusivamente por máquinas (como XML o JSON), HTML está diseñado para estructurar información orientada al consumo humano. Sin embargo, su propósito no es de naturaleza estética, sino semántica y estructural:

ut02-stack-webdev.jpg500
Fuente: Pinterest

A lo largo de su evolución, el estándar se ha regido por una premisa fundamental conocida en la comunidad de estandarización como "Don't break the web" (No rompas la web). Este principio garantiza la retrocompatibilidad: ningún cambio o actualización en las especificaciones de HTML debe hacer que las páginas web antiguas dejen de funcionar en los navegadores actuales. Sin embargo, esta "permisividad técnica" no significa que todo valga a la hora de escribir código web. Para garantizar la interoperabilidad entre navegadores, la accesibilidad universal y el mantenimiento sostenible a largo plazo, los desarrolladores nos apoyamos en herramientas de edición y procesos estrictos de validación de sintaxis.


Sintaxis básica de HTML

Un documento HTML5 está compuesto por elementos estructurados de forma jerárquica. Para construir y manipular estos elementos correctamente, es necesario conocer sus componentes fundamentales: etiquetas, atributos y las reglas de anidamiento.

Elementos, Etiquetas y Atributos

La mayoría de elementos en HTML cuentan con una etiqueta de apertura, un contenido y una etiqueta de cierre.

<nombre_etiqueta atributo="valor">Contenido</nombre_etiqueta>
<p class="destacado">Párrafo de ejemplo</p>

También existen elementos que no tienen contenido, por lo que no tienen etiqueta de cierre. Tal y como hemos visto, estos pueden representarse como una etiqueta de cierre pero con la barra inclinada a la derecha del nombre de la etiqueta (<elemento_vacio/>). Sin embargo, desde HTML5, no es necesario ponerla.

<img src="logo.png" alt="Logotipo">
<br>
<hr>
<input type="text" name="nombre">

Atributos Globales

Existen atributos que son propios de los elementos. Por ejemplo: el atributo src de un elemento img no se puede utilizar en otros elementos. Sin embargo, existen otros atributos que pueden aplicarse a cualquier elemento HTML, independientemente de su finalidad o tipo de contenido. Estos son los atributos globales. Entre los atributos globales más relevantes destacan:

Los atributos id y class los usaremos mucho con CSS y JavaScript


Estructura básica de un documento HTML

Un documento HTML es un documento de texto con etiquetas anidadas de manera jerárquica en forma de árbol. Esta jerarquía es muy típica de los lenguajes de marcas derivados de SGML y cumple con unas propiedades básicas:

Ejemplo válido:

<elemento_nivel1>
	<elemento_nivel2>
		<elemento_nivel3>
			Contenido
		</elemento_nivel3>
	</elemento_nivel2>
</elemento_nivel1>

Ejemplo no válido:

<elemento_nivel1>
	<elemento_nivel2>
		<elemento_nivel3>
			Contenido
	</elemento_nivel2>
		</elemento_nivel3>
</elemento_nivel1>

En el caso de HTML, a esta estructura se la conoce como DOM (Document Object Model). Todos los elementos válidos derivan de un nodo raíz principal html y se divide en 2 grandes bloques:

Mientras que un documento HTML se considera estático, el DOM es dinámico, y aprenderemos a modificarlo con JavaScript más adelante.

Pequeño ejercicio

Entra en cualquier página web y haz "Click derecho > Ver código fuente" (en la mayoría de navegadores el atajo es Ctrl+U). Todo el texto que verás forma parte del documento HTML que el servidor envía al cliente (navegador).

A continuación elige un elemento cualquiera de la página y haz "Click derecho > Inspeccionar" (en la mayoría de navegadores el atajo es Ctrl+Shift+I). Se abrirá el Inspector de las herramientas de desarrollador del navegador, desde donde podrás modificar el DOM.

Secciones fundamentales

La estructura básica de un documento HTML es la siguiente:

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Estructura básica de un documento HTML</title>
</head>
<body>
    <h1>Bienvenido a LMSGI</h1>
    <p>Este es el cuerpo del documento, donde reside el contenido visible.</p>
</body>
</html>

La declaración !DOCTYPE html

Ubicada, obligatoriamente, en la primera línea del archivo, antes del nodo raíz html. No es una etiqueta de HTML en sí misma, sino una instrucción (o directiva) enviada al navegador. Su función es informar al navegador para que elija el motor de renderizado adecuado.

Desde HTML5 basta poner <!DOCTYPE html>, que activa el "modo estándar", pero pueden ponerse otros valores, como:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "https://www.w3.org/TR/html4/strict.dtd">

Esto no es recomendable a día de hoy, ya que en la actualidad, todos los estándares y la industria se rigen por el principio de HTML como un estándar vivo (HTML Living Standard), gestionado por el WHATWG. Usar la declaración simplificada <!DOCTYPE html> es la única vía recomendada.

El elemento raíz html

Es el nodo raíz de un documento HTML y envuelve a todos los demás elementos (excepto a la directiva DOCTYPE).

Es muy habitual rellenar el atributo global lang a nivel del elemento html para facilitar que herramientas de asistencia (como lectores de pantalla para personas con discapacidad visual) reconozcan el idioma del documento y utilicen la síntesis de voz y pronunciación adecuadas. También ayuda a los motores de búsqueda a indexar la página según el idioma (SEO) y facilita la traducción automática del navegador.

<html lang="es">
    <!-- Contenido del documento -->
</html>

Muchos navegadores incorporan por defecto extensiones de traducción de páginas webs. Para ello, necesitan identificar el idioma de origen y buscan el atributo lang del elemento raíz html. Si detectan que el documento está marcado con un idioma diferente al idioma por defecto del navegador, la extensión activará automáticamente el aviso emergente preguntando si deseas traducir el contenido de la página.

Pequeño ejercicio

Copia la estructura básica del documento HTML en un fichero llamado index.html. Cambia el valor del atributo lang a "en" y abre el documento con un navegador web. Deberá aparecerte un mensaje parecido a este:
ut02-lang-en-trad.png

La cabecera del documento, head

El elemento head actúa como un contenedor de metainformación de todo el documento. Los contenidos que pongamos aquí no se renderizan directamente en la ventana del navegador, pero es fundamental para la configuración del documento, la optimización en motores de búsqueda (SEO) y la vinculación del documento con recursos externos

SEO

Search Engine Optimization, es el conjunto de técnicas y buenas prácticas aplicadas en el diseño y contenido de un sitio web para optimizar su visibilidad y posición en los resultados de los motores de búsqueda (como Google, Bing, Duckduckgo...). El elemento title dentro de head es uno de los factores clave para el SEO.

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>LMSGI - UT02</title>
    <link rel="stylesheet" href="estilos.css">
</head>

Los elementos más importantes de head son los siguientes:

Ejercicio de codificación

Copia el siguiente bloque de código, apreciarás que el charset no es utf-8, sino us-ascii. Este set de caracteres se corresponde con el estándar ASCII (American Standard Code for Information Interchange) y es una de las codificaciones de caracteres más antiguas de la informática.

<!DOCTYPE html>
<html lang="es">
<head>
   <meta charset="us-ascii">
   <title>Prueba de Codificación ASCII</title>
</head>
<body>
   <h1>Prueba con codificación US-ASCII</h1>
   <p>Texto sin caracteres especiales: Hello World! 123</p>
   <p>Texto con caracteres especiales: cañón, camión, cigüeña, ¿funciona?</p>
</body>
</html>

Guarda el fichero con extensión html y, cuando lo abras con el navegador, apreciarás que hay varios caracteres no reconocidos. El navegador será incapaz de renderizar tildes y caracteres especiales utilizando la codificación especificada

Las olvidadas keywords

A finales de los 90 había una etiqueta fundamental para los motores de búsqueda:

<meta name="keywords" content="...">

Esta permitía a los desarrolladores indicar explícitamente sobre qué trataba su página, pero se hizo un muy mal uso de esta. Muchas webs empezaron a introducir palabras clave irrelevantes para alterar los resultados de búsqueda, por lo que su fiabilidad cayó en picado.

Desde el año 2009, Google las ignora por completo, y otros buscadores como Bing incluso penalizan su uso desmesurado, penalizando el posicionamiento.

Podemos simular cómo se vería nuestra web al ser listada por un motor de búsqueda como Google utilizando aplicaciones de SERP Simulator como Mangools o SISTRIX.

Redes sociales y aplicaciones de mensajería

Las etiquetas Open Graph (OG) son elementos indispensables en el <head> moderno para controlar cómo se genera la vista previa (link preview) cuando un usuario comparte la URL de nuestro sitio web en redes sociales (LinkedIn, Facebook, X) o aplicaciones de mensajería instantánea (Telegram, WhatsApp, Discord).

Sin estas etiquetas, la plataforma intentará adivinar el contenido escogiendo imágenes o textos aleatorios del documento, ofreciendo con frecuencia un resultado poco profesional.

Protocolo Open Graph (OG)

Desarrollado originalmente por Facebook y adoptado como estándar universal por la gran mayoría de plataformas (incluyendo WhatsApp, Telegram y Discord). Utiliza el atributo property="og:*":

Ejemplo de uso:

<meta property="og:site_name" content="IML Digital Garden">
<meta property="og:title" content="UT02 - Lenguajes de Marcas para Entornos Web">
<meta property="og:description" content="Apuntes prácticos sobre la estructura global del documento HTML5 para estudiantes de DAW.">
<meta property="og:image" content="https://dg.nplanck.dev/img/optimized/0anTmED32t-700.webp">
<meta property="og:url" content="https://dg.nplanck.dev/lmsgi/ut02">
<meta property="og:type" content="article">
URLs absolutas en recursos compartidos

A diferencia de los recursos locales como <link rel="stylesheet" href="estilos.css">, la propiedad og:image debe incluir siempre URLs absolutas (incluyendo el protocolo https://)

Podemos verificar cómo se vería usando aplicaciones como OGPreview.io.

Twitter / X y el estándar Open Graph

Aunque la plataforma X cuenta con su propio conjunto de etiquetas (<meta name="twitter:*">), hoy en día la OG se ha establecido como estándar de facto. Por tanto, centrarnos en el protocolo OG garantiza la compatibilidad universal en prácticamente cualquier plataforma o aplicación de mensajería sin sobrecargar la cabecera.

No obstante, las herramientas de validación de OG también suelen aconsejar sobre se debería añadir a la cabecera, facilitando el "copia/pega" sin necesidad de memorizar nada.

El cuerpo del documento, body

El elemento <body> representa el nodo contenedor de todo el contenido visible e interactivo del documento HTML. Todos los elementos que el usuario observa en pantalla (textos, imágenes, enlaces, listas, tablas, formularios y recursos multimedia) residen dentro de esta sección.

A partir de HTML5, la maquetación del cuerpo dejó de basarse en la división genérica e inexpresiva mediante bloques semánticamente neutros (<div id="cabecera">, <div class="pie">) para adoptar etiquetas semánticas de estructuración.

Por otro lado, poco a poco se han abandonado los elementos puramente de presentación o estilo típicos como <center> o <font>, los cuales están obsoletos y se desaconsejan. La regla fundamental del desarrollo web moderno es que la presentación visual se debe gestionar de manera exclusiva mediante hojas de estilo en cascada (CSS), dejando HTML exclusivamente para estructuración y semántica.

Elementos de texto y párrafo

La mayor parte del contenido de una página web es texto, y este debe estar contenido en algún elemento. Aunque HTML permite escribir texto "a pelo", sin que forme parte del valor de ningún elemento, esto no es recomendable. Es malo para el SEO, para la accesibilidad web y dificulta mucho aplicarle estilos más adelante.

En esta sección encontraremos elementos cuya anidación no está permitida. Por ejemplo, no podemos poner un elemento p dentro de un elemento h1 ni lo contrario. Sin embargo, existen otros que sí tiene sentido anidar dentro de p, como br o strong.

Párrafos de texto

<p>
paragraph

La norma HTML estándar establece que el texto de la página debe estar contenido dentro de un elemento. Es decir, no se puede poner texto directamente dentro de la etiqueta body; ha de haber un contenedor para ese texto. Es el elemento básico para bloques de texto. No tiene una representación gráfica especial, pero es preferible introducir el texto que forme parte de un párrafo dentro de este elemento.

El navegador web colapsará los espacios dobles y los saltos de línea del texto, incluyendo los del elemento <p>.

<p>Este es un párrafo de texto en HTML.
Los saltos de línea y múltiples                  espacios seguidos 
dentro del código fuente son colapsados 
a un único espacio por el navegador.</p>

Se muestra de la siguiente manera:
ut02-html-body-p.png500

Encabezados: jerarquía

<h1>, <h2>, <h3>, <h4>, <h5>, <h6>
header

Los elementos de encabezado definen la estructura y la jerarquía de los contenidos dentro del documento. HTML proporciona seis niveles de encabezado, desde <h1> hasta <h6>:

<h1>Encabezado de nivel 1</h1>
<h2>Encabezado de nivel 2</h2>
<h3>Encabezado de nivel 3</h3>
<h4>Encabezado de nivel 4</h4>
<h5>Encabezado de nivel 5</h5>
<h6>Encabezado de nivel 6</h6>

Se muestra de la siguiente manera:

ut02-html-body-encabezados.png500

Selección por criterios estéticos

Nunca utilices un nivel de encabezado menor (por ejemplo, un <h4> en lugar de un <h2>) simplemente porque su tamaño de letra por defecto parezca más adecuado. La apariencia visual debe personalizarse con CSS. El uso de <h1>-<h6> responde exclusivamente a la jerarquía lógica del contenido.

Salto de línea

<br>
break line

Cuando queramos introducir un salto de línea dentro de un párrafo de texto, podemos utilizar el elemento <br>.

<p>Línea 1<br>Línea 2</p>

Se muestra de la siguiente manera:
ut02-html-body-br.png500

No se debe utilizar para separar diferentes párrafos, ya que el propio elemento p introduce una separación antes y después.

Línea horizontal

<hr>
horizontal rule

Podemos utilizar este elemento para separar distintas "secciones temáticas". Aunque los navegadores lo reconocen y procesan dentro de un mismo párrafo, no debe usarse así, sino entre párrafos.

<p>Párrafo 1</p>
<hr>
<p>Párrafo 2</p>

Se muestra de la siguiente manera:
ut02-html-body-hr.png500

Código fuente y texto preformateado

code, pre
code, preformatted textrmatted text

Cuando redactamos documentación técnica o apuntes de informática, es muy común necesitar representar fragmentos de código fuente o comandos de consola. Para ello podemos utilizar el elemento code.

<code>
public class HolaMundo {
    public static void main(String args[]) {
        System.out.println("Hola, Mundo");
    }
}
</code>

Que se muestra de la siguiente manera:
ut02-html-body-code.png500

Apreciarás que cambia la tipografía, pero los saltos de línea y las indentaciones no se han respetado, ya que el navegador colapsa todos los espacios en blanco repetidos y retornos de carro como si fuera un párrafo estándar.

Para solucionar esto se utiliza el elemento pre, un contenedor que conserva exactamente todos los espacios, tabulaciones y saltos de línea tal y como se escriben en el archivo fuente.

<pre>
Con diez cañones por banda,
viento en popa a toda vela,
no corta el mar sino vuela,
un velero bergantín.
</pre>

Se mostraría tal que así:
ut02-html-body-pre.png500

Combinación de pre y code

La buena práctica marcada por el estándar HTML5 para mostrar bloques de código multilínea es anidar code dentro de pre. De esta forma se une la semántica de marcado de código con la preservación visual de su formato:

<pre><code>public class HolaMundo {
    public static void main(String args[]) {
        System.out.println("Hola, Mundo");
    }
}</code></pre>

Quedando así:
ut02-html-body-precode.png500

Marcado de texto simple

En HTML5 quedaron obsoletos algunos elementos que permitían enfatizar visualmente partes del texto, como b o i para dar paso a elementos con un propósito puramente semántico. Aunque los navegadores siguen renderizando por defecto b en negrita o i en cursiva por motivos de retrocompatibilidad, la norma moderna exige usar etiquetas que aporten significado al contenido y no meros estilos visuales.

Texto importante

<strong>

En general, los navegadores marcan el texto en negrita, pero es un acuerdo visual modificable por CSS. No es lo mismo un texto simplemente en negrita (modificado con CSS) que un texto marcado con este elemento.

Texto enfatizado

em
emphasized

Es un énfasis de segundo nivel (siendo el primero para strong). Los navegadores lo marcan con cursiva pero, de nuevo, esto es modificable por CSS.

Texto resaltado

mark
marked

Es un texto destacado que hace referencia al contexto actual o a una búsqueda. Los navegadores lo marcan por defecto con un fondo amarillo fluorescente (estilo marcador de subrayado), pero es totalmente personalizable mediante CSS.

<p>Resultados de búsqueda sobre <mark>HTML5</mark>:</p>
<p>El cambio más importante afecta a la <strong>semántica</strong>. <mark>HTML5</mark>, además, persigue una <em>separación total</em> entre la estructura y la estética</p>

Se muestra de la siguiente manera:
ut02-html-body-marcado-simple.png500

Citas

Existen 3 formas de indicar las citas.

Citas cortas

q
quote

Usada para indicar citas cortas incluidas en un párrafo con otro tipo de texto. Los navegadores suelen remarcar la citas entrecomillándolas. Cuenta con un atributo:

<p>Un sabio dijo <q cite="Mi profe de Programación">A programar se aprende programando</q></p>

Se muestra de la siguiente manera:
ut02-html-body-q.png500

Títulos de trabajos y nombres de autores

cite

Es el elemento antiguo para hacer lo que ahora hace q. Actualmente se utiliza para indicar nombres de autores, de trabajos, libros, etc. Los navegadores mostrarán el texto citado con un estilo de cursiva.

<p>Frank Herbert, en su novela <cite>Dune</cite>, realiza un paralelismo con el panorama geopolítico por el control de los recursos naturales</p>

Se muestra de la siguiente manera:
ut02-html-body-cite.png500

Cita de párrafo

blockquote

Es el único elemento de citas que trabaja a nivel de párrafo. Es decir: indicando párrafos completos que proceden de fuentes externas. Los navegadores añadirán sangría derecha e izquierda. Cuenta con un atributo:

<blockquote cite="https://www.boe.es/buscar/act.php?id=BOE-A-1978-31229#a47">
<strong>Artículo 47</strong><br>
Todos los españoles tienen derecho a disfrutar de una vivienda digna y adecuada. Los poderes públicos promoverán las condiciones necesarias y establecerán las normas pertinentes para hacer efectivo este derecho, regulando la utilización del suelo de acuerdo con el interés general para impedir la especulación. La comunidad participará en las plusvalías que genere la acción urbanística de los entes públicos.
</blockquote>

Se muestra de la siguiente manera:
ut02-html-body-blockquote.png500

Listas

Las listas permiten agrupar elementos o conceptos relacionados entre sí mediante símbolos, números o viñetas, facilitando la organización de ideas y mejorando la legibilidad del documento.

Existen 3 tipos de listas dependiendo de la naturaleza de los elementos y su orden.

Listas no ordenadas

ul, li
unordered list, list item

Se utilizan cuando el orden de los elementos no altera el significado del conjunto.

<ul>
    <li>HTML</li>
    <li>CSS</li>
    <li>JavaScript</li>
</ul>

Se muestra de la siguiente manera:
ut02-html-body-ul.png500

Listas ordenadas

ol, li
ordered list, list item

Se utilizan cuando el orden de los elementos es fundamental para la interpretación del conjunto. El elemento contenedor, en este caso, es ol. Por defecto, los navegadores utilizan una numeración arábiga ascendente con inicio en 1., pero puede modificarse mediante atributos:

<ol type="I">
	<li>Fase de Análisis.</li>
	<li>Fase de Diseño.</li>
	<li>Fase de Desarrollo.</li>
</ol>

Se muestra de la siguiente manera:
ut02-html-body-ol.png500

Listas de definición

dl, dt, dd
description list, description term, description details

Se utilizan para representar conjuntos de pares concepto/definición. Muy útiles para glosarios o preguntas frecuentes (FAQs).

<dl>
	<dt>W3C</dt>
	<dd>World Wide Web Consortium, organismo encargado de los estándares web </dd>
	<dt>DOM</dt>
	<dd>Document Object Model, representación en árbol del documento HTML.</dd>
</dl>

Se muestra de la siguiente manera:
ut02-html-body-dl.png500

Anidación de listas

Es posible meter una lista dentro de otra, por ejemplo:

<p>Lista de la compra</p> 
<ul>
   <li>
       No alcohólicas
       <ul>
           <li>Agua</li>
       </ul>
   </li>
   <li>
       Alcohólicas
       <ul>
           <li>Vino</li>
           <li>Cerveza</li>
       </ul>
   </li>            
</ul>

Se muestra de la siguiente manera:
ut02-html-body-anidacion01.png500

Y también podemos mezclar diferentes tipos de listas:

<p>Lista de la compra</p> 
<ol>
   <li>
       No alcohólicas
       <ul>
           <li>Agua</li>
       </ul>
   </li>
   <li>
       Alcohólicas
       <ul>
           <li>Vino</li>
           <li>Cerveza</li>
       </ul>
   </li>            
</ol>

Que se muestra así:
ut02-html-body-anidacion02.png500

Enlaces

a
anchor

Los enlaces son uno de los elementos más importantes de la Web, ya que permiten la navegación hipertextual interconectando diferentes documentos HTML o recursos entre sí.

El elemento a convierte cualquier fragmento de texto, imagen o bloque dentro de su contenido en un punto interactivo sobre el que el usuario puede hacer click para ser redirigido a una URL.

URL

Una URL (Uniform Resource Locator, o Localizador Uniforme de Recursos) es la dirección única e irrepetible que se utiliza en la Web para identificar y localizar un recurso (una página HTML, una imagen, un archivo PDF, un vídeo, etc.) en un servidor.

La sintaxis de una URL es la siguiente:
protocolo://usuario:contraseña@dominio:puerto/ruta?búsqueda#fragmento

Lo que más nos interesa en este punto son el protocolo, el dominio, la ruta y el localizador interno:

  • Protocolo:
    • http: recursos web.
    • https: recursos web (modo seguro).
    • ftp: recursos en un servidor de ficheros.
    • mailto: dirección de correo electrónico.
  • Dominio: nombre o IP del servidor que aloja el recurso.
  • Ruta: ubicación jerárquica del archivo o recurso dentro de la estructura de carpetas del servidor (por ejemplo, ut02.html).
  • Localizador interno: situado tras la almohadilla #, permite localizar una parte concreta del recurso destino.

Cuando solamente se indica la ruta, se asume que se está especificando una ruta relativa y el navegador tomará como punto de origen la ubicación del documento HTML actual.

Click aquí para una versión completa de esta explicación.

En términos generales, podemos clasificar los enlaces en globales, locales e internos

Enlaces globales

Son aquellos que apuntan a un recurso alojado en un servidor distinto mediante una URL absoluta (incluyendo el protocolo https:// y el nombre de dominio). Ejemplo:

Enlaces locales

Son aquellos que navegan entre diferentes archivos HTML o recursos pertenecientes al mismo sitio web utilizando, normalmente, rutas relativas. Dependiendo de la estructura del árbol de carpetas, podemos diferenciar tres casos:

.  
├── index.html  
└── paginas  
   ├── contacto  
   │   └── quienes_somos.html  
   ├── estoy_aqui.html  
   └── listado.html
Enlaces internos (bookmarks o anclas)

Permiten desplazarse a una posición o sección concreta dentro del mismo documento HTML sin cambiar de página. Para lograrlo, se combina el uso del localizador interno (#) con el atributo global id en el elemento de destino.

Atributos del elemento a

Para controlar el comportamiento del hipervínculo y la forma en que se recupera el recurso, el elemento a dispone de varios atributos clave:

<p>
  Consulta la
  <a href="https://www.w3.org" target="_blank" title="Sitio oficial del W3C">
	web oficial del W3C</a>
  o bien puedes
  <a href="ficheros/ut02.pdf" download="Apuntes_HTML_UT02.pdf">
	descargar los apuntes en PDF</a>.
</p>

Se muestra tal que así:
ut02-html-body-a.png500

Multimedia

Los elementos multimedia han estado presentes desde los principios de HTML gracias a las imágenes. Durante esos años se debía optimizar su uso y se limitaban al mínimo de resolución y tamaño necesarios para su correcta visualización. A día de hoy eso no es un problema y es posible incluso ver emisiones de vídeo en directo (streaming) casi desde cualquier lugar.

Con HTML5 se incrementaron los elementos multimedia web mediante componentes de audio y vídeo.

Imágenes

img
image

Las imágenes son fundamentales para hacer más atractivas las páginas web. Son el primer contenido no textual que se planteó incluir en HTML. Los navegadores tienen la capacidad de mostrar imágenes, pero sólo unos formatos concretos. La mayoría de navegadores reconocen los siguientes formatos:

Atributos principales del elemento img

El elemento img es también un elemento vacío que inserta una imagen en la página a través de sus atributos obligatorios y opcionales:

Tamaño de imagen, ¿contradicción presentacional?

Hemos repetido una y otra vez que los elementos y atributos presentacionales deben dejar de utlizarse en pro de CSS. Sin embargo, es muy recomendable establecer el ancho y alto de una imagendirectamente en el código HTML.

Esto no entra en contradicción con la separación entre estructura y presentación, ya que su propósito principal en HTML no es definir el diseño estilístico, sino informar al navegador de la relación de aspecto (aspect ratio) del archivo fuente antes de que termine de descargarse por la red.

Gracias a los atributos width y height, el navegador puede reservar el hueco en pantalla con antelación, evitando el efecto CLS (Cumulative Layout Shift o salto de maquetación) en el que los textos y elementos del documento pegan tirones hacia abajo cuando la imagen renderiza de golpe.

<img
	src="https://cdn.pixabay.com/photo/2016/07/30/16/21/koala-1557457_1280.jpg"
	alt="Koala sobre la rama de un árbol"
	width="300"
	height="200"
/>

Se muestra tal que así:
ut02-html-body-img.png500

Si la imagen no pudiera cargarse, en su lugar, se mostraría lo siguiente:
ut02-html-body-img-notfound.png500

Audio

audio

El elemento audio permite insertar y reproducir archivos de sonido directamente en el documento HTML sin necesidad de instalar plugins o reproductores externos.

Para controlar la reproducción del recurso, la etiqueta utiliza una serie de atributos booleanos (atributos que no requieren valor, su sola presencia activa la funcionalidad):

Curiosamente, este elemento no es vacío, y el valor que le demos se mostrará en el caso de que el audio no pueda cargarse por motivos de compatibilidad.

<audio
	src="https://upload.wikimedia.org/wikipedia/commons/b/b2/Whistling_blackbird.ogg"
	controls
>
	Tu navegador no soporta el elemento de audio en HTML
</audio>

Se muestra de la siguiente manera:
ut02-html-body-audio.png500

Video

video

El elemento video se utiliza para insertar reproductores de vídeo en la página web. A diferencia de las imágenes, tampoco es un elemento vacío, por lo que permite incluir texto o contenido alternativo en su interior para los navegadores que no soporten la reproducción de vídeo nativa.

Comparte con el elemento audio la mayoría de sus atributos principales (src, controls, autoplay, loop y muted), incorporando además atributos específicos para controlar el tamaño y la carátula:

<video
	src="https://upload.wikimedia.org/wikipedia/commons/e/ec/Indoor_climbing_Chiba-Japan_2025_11_16.webm"
	controls
	width="400"
	height="250"
>
  Tu navegador no soporta el elemento de vídeo en HTML.
</video>

Se vería tal que así:
ut02-html-body-video.png500

Tablas

table, tr, th, td
table, table row, table header, table data

Útiles para la organización y presentación de datos en filas y columnas. Tradicionalmente se usaban para la estructura de la propia web, pero ya no debe usarse de esa manera, sino para mostrar datos tabulares de forma clara y accesible.

Una tabla en HTML se construye mediante la interacción de varios elementos anidados:

Es muy importante entender bien la estructura de una tabla:

<table>
	<!-- Primera fila: Encabezados -->
	<tr>
		<th>Módulo</th>
		<th>Horas semanales</th>
	</tr>
	<!-- Segunda fila: Datos -->
	<tr>
		<td>Lenguajes de Marcas (LMSGI)</td>
		<td>4</td>
	</tr>
	<!-- Tercera fila: Datos -->
	<tr>
		<td>Programación</td>
		<td>7</td>
	</tr>
</table>

Se muestra así:
ut02-html-body-table.png500

Atributos de table
Atributos de th
Atributos de fusión en celdas td y th

Cuando una celda debe ocupar el espacio de varias columnas o filas adyacentes, se utilizan los siguientes atributos de expansión:

<table border="1">
	<!-- Fila 1 -->
	<tr>
		<th></th>
		<th scope="col">Lunes</th>
		<th scope="col">Martes</th>
		<th scope="col">Miércoles</th>
	</tr>
	
	<!-- Fila 2 -->
	<tr>
		<th scope="row">15:15 - 16:10</th>
		<td>Programación</td>
		<td>Entornos</td>
		<td rowspan="2">Lenguajes de Marcas</td>
	</tr>
	
	<!-- Fila 3 -->
	<tr>
		<th scope="row">16:10 - 17:05</th>
		<td>Entornos</td>
		<td rowspan="2">Lenguajes de Marcas</td>
	</tr>
	
	<!-- Fila 4 -->
	<tr>
		<th scope="row">16:10 - 17:05</th>
		<td>IPE I</td>
		<td>IPE I</td>
	</tr>
	
	<!-- Fila 5 -->
	<tr>
		<th scope="row">18:00 - 18:20</th>
		<td colspan="3">RECREO</td>
	</tr>

</table>

Se muestra tal que así:
ut02-html-body-table2.png500

Cuando empiezan a mezclarse td con rowspan y colspan puede dificultarse la lectura y planificación de la tabla. Al fusionar celdas, se debe "descontar" o ignorar la celda correspondiente en las filas o columnas adyacentes para no descuadrar la maquetación.

Para evitar errores en tablas complejas, es muy recomendable seguir estas tres reglas prácticas:

  1. Si usas colspan="N" en una celda, esa misma fila tendrá N-1 celdas menos escritas en el código HTML.
  2. Si usas rowspan="N" en una celda, las N filas inferiores sobre las que se extiende la fusión tendrán una celda menos definida en su marcado <tr>.
  3. Mapear la rejilla previamente: en tablas complejas con cruces de horario o cuadrantes, dibujar la tabla a mano o diseñarla primero en una hoja de cálculo ayuda a identificar rápidamente qué celdas deben llevar la expansión y cuáles deben omitirse en el código.

Elementos de bloque y elementos en línea

Como hemos visto hasta ahora, un documento HTML se construye mediante la anidación de una serie de elementos que estamos categorizando principalmente según su función dentro de la web. Sin embargo, existe otra manera de categorizarlos según el espacio que ocupan y cuál es su comportamiento en el flujo del documento. En función de estas dos características, dividimos los elementos HTML en dos grandes grupos:

Entender esta distinción es fundamental antes de abordar la estructuración visual y la maquetación de una página web, ya que determina cómo se posicionan los elementos de forma predeterminada sin necesidad de aplicar hojas de estilo.

Elementos de bloque

https://developer.mozilla.org/es/docs/Glossary/Block-level_content

Lo que todos los elementos de bloque tienen en común es el espacio que ocupan y su distribución en la página. Un elemento en bloque ocupa todo el ancho de su elemento padre, creando así un "bloque", y los navegadores suelen mostrarlos con un salto de línea antes y después.

Por ejemplo:

<p>Este es un párrafo (elemento de bloque)</p>
<p>Este es otro párrafo que se situará automáticamente debajo del anterior.</p>

Se muestra así:
ut02-html-body-elementos-bloque.png500

Como se puede apreciar, cada párrafo está en su propia línea, pero tal vez no se aprecie adecuadamente el espacio que ocupa realmente el párrafo. Añadimos el siguiente fragmento de código al head:

<style>
	p {
		background-color: lightblue;
	}
</style>

Con la siguiente representación:
ut02-html-body-elementos-bloque-estilo.png500

Ahora sí es evidente la propiedad del espacio que ocupa: todo el ancho de su elemento padre (en este caso es body).

Lo que más nos interesa sobre los elementos de bloque es su utilidad para la estructuración visual, ya que están diseñados para organizar grandes secciones de contenido o agrupar otros elementos. Como norma general, un elemento de bloque puede contener otros elementos de bloque y elementos en línea.

Imagina que queremos estructurar nuestra página web de la siguiente manera:

ut02-html-maquetación.png500

Cada uno de los bloques de esa imagen representa una sección definida en la distribución del sitio web. Para construir esa estructura, necesitamos contenedores que actúen como "cajas" de nivel de bloque, permitiendo agrupar varios elementos en su interior.

Importante

Muchos de los elementos de bloque no tienen una representación gráfica característica. La importancia de estos elementos es la semántica que proporcionan y la utilidad de agrupar otros. Definiremos la distribución visual de estos elementos gracias a las hojas de estilo.

Tipos de bloques

Esta clasificación habla en términos generales, pero es crucial entender que no todas las reglas aplican por igual a todos los elementos de bloque:

Por tanto, dentro de la categoría de elementos de bloque debemos diferenciar entre:

Elementos en línea

https://developer.mozilla.org/es/docs/orphaned/Web/HTML/Inline_elements

A diferencia de los elementos de bloque, los elementos en línea (inline) no ocupan todo el ancho de la página ni generan un salto de línea. Solo ocupan el espacio estrictamente necesario para mostrar su contenido y se colocan uno al lado del otro, fluyendo de forma natural con el texto (de izquierda a derecha por defecto).

Están diseñados para marcar, formatear o enlazar fragmentos específicos dentro de un bloque de texto. Por norma general, un elemento en línea no puede contener elementos de bloque en su interior, únicamente otros elementos en línea o texto plano.

Por ejemplo:

<p>
	  En este párrafo hay un <a href="#">enlace</a> y un texto en <strong>negrita</strong>.
</p>

Se muestra así:
ut02-html-body-elementos-linea.png500

Visualmente se puede apreciar que ha cambiado el formato específico de solamente una parte del texto pero, por evidenciarlo aún más, le aplicamos el siguiente estilo:

<style>
	a, strong {
		background-color: lightblue;
	}
</style>

Quedaría así:
ut02-html-body-elementos-linea-estilo.png500

Por norma general, un elemento en línea no debe contener elementos de bloque en su interior.

Resumen comparativo

A modo de resumen, la siguiente tabla recoge el comportamiento nativo general de ambas categorías dentro del flujo del documento:

Característica Elementos de bloque Elementos en línea
Ocupación de espacio Todo el ancho de su elemento padre Únicamente el espacio de su contenido
Salto de línea Se muestran con un salto de línea antes y después Se colocan uno al lado del otro en la misma línea
Capacidad de anidamiento Elementos de bloque y en línea Elementos en línea o texto plano
Propósito principal Estructurar y agrupar secciones o delimitar texto Formatear, destacar o enlazar fragmentos de texto

Elementos genéricos neutros

Desde HTML5 se recomienda el uso de los elementos semánticos para estructurar y organizar el contenido de una página web. Sin embargo, existen situaciones en las que necesitamos agrupar ciertos elementos o aislar fragmentos de texto exclusivamente con fines de aplicar estilos visuales, organizar su disposición espacial o manipular su contenido mediante JavaScript sin aportar ningún significado contextual o semántico al documento.

Para estos casos, HTML proporciona dos elementos contenedores completamente neutros, diferenciados por su comportamiento nativo en el flujo del documento.

Contenedor genérico de nivel de bloque

div
division

El elemento div es un contenedor neutro de nivel de bloque. Es decir: ocupa todo el espacio horizontal disponible de su contenedor padre y genera un salto de línea antes y después de su posición.

A diferencia de los bloques de contenido terminal, el elemento div es un bloque contenedor estructural puro: no impone restricciones semánticas y puede albergar libremente cualquier combinación de elementos de bloque (incluidos otros div) y elementos en línea.

<div class="info-modulo">
	  <h3>Lenguajes de Marcas</h3>
	  <p>Módulo enfocado en la estructuración de información web mediante HTML5 y XML.</p>
</div>

Se muestra así:
ut02-html-body-elementos-genericos-div.png500

Puede apreciarse que no tiene ningún tipo de representación visual. Sin embargo, aplicando algo de estilo:

<style>
	div {
		background-color: lightblue;
	}
</style>

Ya puede apreciarse que tanto el encabezado como el párrafo quedan agrupados.
ut02-html-body-elementos-genericos-div-estilo.png500

Contenedor genérico en línea

span
span (abarcar)

El elemento span es el equivalente neutro en línea. No genera saltos de línea y su ancho horizontal se ajusta estrictamente al contenido que envuelve.

Se utiliza habitualmente dentro de elementos de bloque (como párrafos, encabezados o celdas de tabla) para aislar fragmentos específicos de texto, palabras o números con el fin de aplicarles un estilo visual diferenciado o identificarlos desde código.

<p>El estado del servidor es <span class="estado-activo">Activo</span>.</p>

Se muestra así:
ut02-html-body-elementos-genericos-span.png500

Al igual que con div, puede apreciarse que no tiene ningún tipo de representación visual. Sin embargo, aplicando algo de estilo:

<style>
	.estado-activo {
		font-weight: bold;
		color: green;
		font-family: monospace;
	}
</style>

Ya puede apreciarse que se ha modificado el estilo de solamente la parte del texto que pertenece al elemento span.
ut02-html-body-elementos-genericos-span-estilo.png500

El problema de la "divitis"

Dado que div y span son elementos totalmente desprovistos de valor semántico, su uso excesivo e indiscriminado genera una mala práctica conocida como "divitis".

Abusar de div para construir todas las secciones de una página web dificulta enormemente la lectura y mantenimiento del código, destruye la accesibilidad para usuarios que dependen de lectores de pantalla y perjudica el posicionamiento en motores de búsqueda (SEO).

Hay que utilizar div y span únicamente como último recurso, cuando ninguna etiqueta semántica de HTML5 coincida con el propósito del contenido.

Elementos semánticos

header, nav, main, section, article, aside, footer

Antes de la especificación de HTML5, las páginas web se maquetaban mediante estructuras compuestas exclusivamente por cajas div anidadas a las que se asignaban atributos id o class con nombres arbitrarios (por ejemplo, <div id="cabecera">, <div class="menu">, <div id="pie">).

Aunque estas etiquetas permitían organizar el diseño visual con CSS, eran totalmente invisibles para los motores de búsqueda y los lectores de pantalla, ya que un navegador no puede interpretar el significado conceptual implícito en el nombre de una clase.

HTML5 introdujo un conjunto de elementos contenedores semánticos de nivel de bloque diseñados específicamente para reemplazar a los div estructurales, dotando a la arquitectura de la web de un significado estandarizado.

ut02-html-maquetación-semántica.png500

header (cabecera)

Representa el bloque contenedor de introducción o cabecera de un documento o de una sección concreta. Habitualmente alberga:

Ámbito de uso

Un documento HTML puede contener múltiples elementos <header>. Además de la cabecera general de la página, un elemento <article> o <section> puede tener su propio <header> interno.

nav (navegación)

Define una sección del documento cuyo propósito principal es albergar enlaces de navegación. Se utiliza para los bloques de navegación esenciales del sitio:

<nav>
	<ul>
	    <li><a href="#inicio">Inicio</a></li>
	    <li><a href="#servicios">Servicios</a></li>
	    <li><a href="#contacto">Contacto</a></li>
	  </ul>
</nav>
Restricción semántica

No todos los grupos de enlaces de la web deben envolverse en un <nav>. Reservaremos <nav> únicamente para los bloques de navegación principales. Los enlaces a redes sociales o avisos legales situados en el pie de página no requieren estrictamente un <nav>.

main (contenido principal)

Representa el contenido central y exclusivo del cuerpo del documento (<body>).

El contenido alojado en <main> debe ser único de esa página específica y no debe repetirse en otras secciones del sitio web (excluyendo barras laterales, cabeceras o enlaces de pie de página compartidos).

<main>
	  <h2>Servicios Veterinarios</h2>
	  <p>Ofrecemos atención integral para la salud de su mascota...</p>
</main>
Importante

  1. Solo debe existir un elemento <main> visible por cada página HTML.
  2. <main> nunca debe anidarse dentro de etiquetas como <header>, <nav>, <article>, <aside> o <footer>. Debe ser un hijo directo del elemento <body> (o estar envuelto únicamente en div neutros de maquetación).

section (sección temática)

Representa un bloque o sección genérica con coherencia temática dentro del documento. Se utiliza para dividir el contenido en capítulos, pestañas o bloques conceptuales delimitados.

Por regla general de accesibilidad, toda <section> debe incluir un encabezado (<h2>-<h6>) que titule la temática abordada en dicho bloque.

<section>
	<h2>Medicina Preventiva</h2>
	<p>Planes de vacunación y desparasitación adaptados a cada edad.</p>
</section>
article (contenido autónomo/artículo)

Representa una composición o fragmento de contenido que tiene sentido independiente por sí mismo y que podría ser distribuido, reutilizado o publicado en otro medio de forma aislada (por ejemplo, en un lector de noticias RSS o en un agregador de contenidos).

Ejemplos típicos de uso de <article>:

<article>
	<header>
	    <h3>Campaña de vacunación contra la rabia</h3>
	    <p>Publicado el 15 de octubre</p>
	</header>
	<p>Aprovecha un 15% de descuento en la vacunación anual durante todo este mes.</p>
</article>
¿section dentro de article o article dentro de section?

Ambas estructuras son totalmente válidas según el contexto:

  • Un conjunto de artículos de noticias (<article>) agrupados dentro de una sección de novedades (<section>).
  • Un artículo extenso (<article>) dividido internamente en varios capítulos o secciones de lectura (<section>).
aside (contenido tangencial/lateral)

Representa una sección de contenido relacionada con el tema principal que la rodea, pero que tiene un carácter secundario o tangencial.

Usos habituales de <aside>:

<aside>
	<h3>Teléfono de Urgencias</h3>
	<p>Atención 24h: <strong>912 345 678</strong></p>
</aside>

Representa el pie de página del documento completo o de una sección o artículo concreto. Contiene habitualmente información de cierre:

<footer>
	<p>&copy; 2026 Clínica Veterinaria Castillo Puche. Todos los derechos reservados.</p>
</footer>
Resumen
Elemento Significado semántico Repetible Debe llevar <hX>
<header> Cabecera introductoria de página o bloque Sí Recomendado
<nav> Bloque de enlaces de navegación principal Sí Opcional
<main> Núcleo de contenido único del documento No (solo 1 por página) Sí
<section> Agrupación temática de contenido Sí Sí
<article> Contenido autónomo e independiente Sí Sí
<aside> Contenido secundario, tangencial o lateral Sí Opcional
<footer> Pie de página o cierre de sección Sí Opcional

under_construction.webp