Тег thead в HTML: шапка таблицы, закрепление и печать

Тег thead (от английского table head, «голова таблицы») собирает строки шапки: те, где записаны названия колонок. Браузер выводит шапку над телом таблицы, повторяет её на каждой странице при печати, и её можно закрепить при прокрутке. Без thead строка с заголовками тоже видна, но при печати на следующих страницах она не повторяется.

Что такое шапка и в каком порядке выводятся секции таблицы, объясняет урок «Как разделить таблицу: thead, tbody и tfoot». Здесь разберём остальное: какие стили доходят до ячеек шапки, как её закрепить, что получится при печати, как управлять ею из скрипта и что делает браузер с неверной записью.

HTML
<table>
  <thead>
    <tr><th scope="col">Чай</th><th scope="col">Цена</th></tr>
  </thead>
  <tbody>
    <tr><td>Улун</td><td>120</td></tr>
  </tbody>
</table>

Тег thead в HTML: что это и что записывать внутри

Внутри thead записывают только строки tr. Строк может быть несколько: так делают шапку с группами колонок. Тег парный, закрывающий можно опустить, если сразу за ним идёт tbody или tfoot. По умолчанию браузер выводит его как отдельную секцию, которая всегда стоит над телом.

Важнее всего, что именно записано в строках шапки. По стандарту заголовочные ячейки — это th, а td остаются обычными ячейками данных, даже если стоят в шапке.

Что записано в шапкеЧем это считаетсяПример записи
th в theadЗаголовок колонки<th scope="col">Цена</th>
td в theadЯчейка данных: заголовком колонки не считается<td>Цена</td>
th в начале строки tbodyЗаголовок строки<th scope="row">Улун</th>

Ячейки шапки можно объединять, как и в любой таблице. Но объединение не выходит за пределы секции: если задать ячейке в шапке из двух строк rowspan="3", Chrome растянет её только на две строки, строки tbody она не захватит.

HTML
<thead>
  <tr><th rowspan="2">Чай</th><th colspan="2">Цена</th></tr>
  <tr><th>Опт</th><th>Розница</th></tr>
</thead>

Где записывать thead: порядок, пропуск закрывающего тега и парсер

По стандарту thead стоит внутри table после caption и colgroup и перед tbody, tfoot и строками, причём только один. Браузер принимает и другие записи, но результат не всегда такой, как ждёт автор.

Как записаноЧто делает браузерПример записи
thead после tbodyВыводит шапку сверху, а в коде она остаётся на месте<tbody>...</tbody><thead>...</thead>
Два theadШапкой считает первый, второй остаётся обычной секцией на своём месте<thead>...</thead><tbody>...</tbody><thead>...</thead>
Текст или div внутри theadВыносит их из таблицы, они оказываются перед ней<thead>Шапка<tr>...</tr></thead>
Пустой theadВыводит секцию высотой 0, строк в шапке нет<thead></thead>
Нет закрывающего </thead>Закрывает шапку сам, когда встречает tbody<thead><tr><th>Чай<tbody>...

Пример: где записан thead и что получилось

Результат

Выберите запись: вверху виден код, внизу — что получилось на экране.

Порядок секций в таблице, в том числе то, почему подвал tfoot выводится внизу, разобран в уроке «Как разделить таблицу: thead, tbody и tfoot». Подробности о допустимых местах записи — в описании элемента в стандарте HTML.

Стили thead: что доходит до ячеек шапки

В отличие от группы колонок на странице colgroup, секция thead содержит ячейки, поэтому наследуемые свойства доходят до них. Если задать thead свойство color, font-size или text-align, его получат все ячейки шапки сразу, повторять на каждой ячейке не нужно. Фон и граница не наследуются: их рисует сама секция.

