Ir al contenido
wannacode

Texto, enlaces, imágenes, tablas

En resumen: El contenido de una página HTML se compone de encabezados h1–h6, párrafos, listas, enlaces con href, imágenes con alt y tablas de datos con caption, th y scope.

Problema

«Leche» no lleva a ninguna parte

Un cliente escribe que en la página del pan el enlace «Leche» lleva a «Página no encontrada». En la página de inicio el mismo menú funciona. La página está en https://shop.example/bread/white/dobrudzha.

HTML, CSS, JS
index.html

Haz clic en «Leche». El sandbox es una sola página y no abre enlaces, pero la consola dice lo que hay en href: milk. Los otros enlaces empiezan con /, y este no. Sin / el navegador no va a /milk. Construye la dirección a partir de la dirección de la página en la que estás, y obtiene otra.

La idea

Direcciones completas y relativas

Un enlace es <a> con el atributo href: adónde lleva. La dirección de href (una URL) es completa o relativa.

Una dirección completa lo tiene todo: el esquema (https://), el host (shop.example) y la ruta (/bread/white/dobrudzha). La ruta se compone de carpetas separadas por /, y la última parte es la página.

Una dirección relativa está incompleta, y el navegador la completa con la dirección de la página en la que está el enlace. El principio decide cómo:

  • milk (nada delante): desde la carpeta de la página.
  • ../milk: una carpeta hacia arriba.
  • /milk: desde la raíz del sitio, sea cual sea la página.
  • #price: un lugar dentro de la misma página, el elemento con id="price".

Por eso el menú, que está en todas las páginas, usa direcciones desde la raíz: /milk lleva al mismo sitio desde cualquier parte. Una dirección completa solo la escribes para otro sitio web.

Míralo

Mira cómo se construye la dirección

Cinco enlaces en la misma página. Fíjate en qué partes de la dirección de arriba conserva el navegador y qué añade.

<!-- la dirección de la página: https://shop.example/bread/white/dobrudzha -->
<a href="milk">Leche</a>
<a href="../milk">Leche</a>
<a href="/milk">Leche</a>
<a href="#price">El precio</a>
<a href="https://recipes.example/bread">Recetas</a>
Paso a paso, en palabras
  1. La página está en https://shop.example/bread/white/dobrudzha. El navegador divide la dirección en partes: el esquema, el host y la ruta. La ruta está hecha de carpetas, y la última parte es la página misma.
  2. href="milk" no tiene nada delante. El navegador conserva la carpeta de la página, /bread/white/, y cambia solo la última parte. Obtiene /bread/white/milk: una página que no existe.
  3. ../ significa una carpeta hacia arriba. Desde /bread/white/ el navegador sube a /bread/ y añade milk. Sigue sin ser /milk.
  4. Una barra delante significa desde la raíz del sitio. El navegador conserva solo el esquema y el host. Esta dirección funciona desde cualquier página de la tienda.
  5. # es un lugar dentro de la misma página. El navegador conserva toda la dirección y añade #price. La página no se vuelve a cargar: se desplaza hasta el elemento con id="price".
  6. Una dirección con esquema es completa. El navegador no toma nada de la página. Así se enlaza a otro sitio.
  7. El principio de href decide: nada o ../ cuenta desde la carpeta, / desde la raíz, # se queda en la página, https:// es una dirección completa.

El navegador no le pregunta al servidor si la dirección existe. Construye la dirección según las reglas y va allí. Por eso un error en href no se nota en el código, sino solo cuando alguien hace clic en el enlace. En el navegador ves la dirección construida cuando pones el ratón sobre un enlace: abajo a la izquierda de la ventana.

Pruébalo

Arregla los enlaces

Arregla los enlaces: «Leche» y «Carrito» deben funcionar desde cualquier página de la tienda (una dirección desde la raíz: /milk y /cart). «Ir al precio» debe saltar al párrafo con el precio. «Recetas con este pan» lleva a otro sitio web: haz que se abra en una pestaña nueva sin que ese sitio obtenga acceso a nuestra página.

HTML, CSS, JS

Pruébalo

Completa

El enlace tiene que saltar al precio de la misma página. ¿Qué va en href?

<a href="">Ir al precio</a>
…
<p id="price">Precio: 1,80 €</p>

La idea

Texto: esquema, párrafos, listas

Los encabezados <h1> … <h6> no son seis tamaños de letra. Son el esquema de la página, como el índice de un libro. <h1> es el título de la página, <h2> son sus secciones, <h3> son partes de una sección. Los niveles no se saltan: después de <h2> viene <h3>, no <h5>. Un lector de pantalla muestra este esquema como una lista, y la persona salta de sección en sección. El tamaño se cambia con CSS, sin tocar el esquema.

Lo demás:

  • <p> es un párrafo. <br> es un salto de línea dentro de un párrafo (una dirección, un poema), no una manera de hacer listas.
  • <ul> es una lista sin orden (ingredientes), <ol> tiene orden (pasos). Cada elemento es <li>.
  • <dl> es una lista de pares «nombre y valor»: <dt> es el nombre (Peso), <dd> es el valor (650 g).
  • <strong> es importante («Contiene gluten.»), y <em> es un énfasis que cambia el significado («en una bolsa de tela, no en plástico»). Si solo quieres negrita por el aspecto, sin significado, eso es CSS.
HTML, CSS, JS
index.html

Pruébalo

Haz un esquema

Un compañero eligió los encabezados por tamaño: el nombre del pan es un <h4> y la oferta es un <h1>. Haz el esquema: el nombre del producto es el título de la página, «Ingredientes» y «Cómo conservarlo» son las secciones. La oferta no es un encabezado: conviértela en texto importante dentro de un párrafo. Los ingredientes son una lista.

HTML, CSS, JS
index.html

La idea

Imágenes

<img src="img/bread.svg" alt="Un pan blanco redondo con corteza crujiente" width="240" height="240">
  • src es la dirección de la imagen. Se construye igual que href.
  • alt es el texto en lugar de la imagen. Un lector de pantalla lo lee, un buscador lo indexa, y si la imagen no se carga, el navegador lo muestra en su lugar. Escribe lo que muestra la imagen y por qué está ahí.
  • Una imagen que es solo decoración, o que repite el texto de al lado, lleva alt="". Entonces el lector de pantalla se la salta. No poner alt es un error: el lector no sabe que es decoración.
  • Una imagen que es lo único dentro de un enlace le da su nombre al enlace. El alt es adónde lleva el enlace: «La tienda», no «logotipo».
  • width y height son el tamaño en píxeles. Mientras la imagen está en camino, el navegador no sabe cuánto mide y le da 0 píxeles de alto. Cuando llega, el texto de abajo salta hacia abajo. Con width y height el navegador reserva el lugar de antemano, incluso cuando CSS la hace más pequeña.

Pruébalo

Añade alt y tamaños

El logotipo es lo único dentro del enlace a la página de inicio: el enlace tiene que llamarse «La tienda». La foto del pan muestra algo: descríbelo en alt. El icono de regalo repite el texto de al lado. La foto mide 240 × 240 píxeles: díselo al navegador.

HTML, CSS, JS
index.html

Un lector de pantalla dice solo «enlace» en uno de los enlaces. ¿En qué línea está el error?

La idea

Tablas de datos

Una tabla es para datos en filas y columnas: precios, pedidos, un horario. Un lector de pantalla la lee como tabla: «fila 3, columna Precio, 7,90 €». Por eso es solo para datos, y no para colocar una página en columnas. Eso lo hace CSS.

<table>
<caption>Precios de hoy</caption>
<thead>
<tr><th scope="col">Producto</th><th scope="col">Precio</th></tr>
</thead>
<tbody>
<tr><th scope="row">Queso blanco</th><td>7,90 €</td></tr>
</tbody>
</table>
  • <caption> es el nombre de la tabla. Va dentro de la tabla, no como un encabezado encima.
  • <tr> es una fila. <td> es una celda de datos, y <th> es una celda de encabezado.
  • scope="col" dice que el encabezado es de la columna que tiene debajo, y scope="row" de la fila que tiene a la derecha.
  • <thead> contiene las filas de encabezado, <tbody> los datos, <tfoot> la suma de abajo.

Pruébalo

La lista de precios

La lista de precios está hecha con celdas <td> y texto en negrita. Conviértela en una tabla de datos: el nombre «Precios de hoy» pertenece a la tabla, la fila de encabezado va en <thead>, y los productos van en <tbody>. Los encabezados de columna y los nombres de los productos son celdas de encabezado; usa scope para decir de qué es cada una.

HTML, CSS, JS
index.html
Más precisamente, para curiosos

Más sobre direcciones. ./milk es lo mismo que milk. ?page=2 conserva la ruta y cambia solo la consulta: /bread/white/dobrudzha?page=2. Una dirección que empieza con // conserva solo el esquema: //cdn.example/x.js es https://cdn.example/x.js. ../ por encima de la raíz no sube más: ../../../milk desde nuestra página es /milk. En JavaScript esta construcción es new URL('../milk', 'https://shop.example/bread/white/dobrudzha').

target="_blank" y window.opener. Chromium ya da a la pestaña nueva de target="_blank" window.opener === null, igual que con rel="noopener", y rel="opener" devuelve la conexión. Escribimos rel="noopener" para que quede claro también en los navegadores que no lo hacen por sí solos.

Imágenes para distintas pantallas. srcset da varios tamaños de una imagen, y el navegador elige uno para la pantalla. loading="lazy" carga la imagen cuando se acerca a la pantalla. Ambas cosas pertenecen al módulo de CSS y a la velocidad.

Celdas combinadas. colspan="3" combina tres celdas de una fila, y rowspan="2" dos celdas de una columna. Entonces scope importa: sin él el navegador adivina de qué celdas es el encabezado.

<b>, <i> y <br>. Existen y tienen un significado: <b> es texto que destaca sin ser más importante (una palabra clave), <i> es otra voz (un término, el título de un libro). Para texto importante existe <strong>, para el énfasis existe <em>.

Ejercicio

Pedido 1042

Construye desde cero la página del pedido 1042. Un menú con un enlace «Mis pedidos» a /orders. Un encabezado «Pedido 1042», y debajo «Estado: enviado». Después una tabla «Los productos del pedido» con las columnas Producto, Cantidad, Precio, Suma: Pan Dobrudzha 2 × 1,80 € = 3,60 €, Leche fresca 3% 1 × 2,40 € = 2,40 €, Queso blanco 1 × 7,90 € = 7,90 €. Delante de cada nombre hay una imagen de 32 × 32 (img/bread.svg, img/milk.svg, img/cheese.svg). Abajo va la fila «Total» con 13,90 € en la última columna.

HTML, CSS, JS
index.html

Test

Ponte a prueba

1. La página está en https://shop.example/bread/white/dobrudzha. ¿Adónde lleva <a href="../milk">?
2. El nombre del producto es demasiado grande como <h1>. ¿Qué haces?
3. Junto al texto «Regalo en pedidos de más de 30 €» hay un icono de regalo. ¿Qué alt necesita?
4. ¿Por qué escribir width y height en <img> si la imagen se muestra también sin ellos?
5. ¿Cuándo es <table> el elemento correcto?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·