Как сделать таблицу в HTML
Таблица это элемент <table>, состоящий из строк (<tr>), а каждая строка состоит из ячеек: <th> для ячеек заголовков и <td> для ячеек с данными.
Собственных рамок у таблицы нет; единственное правило CSS добавляет их, чтобы были видны ячейки. Столбцы образуются из ячеек: первая ячейка каждой строки это первый столбец, вторая это второй, и так далее. В каждой строке должно быть одинаковое количество ячеек. Удалите <td>, и эта строка закончится раньше, оставив пустое место.
Ячейки <th> по умолчанию жирные и выровнены по центру. Это только внешний вид; важно то, что они являются подписями, и об этом следующий раздел.
Элементы таблицы
| Элемент | Что это |
|---|---|
<table> | Таблица |
<caption> | Заголовок таблицы, первый дочерний элемент <table> |
<thead> | Группа строк шапки |
<tbody> | Группа строк тела (их у таблицы может быть несколько) |
<tfoot> | Группа строк подвала, например с итогами |
<tr> | Строка |
<th> | Ячейка заголовка |
<td> | Ячейка с данными |
<colgroup>, <col> | Столбцы, чтобы оформить столбец целиком (ширина, фон) |
Рамки описаны на странице рамка таблицы в HTML, а ячейки, занимающие несколько столбцов или строк, на странице colspan и rowspan.
Ячейки заголовков, scope и caption
Таблица с заголовками сверху и сбоку должна указывать, в какую сторону относится каждый заголовок. scope="col" подписывает столбец под собой, scope="row" подписывает строку рядом с собой. <caption> дает таблице видимый заголовок:
С такой разметкой программа чтения с экрана, переходя к ячейке 14:00, может объявить «Saturday, Closes, 14:00», и число никогда не звучит само по себе. В простой таблице с одной строкой заголовков браузеры обычно сами определяют заголовки без scope, но написать его ничего не стоит, а догадки это убирает.
Подпись это еще и то, что программа чтения с экрана объявляет, дойдя до таблицы. Предпочитайте ее заголовку над таблицей, который с ней никак не связан.
thead, tbody и tfoot
Три группы делят строки на шапку, тело и подвал. Подвал это место для итогов:
Две детали делают числа читаемыми: text-align: end выравнивает десятичные точки (у каждой цены два знака после точки), а font-variant-numeric: tabular-nums дает всем цифрам одинаковую ширину.
Если написать <tr> прямо внутри <table>, как в первом примере, браузер все равно добавит вокруг строк <tbody>. Поэтому селектор CSS вроде table > tr ничего не находит: на странице строки находятся внутри tbody. Используйте table tr или напишите <tbody> сами.
Оформление таблицы: полосы, наведение и ширина
:nth-child раскрашивает строки через одну, :hover подсвечивает строку под указателем, а width: 100% растягивает таблицу на всю ширину контейнера:
text-align: start выравнивает текст заголовка с данными под ним; иначе th выровнен по центру. start вместо left сохраняет правильное выравнивание в языках с письмом справа налево.
Адаптивные таблицы с прокруткой
Таблица не может стать уже своего содержимого. На телефоне широкая таблица выталкивает всю страницу вбок. Оберните ее в контейнер с прокруткой:
Здесь ширина контейнера ограничена 300 пикселями, чтобы имитировать экран телефона; прокрутите его вбок. tabindex="0" позволяет пользователям клавиатуры сфокусироваться на контейнере и прокручивать его стрелками, а role="region" с aria-label дает этой остановке имя.
Таблицы нужны для данных
Используйте таблицу, когда у содержимого действительно есть строки и столбцы: цены, расписания, сравнения, результаты. Не используйте ее, чтобы расположить элементы страницы рядом. Таблицы для раскладки сбивают с толку программы чтения с экрана, которые объявляют бессмысленные строки и столбцы, и не подстраиваются под маленькие экраны. Раскладку делают CSS flexbox и grid.
Частые ошибки
- Строки с разным количеством ячеек. Короткие строки заканчиваются раньше, и столбцы перестают совпадать.
<td>с жирным текстом вместо заголовков. Используйте<th>, чтобы заголовки были настоящими подписями.- Устаревшие атрибуты
border,cellpadding,cellspacing,bgcolorиalign. Используйте CSS. - Содержимое прямо в
<tr>или<table>, вне ячеек. Браузеры выносят его из таблицы, обычно над ней. - Заголовок над таблицей вместо
<caption>. table > trв CSS. Браузер вставил<tbody>; пишитеtable trилиtbody tr.
Часто задаваемые вопросы
Как сделать таблицу в HTML?
Оберните ее в <table>, напишите по одному <tr> на строку и поместите внутрь ячейки: <th> для ячеек заголовков и <td> для ячеек с данными. В каждой строке должно быть одинаковое количество ячеек, если только какие-то ячейки не занимают несколько столбцов.
Чем th отличается от td?
<th> это ячейка заголовка, которая подписывает столбец или строку, а <td> это ячейка с данными. Браузеры показывают <th> жирным и по центру, а программы чтения с экрана зачитывают соответствующий заголовок перед каждой ячейкой данных, чтобы числа имели смысл.
Для чего нужны thead, tbody и tfoot?
Они группируют строки в шапку, тело и подвал (итоги) таблицы. Они делают структуру понятной для вспомогательных технологий, дают CSS за что зацепиться, а при печати длинной таблицы браузеры могут повторять <thead> на каждой странице.
Почему у таблицы HTML нет рамок?
По умолчанию у таблиц нет рамок. Добавьте их через CSS: table { border-collapse: collapse; } th, td { border: 1px solid #ccc; }. Старый атрибут border="1" устарел.
Как сделать таблицу HTML адаптивной?
Поместите таблицу в контейнер с overflow-x: auto. На узком экране таблица будет прокручиваться вбок внутри контейнера, а не расширять всю страницу.