Свойство у theadЧто получаетсяПример записи
colorЦвет текста получают все ячейки шапкиthead { color: #fff; }
font-sizeРазмер шрифта получают все ячейки шапкиthead { font-size: 20px; }
text-alignВыравнивание получают и td, и th: правило браузера «по центру» для th уступаетthead { text-align: left; }
font-weightМеняет td, а заголовочные th остаются жирнымиthead th { font-weight: 400; }
backgroundЗакрашивает ячейки, но не промежутки между нимиthead { background: #2c5e77; }
borderРисуется только при border-collapse: collapsethead { border-bottom: 2px solid; }
box-shadowРаботает при любом режиме границthead { box-shadow: 0 2px 0 #000; }

Пример: что доходит до ячеек шапки

Результат

Выберите правило и при желании включите border-collapse: collapse. В шапке есть и th, и td, поэтому видно, кто получил правило.

Чтобы изменить жирность заголовочных ячеек, правило записывают для thead th, а не для thead. Размеры и отступы ячеек тоже задают на th.

CSS
thead {
  background: #2c5e77;
  color: #fff;
  text-align: left;
}
thead th {
  font-weight: 400;
}

Закрепление thead при прокрутке: sticky, обёртка и границы

Шапку закрепляют значением position: sticky со свойством top: пока таблица на экране, шапка остаётся у верхнего края блока, а когда таблица кончается, уходит вместе с ней. Записать правило можно на thead или на th, и результат разный. Ниже описано поведение Chrome.

ЗаписьРезультатПример записи
thead с position: stickyВсе строки шапки закреплены как одна группа и не наезжают друг на другаthead { position: sticky; top: 0; }
th с position: sticky, одна строкаРаботает так жеth { position: sticky; top: 0; }
th с position: sticky, две строкиСтроки наезжают друг на друга: у каждой top: 0th { position: sticky; top: 0; }
th второй строки со своим topВторая строка закреплена под первой, если top равен высоте первой строкиthead tr:nth-child(2) th { top: 28px; }
Закреплённая шапка в блоке с overflow-x: autoЗакрепление не работает при прокрутке страницы: шапка привязывается к обёртке.wrap { overflow-x: auto; }
Тот же блок с overflow-x: clipЗакрепление работает, но горизонтальной прокрутки нет: широкая таблица обрезается.wrap { overflow-x: clip; }
Блок с max-height и overflow: autoПрокручивается в обе стороны, шапка закрепляется внутри него.wrap { max-height: 70vh; overflow: auto; }
Закрепление при border-collapse: collapseНижняя граница ячеек шапки пропадает при прокруткеth { box-shadow: inset 0 -2px 0 #000; }

Пример: закрепление в блоке с прокруткой

Результат

Выберите запись, нажмите «Прокрутить вниз» и посмотрите на отметку шапки. В вариантах с обёрткой таблица лежит в блоке с overflow, как на странице с широкой таблицей.

У ячеек шапки должен быть свой фон: иначе строки тела видны сквозь закреплённую шапку. Если над таблицей на странице закреплена шапка сайта, значение top равно её высоте. Если таблица шире экрана, обёртке задают max-height и overflow: auto: она прокручивается в обе стороны, а шапка закрепляется внутри неё. Значение overflow-x: clip закрепление сохраняет, но горизонтальную прокрутку убирает, и широкая таблица обрезается.

CSS
.wrap {
  max-height: 70vh;
  overflow: auto;
}
thead {
  position: sticky;
  top: 0;
}
thead th {
  background: #fff;
  box-shadow: inset 0 -2px 0 #000;
}

Шапка thead при печати: как она повторяется на страницах

При печати длинной таблицы на нескольких страницах браузер повторяет шапку в начале каждой страницы. Для этого ничего записывать не нужно: так ведёт себя любая секция thead. В пробной таблице из 120 строк при печати на листах формата A4 шапка вышла на каждой странице. Посмотреть результат можно в предпросмотре печати: Ctrl + P.

Повтор бывает лишним, например когда шапка высокая. Тогда секции возвращают обычный режим вывода, и шапка остаётся только на первой странице.

CSS
@media print {
  thead {
    display: table-row-group;
  }
}
ЗаписьРезультат при печатиПример записи
Обычный theadШапка повторяется на каждой странице<thead>...</thead>
thead с display: table-row-groupШапка стоит только на первой страницеthead { display: table-row-group; }
Строка заголовков в tbodyВыводится один раз и не повторяется<tbody><tr><th>Чай</th></tr>...

Тег thead и JavaScript: createTHead, tHead и rows

Секция thead в скрипте представлена интерфейсом HTMLTableSectionElement. У таблицы есть свойство tHead, которое возвращает шапку или null, и два метода для работы с ней. Метод createTHead() создаёт шапку, а если она уже есть, возвращает её же, поэтому два вызова подряд не дадут две шапки. Метод deleteTHead() шапку удаляет.

ЗаписьЧто делаетПример записи
table.tHeadВозвращает шапку таблицы или nullconst head = table.tHead;
table.createTHead()Создаёт шапку перед tbody, после caption и colgrouptable.createTHead();
table.deleteTHead()Удаляет шапкуtable.deleteTHead();
thead.insertRow()Добавляет строку в шапкуhead.insertRow();
thead.rowsСписок строк шапкиhead.rows.length
table.rowsВсе строки: сначала шапка, потом тело, потом подвалtable.rows[0]

Пример: методы таблицы для шапки

Результат

Выберите действие: вверху виден код, ниже таблица и результат, который считает сама страница.

JavaScript
const table = document.querySelector('table');
const head = table.createTHead();
const row = head.insertRow();
row.insertCell().textContent = 'Чай';
row.insertCell().textContent = 'Цена';

Учтите: ячейки, созданные методом insertCell(), получаются тегами td, а не th. Для заголовочных ячеек их создают отдельно через document.createElement('th').

Частые ошибки с тегом thead

Типичные ошибки с тегом thead и как их исправить.

ОшибкаЧто происходитКак исправить
thead записан после tbodyШапка выводится сверху, но код читать труднееЗаписывать thead до tbody
Два thead в одной таблицеШапкой считается только первый, второй остаётся обычной секциейОбъединить строки в один thead
Текст внутри theadБраузер выносит его перед таблицейЗаписывать текст в ячейки th
td вместо th в шапкеЯчейки остаются ячейками данных и заголовками колонок не считаются<th scope="col">Цена</th>
thead { font-weight: 400; }th остаются жирнымиthead th { font-weight: 400; }
thead { border: 1px solid; } без collapseРамка не рисуетсяДобавить border-collapse: collapse или использовать box-shadow
th { position: sticky; top: 0; } при двух строках шапкиСтроки наезжают друг на другаthead { position: sticky; top: 0; }
Закрепление в обёртке с overflow-x: autoШапка не закрепляется при прокрутке страницы.wrap { max-height: 70vh; overflow: auto; }
Закреплённая шапка без фонаСтроки тела видны сквозь шапкуthead th { background: #fff; }
Закрепление при border-collapse: collapseНижняя граница шапки пропадает при прокруткеth { box-shadow: inset 0 -2px 0 #000; }
rowspan длиннее шапкиChrome обрезает ячейку по границе секцииСчитать строки шапки и не выходить за них
Устаревшие align, valign, bgcolor у theadАтрибуты устарелиСвойства text-align, vertical-align и background
Категория
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×