Глиф Учебники

Урок 4. Таблицы в HTML

Курс «HTML и CSS» · урок 4 из 10 · 3 минуты чтения

Таблица нужна там, где данные устроены строками и столбцами: расписание, прайс, результаты соревнований, сравнение тарифов. Для раскладки страницы на колонки таблицы не используют — для этого есть Flexbox и Grid (о них — в уроках Flexbox и Grid).

Из чего состоит таблица

HTML
<table>
  <tr>
    <th>День</th>
    <th>Время</th>
    <th>Занятие</th>
  </tr>
  <tr>
    <td>Понедельник</td>
    <td>15:00</td>
    <td>Рисунок</td>
  </tr>
  <tr>
    <td>Среда</td>
    <td>16:30</td>
    <td>Живопись</td>
  </tr>
</table>

Таблица строится по строкам: сначала строка, внутри неё ячейки слева направо. В каждой строке должно быть столько ячеек, сколько столбцов, иначе таблица «поедет».

<table> День Время Занятие Понедельник 15:00 Рисунок Среда 16:30 Живопись <tr> <tr> <tr> <th> название столбца <td> обычная ячейка
Таблица table из примера состоит из трёх строк tr: в первой — ячейки-заголовки th с названиями столбцов, в остальных — обычные ячейки td, по три в каждой строке.

Без CSS у таблицы нет рамок — только текст, выровненный по столбцам. Как добавить рамки — ниже.

Подпись и части таблицы

HTML
<table>
  <caption>Расписание кружка на неделю</caption>
  <thead>
    <tr>
      <th scope="col">День</th>
      <th scope="col">Время</th>
      <th scope="col">Занятие</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Понедельник</td>
      <td>15:00</td>
      <td>Рисунок</td>
    </tr>
    <tr>
      <td>Среда</td>
      <td>16:30</td>
      <td>Живопись</td>
    </tr>
  </tbody>
</table>

<thead> и <tbody> необязательны, но с ними таблицу проще оформлять: шапке можно задать свой фон одним правилом.

Объединение ячеек

Ячейка может занимать несколько столбцов (colspan) или несколько строк (rowspan).

HTML
<table>
  <tr>
    <th>Время</th>
    <th>Понедельник</th>
    <th>Вторник</th>
  </tr>
  <tr>
    <td>9:00</td>
    <td colspan="2">Экскурсия (оба дня)</td>
  </tr>
  <tr>
    <td>12:00</td>
    <td rowspan="2">Мастер-класс</td>
    <td>Обед</td>
  </tr>
  <tr>
    <td>14:00</td>
    <td>Свободное время</td>
  </tr>
</table>

Как это работает:

строка ячеек в коде 1 2 3 4 Время Понедельник Вторник 9:00 Экскурсия (оба дня) colspan="2" 12:00 Мастер-класс rowspan="2" Обед 14:00 Свободное время 3 2 3 2
Ячейка «Экскурсия» с colspan="2" занимает два столбца второй строки, а «Мастер-класс» с rowspan="2" — второй столбец третьей и четвёртой строк, поэтому в строках 2 и 4 в коде по две ячейки.

Главная ошибка с объединением — лишняя ячейка в строке, которую уже частично заняла ячейка сверху. Если таблица разъехалась, посчитайте ячейки в каждой строке с учётом colspan и rowspan.

Рамки и оформление

Атрибут border="1" у <table> браузеры до сих пор понимают, но он устарел: рамки задают в CSS. Как подключить CSS, подробно — в уроке Основы CSS, а пока вставьте этот блок в <head> страницы:

HTML
<style>
  table {
    border-collapse: collapse;
  }
  th, td {
    border: 1px solid #999;
    padding: 6px 12px;
  }
  thead th {
    background-color: #eee;
  }
</style>
По умолчанию День Время Занятие Среда 16:30 Живопись у каждой ячейки своя рамка border-collapse: collapse День Время Занятие Среда 16:30 Живопись соседние рамки слиты в одну линию
По умолчанию у каждой ячейки своя рамка и между ячейками видны промежутки, а с border-collapse: collapse соседние рамки сливаются в одну линию.

Больше способов оформить таблицу (полосы через строку, рамка только снаружи) — в справке Как сделать таблицу с рамками.

Широкая таблица на телефоне

Таблица из многих столбцов не помещается на узком экране и растягивает всю страницу вбок. Оберните её в блок с прокруткой — прокручиваться будет только таблица:

HTML
<div style="overflow-x: auto;">
  <table>
    <tr>
      <th>Тариф</th>
      <th>Цена</th>
      <th>Скорость</th>
      <th>Трафик</th>
      <th>Срок</th>
    </tr>
    <tr>
      <td>Базовый</td>
      <td>10 р.</td>
      <td>50 Мбит/с</td>
      <td>без ограничений</td>
      <td>месяц</td>
    </tr>
  </table>
</div>

overflow-x: auto показывает полосу прокрутки по горизонтали, только когда содержимое не помещается.

Коротко

Проверьте себя

1. Какой тег создаёт строку таблицы?
2. Как сделать, чтобы одна ячейка занимала три столбца?
3. Зачем нужен border-collapse: collapse?
4. Чем лучше сделать страницу из двух колонок — меню слева и текст справа?