Тег colgroup в HTML: группы колонок, span и стили

Тег colgroup (от английского column group, «группа колонок») описывает колонки таблицы. Сам он на экране ничего не рисует: его задача - дать одно правило сразу нескольким колонкам, например общую ширину, фон или скрытие. Без него пришлось бы повторять то же правило в каждой ячейке колонки.

Тег парный и записывается внутри table, до строк. Внутри него записывают теги col или не записывают ничего, если колонки задаёт атрибут span. Отдельная колонка col разобрана на своей странице, а здесь - сама группа: куда её записать, как работает span и какие стили доходят до колонок.

HTML
<table>
  <colgroup span="2" style="width:100px"></colgroup>
  <tr><th>Чай</th><th>Цена</th><th>Вес</th></tr>
  <tr><td>Улун</td><td>120</td><td>50</td></tr>
</table>

Тег colgroup в HTML: что это и где он стоит в таблице

Таблица в HTML записывается строками. Колонок как отдельных элементов в ней нет: колонка - это ячейки, которые стоят друг под другом. Тег colgroup добавляет в таблицу описание колонок. К этому описанию применяются стили, и браузер применяет их к нужным колонкам.

У тега строгое место: он дочерний элемент table, стоит после тега caption и до любой секции или строки. Групп в таблице может быть несколько, и идут они подряд.

Порядок в tableЧто записываетсяПример записи
1caption, если он нужен<caption>Цены на чай</caption>
2Одна или несколько групп colgroup<colgroup span="2"></colgroup>
3thead, затем tbody и tfoot<thead>...</thead>
3 (вместо секций)Просто строки tr<tr><td>Улун</td></tr>

Важно понимать, чего тег не делает. Он не объединяет ячейки, не задаёт заголовки колонок и для скринридера ничего не сообщает. Заголовками колонок остаются ячейки th, а объединением занимаются атрибуты colspan и rowspan.

Как записать colgroup: span или вложенные col

Колонки в группе описываются одним из двух способов, и смешивать их нельзя. Первый способ: атрибут span с числом колонок, а внутри группы пусто. Второй: внутри группы записаны теги col, по одному на колонку. Если в группе есть вложенные col, значение span у группы игнорируется.

Значение span браузер приводит к целому числу от 1 до 1000. Всё остальное он исправляет сам, без ошибок в консоли.

Значение spanЧто получитсяПример записи
Не заданОдна колонка<colgroup></colgroup>
Целое от 1 до 1000Столько колонок, сколько указано<colgroup span="3">
0 или отрицательноеБраузер считает, что колонка одна<colgroup span="0">
Больше 1000Браузер обрезает значение до 1000<colgroup span="1001">
Дробное, например 2.7Дробная часть отбрасывается, колонок две<colgroup span="2.7">
Не числоБраузер считает, что колонка одна<colgroup span="abc">

Пример: span у группы или вложенные col

Результат

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

В четвёртом варианте видно ещё одно правило: ширина, заданная группе, достаётся вложенным колонкам, у которых своей ширины нет. Колонка со своей шириной берёт её, а остальные получают ширину группы.

Групп может быть несколько. Например, первая группа из двух колонок получает одну ширину, а вторая, из одной колонки, другую.

HTML
<colgroup span="2" style="width:100px"></colgroup>
<colgroup style="width:150px"></colgroup>

Закрывающий тег стандарт разрешает опустить, если после него нет пробела или комментария, а начальный тег можно не писать, если группа начинается с col: браузер создаст группу сам. Так и происходит: таблица с голыми col сразу после table получает группу без вашего участия. Но явная запись понятнее читателю кода и не зависит от пробелов и комментариев. Подробности о порядке записи - в описании элемента в стандарте HTML.

Ширина колонок через colgroup

Ширину колонкам задают свойством width у colgroup или col. У тега col есть и устаревший атрибут width, но в новом коде пишут CSS. Главное, что нужно знать: заданная ширина работает как желаемая, а не как жёсткая. Браузер выполнит её, если содержимое помещается, и растянет колонку, если нет.

СитуацияЧто получаетсяПример записи
Ширина в пикселяхКолонка получает эту ширину, если в неё помещается содержимое<col style="width:100px">
В ячейке слово длиннее заданной шириныКолонка шире заданной: слово не режется<col style="width:20px">
Ширина колонки больше, чем width у ячейкиПобеждает колонка: ячейка её не сужает<col style="width:300px">
ПроцентыДоли от ширины таблицы<col style="width:50%">
Таблица с table-layout: fixedШирины берутся из колонок, а остаток достаётся колонке без шириныtable { table-layout: fixed; }
span больше числа колонокЛишние колонки тоже занимают место, и таблица становится шире. Стандарт считает это ошибкой: колонки без ячеек<col span="5" style="width:50px">

О том, как ведёт себя ширина всей таблицы и как работает table-layout, рассказано в разделе о ширине тега table. Тег colgroup полезен тем, что ширину колонок можно записать один раз в начале таблицы, а не искать по ячейкам.

CSS
table {
  table-layout: fixed;
  width: 600px;
}
colgroup:first-of-type { width: 100px; }

Фон и граница колонки через colgroup: что закрашивается, а что нет

Свойство background у colgroup закрашивает все колонки группы. Этот приём удобен, чтобы выделить колонку цветом, не трогая ячейки. Но у фона есть правила, о которых часто не знают.

