У таблиц в истории развития HTML непростая судьба. Они, можно сказать, оказались не в то время, не в том месте: таблицы долгое время использовали не по назначению для разметки каркаса страниц. Но так как таблица — это довольно «тяжёлый» инструмент и предназначена для других целей, табличной разметкой страниц было сложно управлять. Ситуация осложнялась тем, что на заре эпохи интернета, браузеры могли отображать таблицы совсем по-разному, что также усложняло контроль разметки.
С тех пор за таблицами закрепилась нехорошая репутация. Некоторые разработчики до сих пор боятся использовать таблицы в разметке, даже там, где они вполне уместны. Тем более, что сейчас таблицы можно использовать не только в HTML, но и в CSS. Чтобы из любого элемента сделать таблицу в CSS, нужно его свойству display присвоить значение table. В этом случае блок станет отображаться равнозначно тегу table.
Мы можем одновременно и иметь семантическую разметку, и отображать её таблицей, если захотим. А в случае необходимости, можно просто отменить display: table, назначив другое подходящее значение display: например, block. Это ключевое преимущество перед HTML-таблицами, у которых изменить отображение на «нетабличное» нельзя.
Давайте продолжим разбираться с таблицей и полками. У HTML-таблиц есть ряды tr и ячейки td. Их аналоги в мире CSS-таблиц — значения свойства display: table-row и table-cell.
Следующий элемент мира HTML-таблиц — табличный заголовок caption, имеющие значение свойства display равное table-caption. В HTML-таблице тег заголовка располагается внутри неё, в CSS-таблице это так же. Также к заголовкам CSS-таблиц применимо свойство для вертикального позиционирования заголовка таблицы caption-side.
Для группировки верхних рядов используется тег thead. В него включаются один или несколько рядов. Можно использовать несколько элементов thead одновременно. Аналог группировки верхних рядов в CSS — свойство display: table-header-group. Отметим, что блок, которому задано это свойство, всегда отображается вверху CSS-таблицы, даже если в разметке он идёт не первым. Это поведение идентично тегу thead.
Аналогично «шапке» у таблицы можно сделать «подвал». В HTML-таблицах это тег tfoot, а в CSS — свойство display: table-footer-group. Как и в случае «шапки», в таблицу можно включать несколько «подвалов» одновременно. Аналогично «шапке», блок, которому задано свойство display: table-footer-group, всегда отображается снизу CSS-таблицы, даже если в разметке он идёт не последним. Это поведение идентично тегу tfoot.
Ряды содержания таблицы в HTML включаются в тег tbody. В CSS же эту задачу выполняет свойство display: table-row-group. Дополнительные обёртки очень удобны для стилизации элементов таблицы. Так же, как допускается несколько шапок и подвалов таблицы, может быть и несколько групп её содержимого. Это также удобно для стилизации отдельных групп.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
.checklist { display: table; } .checklist ul{ display: table-row; } .checklist ul li{ display: table-cell; } .checklist h1 { display: table-caption; caption-side: bottom; } .checklist header{ display: table-header-group; } .checklist footer { display: table-footer-group; } .checklist .content { display: table-row-group; } |
Аналог следующей разметки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<table> <caption>Вещи в дорогу</caption> <thead> <tr>…</tr> </thead> <tbody class="content"> <tr>…</tr> </tbody> <tbody class="content content-important"> <tr>…</tr> </tbody> <tfoot> <tr>…</tr> </tfoot> </table> |
В HTML-таблицах для стилизации столбцов используется тег col. Тег пишется в начале таблицы и не закрывается. Первый col в разметке влияет на каждую первую ячейку в рядах таблицы, то есть, на первый столбец. Следующий col будет стилизовать второй столбец и так далее. В CSS-таблицах всё так же: внутри таблицы нужно создать пустой тег и задать ему свойство display: table-column — это аналог тега col. Правила для него будут применяться к первому столбцу, следующий элемент с table-column стилизует второй столбец и так далее.
Столбцы тоже можно группировать. В HTML-таблицах для этой цели используется тег colgroup. Теги col просто включаются в colgroup и стилизуется уже группа целиком, а не отдельные столбцы. В CSS-таблицах столбцы группируются аналогично. Группа столбцов создаётся свойством display: table-column-group (аналог тега colgroup). Стилизуя группу, мы задаём правила для каждого дочернего столбца.
Таблицы при этом имеют свой собственный тип table, но ведут себя в потоке документа как блоки, то есть занимают отдельную строку. Существует ли возможность сделать таблицу «строчной», чтобы она располагалась в одной строке с другими строчными элементами? Да! И такое поведение таблицы задаётся свойством display: inline-table.
Лёгкий способ горизонтально отцентровать блок произвольной ширины на странице — присвоить ему отображение таблицей и задать margin: auto. В этом таблица схожа по поведению с обычным блочным элементом с фиксированной шириной, но при этом ширина таблицы может быть динамической. Что означает, что при изменении ширины блок все равно будет оставаться по центру.
Извечная проблема HTML-вёрстки — вертикальное выравнивание элементов. Пользуясь особенностями таблиц можно легко отцентровать по вертикали и горизонтали блок произвольной ширины и высоты. Трюк строится на той особенности, что ячейка растягивается на всю ширину таблицы, а содержимое ячейки просто центруется внутри неё с помощью свойств text-align иvertical-align. Для этого нужны: контейнер-таблица display: table; ячейка с содержимым display: table-cell; горизонтальное и вертикальное выравнивание ячейки внутри таблицы.
В CSS-таблицах можно управлять отступами и схлопыванием рамок между ячейками. Для этого, как и у HTML-таблиц, используются свойства border-collapse и border-spacing. Свойство border-collapse «схлопывает» границы ячеек, а border-spacing — определяет расстояние между ячейками внутри таблицы.
Однако, у свойства border-spacing есть одна тонкость. Если в нём задано одно значение, то расстояние между ячейками устанавливается одновременно по вертикали и горизонтали. Если значений два, то первое определяет горизонтальное расстояние, а второе — вертикальное.
Пример применения:
Так называемая разметка «Holy Grail» — это вариант разметки страницы с шапкой, тремя равными по высоте колонками (две фиксированные боковые колонки и тянущийся центр) и прилипающим подвалом. Центральная колонка должна тянуться, а боковые — иметь фиксированную ширину, любая колонка может быть больше остальных по высоте.
Начнём с «прилипающего» подвала. Он назван так, потому что:
- «прилипает» к самому низу страницы, когда основное содержимое страницы небольшое и не отталкивает подвал ниже экрана,
- «отлипает», когда высота содержимого становится достаточно большой и влияет на высоту страницы.
Для реализации «прилипающего» подвала воспользуемся CSS-таблицами. Для начала зададим главному контейнеру табличное отображение и 100% ширину и высоту.
Чтобы блок был 100% высоты области просмотра, всем его родительским элементам (в нашем случае html и body) тоже должна быть задана 100% высота.
Теперь давайте шапку и подвал сделаем рядами нашей табличной разметки. Это даст особый эффект: ряды растянутся и заполнят всю ширину и высоту таблицы, а последний ряд выровняется по нижней части таблицы — это то, что нам нужно.
Теперь остаётся только задать нужную высоту шапки и подвала. Её можно задать минимально необходимой, например, будет достаточно 1px
. В результате вычисленная высота ряда станет минимальной, но не будет меньше высоты его содержимого.
Теперь разберёмся со столбцами нашей разметки.
Блок main
также отобразим таблицей, вложенной в .table-layout
. Дочерние блоки main
сделаем ячейками таблицы, чтобы расположить их в ряд. И, наконец, растянем main
на 100% доступной ширины и высоты, и вместе с main
растянутся ячейки.
Такая разметка main
очень гибкая: можно без проблем менять ширину боковых столбцов, при этом основная колонка будет занимать всю оставшуюся ширину.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
<div class="table-layout"> <header> <h1>Кексогалерея</h1> </header> <main> <div class="side"> <p>Левая колонка</p> </div> <div class="content"> <p>Основная колонка</p> </div> <div class="side"> <p>Правая колонка</p> </div> </main> <footer class="sticky-footer"> <img class="footer-logo" src="/assets/course74/keks.jpg" alt=""> <p class="copyright">2015 Cat Energy</p> <p class="author">Keks, keks@htmlacademy.ru</p> </footer> </div> html, body { height: 100%; } .table-layout { display: table; width: 100%; height: 100%; } header, footer { display: table-row; height: 1px; } main { border-spacing: 10px; display:table; width: 100%; height: 100%; } .content, .side{ display:table-cell; } .side{ width:100px; } |