Тег col в HTML: ширина, фон и span для колонки таблицы

Тег col (от английского column, «колонка») описывает одну колонку таблицы или несколько колонок подряд. На экране он ничего не рисует, а нужен для другого: задать колонке ширину или фон одной записью, не правя каждую её ячейку. В таблице из пятидесяти строк это одна строка кода вместо пятидесяти.

Колонки записывают внутри группы, о которой подробно рассказано в статье про тег colgroup. Здесь разберём саму колонку: как её записать, какие единицы ширины она принимает, что с фоном, как управлять ею из скрипта и как браузер исправляет ошибки в записи.

HTML
<table>
  <colgroup>
    <col style="width:120px">
    <col>
    <col style="background:#ffd9a8">
  </colgroup>
  <tr><th>Чай</th><th>Вкус</th><th>Цена</th></tr>
  <tr><td>Улун</td><td>Мягкий</td><td>120</td></tr>
</table>

Тег col в HTML: что это и чем он отличается от colgroup

Тег col — void-элемент: у него нет содержимого и закрывающего тега. Запись </col> браузер просто пропускает: в таблице остаётся одна колонка, а не две. Можно писать и <col />, это то же самое.

Записывать col можно только внутри colgroup, у которого нет атрибута span. Группа собирает колонки вместе, а сам col описывает каждую отдельно.

ТегЧто описываетГде записываетсяПример записи
colgroupГруппу колонокВнутри table, до строк<colgroup>...</colgroup>
colОдну колонку или несколько подрядВнутри colgroup<col span="2">

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

Атрибут span у тега col: одна запись на несколько колонок

Атрибут span говорит, сколько колонок подряд описывает один col. По умолчанию значение равно 1. Допустимы целые числа от 1 до 1000, а неверные значения браузер исправляет так же, как у группы: таблица исправленных значений есть в статье про colgroup.

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

HTML
<colgroup>
  <col>
  <col span="5" style="background:#dfe8ff">
  <col span="2" style="background:#ffe8d4">
</colgroup>

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

ЗаписьЧто получаетсяПример записи
span без стиляНичего не меняется: колонки описаны, но правил у них нет<col span="2">
span со стилемПравило действует на все колонки диапазона<col span="2" style="width:100px">
span больше числа колонокЭто ошибка по стандарту: Chrome прибавляет таблице ширину лишних колонок, но не закрашивает их<col span="5" style="width:50px">

Ширина колонки через col: единицы, min-width и приоритет над ячейками

Ширину колонке задают свойством width. Принимаются любые единицы длины: пиксели, em, проценты, выражение calc(). Заданная ширина работает как желаемая: браузер даст колонке эту ширину, если содержимое помещается, и расширит колонку, если нет. Как на колонку действуют min-width и max-width, стандарт CSS 2.1 не определяет, поэтому всё про них ниже описывает то, что получается в Chrome.

Пример: единицы и ограничения ширины

Результат

Выберите правило для первого col: внизу показана получившаяся ширина. В Chrome правило max-width не срабатывает: это видно по статусу.

ЗаписьРезультатПример записи
ПикселиКолонка получает эту ширину, если помещается содержимоеcol { width: 100px; }
emШирина считается от размера шрифта самой колонки, а он наследуется от таблицыcol { width: 10em; }
calc()Выражение вычисляется как обычноcol { width: calc(50px + 1em); }
ПроцентыДоля от ширины таблицыcol { width: 30%; }
1% или 0Колонка сжимается до самого длинного слова, остальное место получают соседиcol { width: 1%; }
min-widthВ Chrome работает как нижняя граница шириныcol { min-width: 200px; }
max-widthChrome игнорирует: верхней границы у колонки нетcol { max-width: 30px; }

Приём с 1% удобен для колонок с номерами и ценами: колонка занимает ровно столько места, сколько нужно числам, а всё лишнее достаётся колонке с текстом.

Пример: колонка против ячейки

Ширину можно задать и самой ячейке. Если колонка и ячейка не согласны, побеждает не всегда колонка. В обычной раскладке колонка выигрывает, когда она шире: ячейка её не сужает. В раскладке table-layout: fixed ширина, заданная у колонки, сильнее ширины ячейки первой строки. Если у колонки ширины нет, колонку определяет первая строка. Ячейка с colspan на ширину колонок не влияет.