Во-первых, слои. Колонки находятся под ячейками: порядок от нижнего к верхнему такой: таблица, группа колонок, колонка, секция, строка, ячейка. Поэтому своё оформление ячейки перекрывает фон колонки. Во-вторых, фон колонки не закрашивает промежутки между ячейками, если они есть (по умолчанию у таблицы они есть). В-третьих, граница у колонки работает только в режиме border-collapse: collapse.

СвойствоРаботает у колонкиПример записи
backgroundДа, но не в промежутках между ячейкамиcolgroup { background: #ffd9a8; }
borderТолько при border-collapse: collapsecol { border: 3px solid red; }
widthДа, как желаемая ширинаcol { width: 100px; }
visibilityТолько значение collapsecol { visibility: collapse; }

Пример: фон и граница колонки

Результат

Выберите, где задан стиль, и включите border-collapse: collapse. Так видно, что фон не заходит в промежутки, а граница появляется только после включения режима.

Устаревший атрибут bgcolor стандарт для colgroup не описывает. В некоторых браузерах он работает по старой привычке, но полагаться на него не стоит. Цвет задают через CSS.

Скрытие колонки через colgroup: visibility collapse

Колонку или всю группу можно убрать из таблицы без правки ячеек: значение visibility: collapse схлопывает колонки. Ячейки скрываются, а место, которое они занимали, освобождается и таблица становится уже. Правило у colgroup убирает сразу все колонки группы, а у col - одну.

Обычные способы скрыть элемент тут не работают: visibility: hidden и display: none у col колонку не убирают. Она остаётся на месте, ширина таблицы не меняется. Это видно в примере ниже.

Пример: схлопнуть колонку, спрятать, убрать через display

Результат

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

ПравилоРезультатПример записи
visibility: collapse у colОдна колонка убрана, место освобожденоcol { visibility: collapse; }
visibility: collapse у colgroupУбраны все колонки группыcolgroup { visibility: collapse; }
visibility: hidden у colКолонка на месте, ничего не изменилосьcol { visibility: hidden; }
display: none у colКолонка на месте, ничего не изменилосьcol { display: none; }

Чтобы переключать колонку кнопкой, добавьте группе класс, а в CSS запишите для него правило visibility: collapse. Скрипту остаётся только включать и выключать класс.

JavaScript
const group = document.querySelector('colgroup');
group.classList.toggle('is-hidden');
CSS
colgroup.is-hidden {
  visibility: collapse;
}

Какие стили colgroup не доходят до ячеек и чем их заменить

Главная ловушка тега: колонка не является родителем ячеек в дереве элементов. Поэтому обычные свойства, которые наследуются вниз, до ячеек не доходят. Правило text-align: right у colgroup числа не выровняет, цвет текста и жирность тоже не изменятся, а отступы не добавятся.

СвойствоДоходит до ячеек колонкиЧем заменить
colorНетtd:nth-child(2) { color: #0f7a70; }
font-weightНетtd:nth-child(2) { font-weight: 700; }
text-alignНетtd:nth-child(2) { text-align: right; }
paddingНетtd:nth-child(2) { padding: 6px 12px; }
align как атрибутНет, атрибут устарелСвойство text-align у ячеек

Обход простой: выбрать ячейки нужной колонки по номеру. Селектор td:nth-child(2) берёт вторую ячейку каждой строки, то есть вторую колонку. Чтобы правило действовало только в таблицах, где есть группа колонок, добавьте условие с :has().

Пример: какое правило дошло до ячеек

Результат

Выберите правило: страница читает итоговое выравнивание ячейки и показывает, дошло ли правило. Первые два варианта до ячеек не доходят.

CSS
table:has(colgroup) td:nth-child(2) {
  text-align: right;
}

Запомнить это проще так: группа и колонка отвечают только за ширину, фон, рамку и скрытие, а всё, что связано с текстом, оформляйте в ячейках.

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

Вот ошибки, которые встречаются чаще всего.

ОшибкаЧто происходитКак исправить
<colgroup span="2"><col></colgroup>Значение span игнорируется: колонка однаОставить один способ: либо span, либо вложенные col
colgroup { text-align: right; }Выравнивание до ячеек не доходитtd:nth-child(2) { text-align: right; }
col { border: 2px solid; } в обычной таблицеРамка не рисуетсяДобавить border-collapse: collapse таблице
col { display: none; } или visibility: hiddenКолонка остаётся на местеcol { visibility: collapse; }
Текст внутри colgroupБраузер выносит текст из таблицы, он оказывается перед нейЗаписать текст в абзац вне таблицы
colgroup после строк таблицыБраузер может применить ширину и так, но стандарт требует место до строкЗаписывать группу сразу после caption
<col span="5"> при трёх колонкахДве лишние колонки прибавляют ширину таблице, а стандарт считает такую таблицу ошибочнойУказывать span по числу колонок
Устаревшие align, valign, char, charoffВыравнивание не меняетсяСвойства text-align и vertical-align у ячеек
bgcolor="#ffd9a8" и width как атрибуты у colgroupСтандарт их для colgroup не описывает, в некоторых браузерах они работают по старой привычкеПисать background и width в CSS
Группа вместо заголовков колонок для скринридераГруппа ничего не сообщает: заголовки задаются только ячейками<th scope="col">Цена</th>
Категория
Поделиться в социальных сетях

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

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

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

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

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