Оформляем таблицы с помощью CSS: как работать с полями, границами и свойством z-index

Ещё несколько лет назад фронтенд-разработчики активно использовали табличную вёрстку для создания веб-страниц. Сегодня появились более удобные инструменты, а тег <table>
теперь применяется по прямому назначению: для создания таблиц с данными. Однако оформлять таблицы по-прежнему не так просто. Некоторые CSS-свойства, например, margin
, border-radius
, z-index
, не работают с элементами таблиц <tbody>
, <thead>
, <tr>
. Статья поможет обойти эти ограничения.
Содержание
- Структура таблицы
- Что не так с
margin
и как оформить отступы для элементов таблицы - Как применить к элементам таблицы
border-radius
- Как оформлять ячейки таблицы
- Как применять
z-index
к элементам таблицы - Заключение
Структура таблицы
Эталонный вариант таблицы
Иллюстрация выше показывает, как можно оформить таблицу с помощью CSS. Первый ряд выступает в качестве заголовка, а разделы таблицы обозначены подзаголовками.
Выше представлена структура таблицы в HTML. В <thead>
содержится главное название. В таблице есть несколько секций <tbody>
, каждая из которых имеет собственный подзаголовок.
Что не так с margin
и как оформить отступы для элементов таблицы
Как видно на иллюстрации в начале статьи, между главным заголовком и секцией <tbody>
, а также между остальными секциями <tbody>
, есть отступы. Можно подумать, что они определяются свойствами margin-top
для <tbody>
, но это не так.
Если попытаться использовать margin-top
для оформления <tbody>
, <thead>
или <tr>
, добиться отступов не удастся. Чтобы margin
заработали, можно изменить свойство display
, которое менять опасно, так как изменения могут нарушить форматирование таблицы. Поэтому лучше воспользоваться альтернативными решениями, которые описаны ниже.
Свойство border
Самый простой способ получить отступы без использования margin
— применить к <tbody>
border-top: 1 em
.
Все секции <tbody>
, у которых должны быть отступы, имеют класс .section
. Чтобы свойство border-top
сработало, необходимо применить к таблице border-collapse: collapse
.
Псевдоэлементы ::before
и ::after
Псевдоэлементы ::before
и ::after
— ещё один способ добавить отступы для элементов таблицы.
В данном случае создаётся пустой ряд, который обеспечивает визуальный отступ между секциями <tbody>
.
Вы можете использовать для оформления отступов как псевдоэлементы, так и свойство border
.
Как применить к элементам таблицы border-radius
Задача: добавить к секциям <tbody>
границы и применить к ним border-radius
. Напрямую это сделать невозможно — border
и border-radius
не работают с <tbody>
.
Пример выше показывает, как с помощью box-shadow
добиться практически такого же результата, как с помощью border
при работе с нетабличными элементами.
Как оформлять ячейки таблицы
Внешний вид текущей таблицы (см. иллюстрацию ниже) отличается от эталонного варианта, который представлен в начале статьи.
Нужны марджины, а не паддинги
После добавления границ можно заметить, что полученные отступы работают не как «марджины», а как «паддинги». Это можно изменить, если работать с границами ячеек и использовать селекторы :first-child
и :last-child
.
В примере выше стили применяются к соответствующим элементам th
и td
ячеек таблицы. К ячейкам, которые находятся в углах таблицы, применяется border-radius
. Все ячейки, которые находятся по краям таблицы, имеют границы. Селекторы :first-child
и :last-child
позволяют обращаться к нужным ячейкам.
Как применять z-index
к элементам таблицы
Проблемы с box-shadow
На первой иллюстрации в статье видно, что свойство box-shadow
применяется к подзаголовкам, поэтому тени попадают на следующие ниже ряды таблицы. Если попробовать прямо применить box-shadow
к соответствующему элементу, тень в рядах не появится.
В обычной ситуации можно использовать для решения таких проблем z-index
. Но с таблицами всё сложнее: z-index
не работает с <tbody>
. Проблема решается, если вы знаете, как работать с контекстом наложения. Если применить к элементу position: relative
и z-index
, появляется новый контекст наложения. Также эту задачу можно решить с помощью transform: translate (0, 0)
.
Заключение
Чтобы сделать таблицы визуально привлекательными, приходится использовать неочевидные трюки CSS. Но этим и хороши CSS — с их помощью можно решить практически любую задачу по оформлению веб-элементов.
При работе с таблицами возникает соблазн переопределить свойство display
. Но это приведёт к дополнительным сложностям: придётся вручную определять ширину ячеек, чтобы таблица нормально отображалась. Поэтому удобнее пользоваться предложенными выше трюками, которые позволяют оформлять таблицы элегантно и без лишнего кода.
Адаптированный перевод статьи Styling HTML Tables: How to Apply Margins, Borders and z-index on Table Elements by Markus Oberlehner. Мнение автора оригинальной публикации может не совпадать с мнением администрации «Хекслета».
Дмитрий Дементий
6 лет назад