Результат

Переключите раскладку: внизу видно, чья ширина применилась.

Фон колонки через col: что закрашивается и что находится сверху

Свойство background у col закрашивает всю колонку: и заголовок, и ячейки всех секций. Подходит любое значение фона, в том числе градиент. Градиент растягивается на всю высоту колонки, а не повторяется в каждой ячейке.

Но у фона колонки самый нижний слой. Выше находятся фон строки tr и фон самой ячейки, они перекрывают цвет колонки. Есть и неочевидная деталь: ячейка, объединившая несколько колонок через colspan, закрашивается цветом первой из них на всю свою ширину.

Пример: фон колонки и что находится поверх

Результат

Выберите вариант. В последнем колонки закрашены разным цветом, а ячейка с colspan берёт цвет только первой.

Граница у колонки рисуется только при border-collapse: collapse, как и у группы: подробности в статье про colgroup. Свойства оформления текста до ячеек не доходят.

Тег col и JavaScript: span, width и подсветка колонки по клику

Элемент col в скрипте представлен интерфейсом HTMLTableColElement. Его свойство span связано с атрибутом: запись col.span = 3 меняет атрибут на span="3". Колонкой удобно управлять целиком: скрипт меняет один col, а браузер применяет правило ко всем ячейкам колонки.

СвойствоЧто делаетПример записи
spanЧитает и меняет число колонокcol.span = 3;
style.widthЗадаёт ширину колонкиcol.style.width = '120px';
classListВключает и выключает класс колонкиcol.classList.toggle('on');
widthУстаревшее свойство: работает, но лучше писать CSScol.width = '100';

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

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

JavaScript
const cols = table.querySelectorAll('col');
cols[1].classList.toggle('on');
CSS
col.on {
  background: #fff2c9;
}
Результат

Нажимайте на названия колонок: в подсказке видно, сколько тегов col изменил скрипт и сколько ячеек при этом закрасилось.

Где нельзя записывать col: что делает браузер с неверной записью

Правильное место для col только одно: внутри colgroup. Всё остальное браузер исправляет по своим правилам, и результат не всегда очевиден.

ЗаписьЧто делает браузерПример записи
col сразу в tableСоздаёт группу сам, колонки работают<table><col><col>...
col внутри секцииВыносит колонку из секции в отдельную группу, в таблице остаётся пустая секция<tbody><col><tr>...
col внутри строкиВыносит колонку в группу, строка остаётся пустой<tr><col><td>...
col после строкПомещает колонку в группу после секций<tr>...</tr><col>
col вне таблицыУдаляет тег<p><col></p>
</col>Пропускает закрывающий тег<col></col>

Из первой строки видно, что группа не обязательна: голые col работают и так. Но явная запись colgroup понятнее читателю кода. Подробности о допустимых местах записи — в описании элемента в стандарте HTML.

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

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

ОшибкаЧто происходитКак исправить
<col></col>Закрывающий тег пропускается: запись лишняя, но ничего не ломаетПисать <col> или <col />
col { max-width: 30px; }Chrome правило игнорируетИспользовать width или min-width
col { text-align: right; }Выравнивание до ячеек не доходитtd:nth-child(2) { text-align: right; }
col { border: 1px solid; } в обычной таблицеРамка не рисуетсяДобавить таблице border-collapse: collapse
col { display: none; }Колонка остаётся на местеcol { visibility: collapse; }
col внутри tbody или trБраузер выносит тег в отдельную группуЗаписывать col внутри colgroup
Фон у ячеек и фон у col вместеФон ячейки перекрывает фон колонкиУбрать фон у ячеек или у колонки
Ждёшь цвет второй колонки в ячейке с colspanЯчейка берёт цвет первой колонкиЗадать фон самой ячейке
<col span="5"> при трёх колонкахОшибка по стандарту: Chrome прибавляет таблице ширину двух лишних колонокУказывать span по числу колонок
<col width="100"> как атрибутРаботает, но атрибут устарел<col style="width:100px">
Ширина в ячейке при table-layout: fixedЕсли у колонки задана ширина, ширина ячейки первой строки игнорируетсяЗадавать ширину в col
Категория
Поделиться в социальных сетях

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

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

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

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

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