Conceptos básicos de las tablas HTML
====================================

* Overview: Tables
* Siguiente

Este artículo te ayudará a comenzar con las tablas HTML. Vamos a exponer conceptos básicos como filas y celdas, encabezados, celdas que abarcan múltiples columnas y filas, y la forma de agrupar todas las celdas de una columna para aplicarles estilo.

|  |  |
| --- | --- |
| Prerrequisitos: | 
 Conceptos básicos de HTML (ver
 Introducción al HTML).
  |
| Objetivo: | Adquirir conocimientos básicos de las tablas HTML. |

¿Qué es una tabla?
------------------

Una tabla es un conjunto estructurado de datos distribuidos en filas y columnas (**datos tabulados**). Una tabla permite buscar con rapidez y facilidad valores entre diferentes tipos de datos que indiquen algún tipo de conexión. Por ejemplo, una persona y su edad, o un día de la semana o el horario de una piscina municipal.

![Una tabla de datos de ejemplo que muestra los nombres y las edades de algunas personas: Chris 38, Dennis 45, Sarah 29, Karen 47.](/es/docs/Learn/HTML/Tables/Basics/numbers-table.png)

![Una tabla de datos que muestra unos horarios de clases natación](/es/docs/Learn/HTML/Tables/Basics/swimming-timetable.png)

Las tablas se utilizan con mucha frecuencia en la sociedad desde hace años, como lo demuestra este documento censal de los EUA de 1800:

![Un pergamino muy antiguo; cuesta un poco leer los datos, pero muestra con claridad que las tablas de datos ya se utilizaban en 1800.](/es/docs/Learn/HTML/Tables/Basics/1800-census.jpg)

Por lo tanto, no es de extrañar que los creadores de HTML proporcionen un medio con el que estructurar y presentar datos en tablas en la web.

### ¿Cómo funciona una tabla?

El aspecto básico de una tabla es que es un elemento rígido. Es fácil interpretar la información haciendo asociaciones visuales entre los encabezados de las filas y las columnas. Por ejemplo, observa la tabla siguiente y busca un gigante de gas joviano con 62 lunas. Puedes encontrar la respuesta asociando los encabezados de la fila y la columna correspondientes.


 Datos sobre los planetas de nuestro sistema solar (datos planetarios tomados
 de la hoja técnica sobre datos planetarios de la NASA (Nasa's Planetary Fact Sheet - Metric).
 |  | Nombre | Masa (1024 kg) | Diámetro (km) | Densidad (kg/m3) | Gravedad (m/s2) | Duración del día (horas) | Distancia del Sol (106km) | Temperatura media (°C) | Número de lunas | Observaciones |
| Planetas terrestres | Mercurio | 0,330 | 4.879 | 5.427 | 3,7 | 4.222,6 | 57,9 | 167 | 0 | El más cercano al Sol |
| Venus | 4,87 | 12.104 | 5.243 | 8,9 | 2.802,0 | 108,2 | 464 | 0 |  |
| La Tierra | 5,97 | 12.756 | 5.514 | 9,8 | 24,0 | 149,6 | 15 | 1 | Nuestro planeta |
| Marte | 0,642 | 6.792 | 3.933 | 3,7 | 24,7 | 227,9 | -65 | 2 | El planeta rojo |
| Planetas jovianos | Los gigantes de gas | Júpiter | 1.898 | 142.984 | 1.326 | 23,1 | 9,9 | 778,6 | -110 | 67 | El planeta más grande |
| Saturno | 568 | 120.536 | 687 | 9,0 | 10,7 | 1.433,5 | -140 | 62 |  |
| Los gigantes de hielo | Urano | 86,8 | 51.118 | 1.271 | 8,7 | 17,2 | 2.872,5 | -195 | 27 |  |
| Neptuno | 102 | 49.528 | 1.638 | 11,0 | 16,1 | 4.495,1 | -200 | 14 |  |
| Planetas enanos | Plutón | 0,0146 | 2.370 | 2.095 | 0,7 | 153,3 | 5.906,4 | -225 | 5 | 
 Desclasificado como planeta en 2006, pero aún es una
 cuestión polémica.
  |

Cuando se hace correctamente, incluso las personas ciegas pueden interpretar los datos de una tabla HTML. Una tabla HTML bien hecha debe mejorar la experiencia de los usuarios videntes e invidentes por igual.

### Dar estilo a las tablas

También puedes echar un vistazo al ejemplo vivo en GitHub. Observarás que la tabla que encontrarás allí tiene un aspecto más legible; esto se debe a que la tabla que ves en esta página tiene un estilo mínimo, mientras que en la de la versión de GitHub se ha aplicado un CSS más significativo.

No te hagas ilusiones; para que las tablas sean efectivas en la web, debes proporcionar cierta información de estilo con CSS, así como una buena estructura sólida con HTML. En este módulo nos centramos en la parte HTML; para averiguar sobre la parte del CSS debes visitar nuestro artículo Aplicar estilo a las tablas.

En este módulo no nos vamos a centrar en el CSS, sino que te vamos a proporcionar una hoja de estilo de CSS que dará a tus tablas algo más de legibilidad de la que se obtiene por defecto si no se proporciona ningún estilo. Puedes encontrar la hoja de estilo aquí, así como también una plantilla HTML para aplicar la hoja de estilo (te darán un buen punto de partida para experimentar con las tablas HTML).

### ¿Cuándo no debes usar tablas HTML?

Las tablas HTML están pensadas para utilizarse con datos tabulados. Por desgracia, mucha gente utiliza las tablas HTML para hacer compaginaciones de páginas web. Por ejemplo, una fila para contener la cabecera, una fila para contener las columnas de contenido, una fila para contener el pie de página, etc. Puede encontrar más detalles y un ejemplo en Diseños de página en nuestro Módulo de aprendizaje de accesibilidad. Se solía hacer este uso de las tablas porque la compatibilidad CSS entre navegadores solía ser terrible. Los diseños de tablas son mucho menos comunes hoy en día, pero aún se pueden ver en algunos rincones de la web.

En resumen, es una mala idea usar tablas para el diseño en lugar de las técnicas de diseño CSS. Las razones principales son las siguientes:

1. **Las tablas de diseño reducen la accesibilidad para los usuarios con discapacidad visual**: Los lectores de pantalla (en-US) que utilizan las personas con visibilidad reducida interpretan las etiquetas de una página HTML y leen su contenido para el usuario. Puesto que las tablas no son la herramienta adecuada para el diseño y el marcado es más complejo que con las técnicas de diseño CSS, la salida de los lectores de pantalla será confusa para estos usuarios.
2. **Las tablas generan estructuras incorrectas**: Como ya se mencionó, los diseños de tabla suelen involucrar estructuras de marcado más complejas que las técnicas de diseño. Esto puede dificultar la escritura, el mantenimiento y la depuración del código.
3. **Las tablas no tienen respuesta adaptativa automática**: Cuando usas contenedores de diseño adecuados (tales como `<header>`, `<section>`, `<article>` o `<div>`), su ancho predeterminado es el 100% de su elemento padre. En cambio, las tablas se dimensionan de forma predeterminada según su contenido, por lo que se necesitan medidas adicionales para que el diseño de la tabla funcione de manera efectiva en todos los dispositivos.
Aprendizaje activo: Crea tu primera tabla
-----------------------------------------

Ya hemos hablado bastante sobre la teoría de las tablas, así que veamos un ejemplo práctico y construyamos una tabla simple.

1. En primer lugar, haz una copia local de blank-template.html y minimal-table.css en un directorio nuevo de tu ordenador.
2. El contenido de cada tabla está delimitado entre estas dos etiquetas: **`<table></table>`**. Añádelas al cuerpo de tu código HTML.
3. El contenedor más pequeño dentro de una tabla es una celda, que se crea con un elemento **`<td>`** ('td' significa 'table data', *datos de tabla*). Añade lo siguiente dentro de tus etiquetas de tabla:

```html
<td>Hola, soy tu primera celda.</td>
```

4. Si quieres una fila de cuatro celdas, tienes que copiar estas etiquetas tres veces. Actualiza el contenido de la tabla para que se vea así:

```html
<td>Hola, soy tu primera celda.</td>
<td>Soy tu segunda celda.</td>
<td>Soy tu tercera celda.</td>
<td>Soy tu cuarta celda.</td>
```


Como verás, las celdas no se colocan una debajo de la otra, sino que se alinean automáticamente entre sí en la misma fila. Cada elemento <td> crea una sola celda, y juntas forman la primera fila. Cada celda que agregamos hace crecer la fila.

Para detener el crecimiento de esta fila y comenzar a colocar las celdas posteriores en una segunda fila, necesitamos usar el elemento **`<tr>`** ('tr' significa 'table raw', *fila de tabla*). Vamos a verlo en detalle.

1. Coloca las cuatro celdas que has creado dentro de las etiquetas `<tr>`, de esta forma:

```html
<tr>
  <td>Hola, soy tu primera celda.</td>
  <td>Soy tu segunda celda.</td>
  <td>Soy tu tercera celda.</td>
  <td>Soy tu cuarta celda.</td>
</tr>
```

2. Ahora que has hecho una fila, intenta hacer una o dos más: cada fila debe estar delimitada por un elemento `<tr>` adicional, con cada celda contenida en un `<td>`.

Esto debería dar como resultado una tabla similar a la siguiente:

|  |  |  |  |
| --- | --- | --- | --- |
| Hola, soy tu primera celda. | Soy tu segunda celda. | Soy tu tercera celda. | Soy tu cuarta celda. |
| Segunda fila, primera celda. | Celda 2. | Celda 3. | Celda 4. |

**Nota:** También puedes encontrar esto en GitHub como simple-table.html (consúltalo en vivo).

Añadir encabezados con elementos <th>
-------------------------------------

Ahora nos vamos a centrar en los encabezados de tabla: celdas especiales que van al comienzo de una fila o columna y definen el tipo de datos que contiene esa fila o columna (por ejemplo, observa las celdas «Propietario» y «Edad» en el primer ejemplo que se muestra en este artículo). Para ilustrar por qué son útiles, echa un vistazo al ejemplo de tabla siguiente. En primer lugar, el código fuente:


```html
<table>
  <tr>
    <td>&nbsp;</td>
    <td>Knocky</td>
    <td>Flor</td>
    <td>Ella</td>
    <td>Juan</td>
  </tr>
  <tr>
    <td>Raza</td>
    <td>Jack Russell</td>
    <td>Caniche</td>
    <td>Perro callejero</td>
    <td>Cocker Spaniel</td>
  </tr>
  <tr>
    <td>Edad</td>
    <td>16</td>
    <td>9</td>
    <td>10</td>
    <td>5</td>
  </tr>
  <tr>
    <td>Propietario</td>
    <td>Suegra</td>
    <td>Yo</td>
    <td>Yo</td>
    <td>Cuñada</td>
  </tr>
  <tr>
    <td>Hábitos alimentarios</td>
    <td>Come las sobras de todos</td>

    <td>Mordisquea la comida</td>
    <td>Come en abundancia</td>

    <td>Come hasta que revienta</td>
  </tr>
</table>
```


Ahora observa la tabla representada:

|  |  |  |  |  |
| --- | --- | --- | --- | --- |
|  | Knocky | Flor | Ella | Juan |
| Raza | Jack Russell | Caniche | Perro callejero | Cocker Spaniel |
| Edad | 16 | 9 | 10 | 5 |
| Propietario | Suegra | Yo | Yo | Cuñada |
| Hábitos alimentarios | Come las sobras de todos | Mordisquea la comida | Come en abundancia | Come hasta que revienta |

El problema aquí es que, si bien puedes distinguir lo que sucede, no es tan fácil cruzar datos de referencia. Sería mucho mejor si los encabezados de las columnas y las filas se destacasen de alguna manera.

### Aprendizaje activo: encabezados de tabla

Intentemos mejorar esta tabla.

1. Primero, haz una copia local de nuestros archivos dogs-table.html y minimal-table.css en un directorio nuevo de tu ordenador. El HTML contiene el mismo ejemplo sobre perros que viste arriba.
2. Para reconocer los encabezados de la tabla como encabezados, tanto visual como semánticamente, puedes usar el elemento **`<th>`** ('th' significa 'table header', *encabezado de tabla*). Funciona exactamente igual que un `<td>`, excepto que denota un encabezado, no una celda normal. Entra en el código HTML, y cambiar todos los elementos `<td>` que delimitan los encabezados de tabla por elementos `<th>`.
3. Guarda tu HTML y cárgalo en un navegador. Los encabezados deberían verse como tal.

**Nota:** Puedes encontrar nuestro ejemplo terminado en dogs-table-fixed.html en GitHub (o consultarlo en vivo).

### ¿Por qué son útiles los encabezados?

Ya hemos respondido parcialmente a esta pregunta: es más fácil encontrar los datos que buscas cuando los encabezados se destacan con claridad, y el diseño suele presentar un aspecto mejor.

**Nota:** Los encabezados de las tablas vienen con un estilo predeterminado: están en negrita y centrados (incluso si no añades tu estilo propio a la tabla) para que destaquen.

Los encabezados de tabla también presentan otra ventaja: junto con el atributo de `scope` (que veremos en el próximo artículo), mejoran la accesibilidad de las tablas porque asocian cada encabezado con todos los datos de la misma fila o columna. Así que los lectores de pantalla pueden leer una fila o columna de datos a la vez, lo cual es bastante útil.

Celdas que abarcan varias filas y columnas
------------------------------------------

A veces queremos que las celdas abarquen varias filas o columnas. Toma el ejemplo siguiente, que muestra los nombres de algunos animales comunes. En algunos casos, queremos mostrar los nombres de los machos y las hembras junto al nombre del animal. A veces no lo queremos, y en tales casos queremos que el nombre del animal abarque toda la tabla.

El marcado inicial se ve así:


```html
<table>
  <tr>
    <th>Animales</th>
  </tr>
  <tr>
    <th>Hipopótamo</th>
  </tr>
  <tr>
    <th>Caballo</th>
    <td>Yegua</td>
  </tr>
  <tr>
    <td>Semental</td>
  </tr>
  <tr>
    <th>Cocodrilo</th>
  </tr>
  <tr>
    <th>Pollo</th>

    <td>Gallina</td>
  </tr>
  <tr>
    <td>Gallo</td>
  </tr>
</table>
```


Pero la salida no nos da exactamente lo que queremos:

| Animales |
| --- |
| Hipopótamo |
| Caballo | Yegua |
| Semental |
| Cocodrilo |
| Pollo | Gallina |
| Gallo |

Necesitamos una forma de hacer que «Animales», «Hipopótamo» y «Cocodrilo» se extiendan dos columnas más allá, y «Caballo» y «Pollo» se extiendan dos filas más abajo. Por fortuna, los encabezados de tabla y las celdas tienen los atributos `colspan` y `rowspan`, que nos permiten hacer exactamente esas cosas. Ambos aceptan un valor numérico sin unidades, que es igual al número de filas o columnas que desea abarcar. Por ejemplo, `colspan="2"` extiende una celda dos columnas más allá.

Usemos `colspan` y `rowspan` para mejorar esta tabla.

1. Primero, haz una copia local de nuestros archivos animals-table.html y minimal-table.css en un directorio nuevo de tu ordenador. El HTML contiene el mismo ejemplo sobre perros que viste arriba.
2. Luego, usa `colspan` para extender las celdas «Animales», «Hipopótamo» y «Cocodrilo» dos columnas más allá.
3. Por último, usa `rowspan` para extender las celdas de «Caballo» y «Pollo» dos filas más abajo.
4. Guarda tu código y ábrelo en un navegador para ver la mejora.

**Nota:** Puedes encontrar nuestro ejemplo terminado en animals-table-fixed.html en GitHub (o consultarlo en vivo).

Proporcionar un estilo común a las columnas
-------------------------------------------

Hay una última característica de la que queremos hablar en este artículo antes de continuar. El HTML tiene un método para definir información de estilo para una columna completa de datos en un solo lugar: los elementos **`<col>`** y **`<colgroup>`**. Estos atributos existen porque especificar el estilo de las columnas puede resultar enojoso e ineficiente; en general hay que especificar la información de estilo en *cada* `<td>` o `<th>` de la columna, o utilizar un selector complejo como `:nth-child()` (en-US).

Tomemos el ejemplo sencillo siguiente:


```html
<table>
  <tr>
    <th>Dato 1</th>
    <th style="background-color: yellow">Dato 2</th>
  </tr>
  <tr>
    <td>Calcuta</td>
    <td style="background-color: yellow">Pizza</td>
  </tr>
  <tr>
    <td>Robots</td>
    <td style="background-color: yellow">Jazz</td>
  </tr>
</table>
```


Esto nos da el resultado siguiente:

| Dato 1 | Dato 2 |
| --- | --- |
| Calcuta | Pizza |
| Robots | Jazz |

Esto no es ideal, porque hay que repetir la información de estilo en las tres celdas de la columna (en un proyecto real probablemente habría definida una clase `class` en las tres celdas y el estilo se especificaría en una hoja de estilo por separado). En vez de hacer esto, podemos especificar la información una sola vez, con un elemento `<col>`. Los elementos `<col>` se especifican dentro de un contenedor `<colgroup>` justo debajo de la etiqueta de apertura `<table>`. Podríamos crear el mismo efecto que vemos arriba especificando nuestra tabla de la manera siguiente:


```html
<table>
  <colgroup>
    <col />
    <col style="background-color: yellow" />
  </colgroup>
  <tr>
    <th>Dato 1</th>

    <th>Dato 2</th>
  </tr>
  <tr>
    <td>Calcuta</td>
    <td>Pizza</td>
  </tr>
  <tr>
    <td>Robots</td>
    <td>Jazz</td>
  </tr>
</table>
```


En efecto, definimos dos tipos de «columnas de estilo», una que especifica la información para la aplicación de estilo en cada columna. No aplicamos estilo a la primera columna, sino que aún tenemos que incluir un elemento `<col>` en blanco; de lo contrario, el estilo también se aplicaría a la primera columna.

Si quisiéramos aplicar la información de estilo a ambas columnas, podríamos incluir un elemento `<col>` con un atributo `span`, como este:


```html
<colgroup>
  <col style="background-color: yellow" span="2" />
</colgroup>
```


Al igual que `colspan` y `rowspan`, `span` toma un valor numérico sin unidades que especifica el número de columnas a las que se desea aplicar el estilo.

### Aprendizaje activo: colgroup y col

Ahora es el momento de intentarlo tú mismo.

A continuación puedes ver el horario de una profesora de idiomas. El viernes tiene que enseñar holandés todo el día, pero también enseña alemán durante unas horas los martes y los jueves, y quiere resaltar las columnas que contienen los días que da clase.

Recrea la tabla a partir de los pasos siguientes.

1. Primero, haz una copia local de nuestro archivo timetable.html en un directorio nuevo de tu ordenador. El HTML contiene la misma tabla que viste arriba, menos la información de estilo de las columnas.
2. Añade un elemento `<colgroup>` en la parte superior de la tabla, justo debajo de la etiqueta `<table>`, en la que puedes añadir tus elementos `<col>` (consulta los pasos restantes a continuación).
3. Las dos primeras columnas deben dejarse sin estilo.
4. Añade un color de fondo a la tercera columna. El valor para tu atributo de `style` es `background-color:#97DB9A;`
5. Establece un ancho distinto para la cuarta columna. El valor de tu atributo de `style` es `width: 42px;`
6. Añade un color de fondo a la quinta columna. El valor para tu atributo de `style` es `background-color:#97DB9A;`
7. Añade un color de fondo diferente más un borde a la sexta columna, para indicar que este es un día especial porque da clases de un idioma diferente. Los valores para tu atributo de `style` son `background-color:#DCC48E; border:4px solid #C1437A;`
8. Los últimos dos días los tiene libres, así que no establezcas ningún color de fondo, pero sí un valor para el ancho; el valor para el atributo de `style` es `width: 42px;`

Mira cómo sigue en el ejemplo. Si te encallas o quieres verificar tu trabajo, puedes encontrar nuestra versión en GitHub como timetable-fixed.html (o también puedes consultarlo en vivo).

Resumen
-------

Con esto casi hemos abarcado todos los conceptos básicos de las tablas HTML. En el próximo artículo, veremos algunas características un poco más avanzadas de las tablas y comenzaremos a pensar acerca de su accesibilidad para las personas con discapacidad visual.

* Overview: Tables
* Siguiente