Таблицы в HTML: понятное руководство для начинающих с примерами и адаптивными паттернами

Таблицы в HTML: понятное руководство для начинающих с примерами и адаптивными паттернами

Таблицы в HTML: понятное руководство для начинающих с примерами и адаптивными паттернами

Если вы хотите уверенно работать с табличными данными на веб‑страницах, начните с правильной разметки. Таблицы в HTML — это структурированный способ показать связанные данные, а не инструмент для построения колонок или сеток. Ниже — простое, но практичное руководство с кодом, советами и адаптивными приёмами для реальных проектов.

Когда действительно нужны таблицы в HTML

  • Да — для данных в пересечении строк и столбцов: прайсы, отчёты, расписания, сравнительные таблицы.
  • Нет — для вёрстки макета страницы. Для этого используйте Flexbox или CSS Grid.
  • Базовая структура таблицы

    Минимальный набор для корректной и доступной таблицы: <table>, строка <tr>, ячейки <th> (заголовки) и <td> (данные). Рекомендуется добавлять <caption> (подпись), а также секции <thead>, <tbody>, <tfoot> — они улучшают понимание разметки браузерами, технологиями доступности и упрощают стилизацию.

    <table>
      <caption>Расходы по месяцам, 2025</caption>
      <thead>
        <tr>
          <th scope="col">Месяц</th>
          <th scope="col">Продукты</th>
          <th scope="col">Транспорт</th>
          <th scope="col">Итого</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <th scope="row">Январь</th>
          <td>12000</td>
          <td>3500</td>
          <td>15500</td>
        </tr>
        <tr>
          <th scope="row">Февраль</th>
          <td>11500</td>
          <td>3800</td>
          <td>15300</td>
        </tr>
      </tbody>
      <tfoot>
        <tr>
          <th scope="row" colspan="3">Всего</th>
          <td>30800</td>
        </tr>
      </tfoot>
    </table>
    

    Атрибут scope помогает технологиям доступности понимать, к чему относится заголовок: scope="col" — к столбцу, scope="row" — к строке.

    Объединение ячеек и сложные заголовки

    Используйте colspan и rowspan, чтобы объединять ячейки. Для сложных таблиц с многоуровневыми заголовками применяйте id у <th> и атрибут headers у <td> — так скринридер сможет связать каждую ячейку с соответствующими заголовками.

    <table>
      <caption>Продажи по товарам (шт.)</caption>
      <thead>
        <tr>
          <th id="h-prod">Товар</th>
          <th id="h-jan">Янв</th>
          <th id="h-feb">Фев</th>
          <th id="h-q1" colspan="2">Итоги Q1</th>
        </tr>
        <tr>
          <th id="h-q1-min">Мин</th>
          <th id="h-q1-max">Макс</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <th id="r-milk" scope="row">Молоко</th>
          <td headers="r-milk h-jan">120</td>
          <td headers="r-milk h-feb">110</td>
          <td headers="r-milk h-q1 h-q1-min">110</td>
          <td headers="r-milk h-q1 h-q1-max">130</td>
        </tr>
      </tbody>
    </table>
    

    Такой подход помогает и людям, и машинам (скринридеры, парсеры) корректно интерпретировать данные.

    Быстрая стилизация: зебра, липкая шапка, аккуратные границы

    /* Базовые стили */
    table { width: 100%; border-collapse: collapse; }
    th, td { padding: 8px 12px; border: 1px solid #ddd; text-align: left; }
    caption { caption-side: top; text-align: left; font-weight: 600; margin-bottom: 8px; }
    
    /* Зебра */
    tbody tr:nth-child(odd) { background: #fafafa; }
    
    /* Липкая шапка (поддерживается большинством современных браузеров) */
    thead th { position: sticky; top: 0; background: #fff; z-index: 1; }
    
    /* Числовые данные по правому краю */
    td[data-num], th[data-num] { text-align: right; font-variant-numeric: tabular-nums; }
    

    При липкой шапке не забывайте про контраст фона для <thead> и возможную тень — так заголовок не «слипнется» с контентом при прокрутке.

    Адаптивные таблицы: два рабочих паттерна

    1) Горизонтальная прокрутка (простой и надёжный способ)

    <div class="table-wrap">
      <table>...ваша таблица...</table>
    </div>
    
    .table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
    .table-wrap table { min-width: 600px; } /* при необходимости фиксируем минимальную ширину */
    

    Плюсы: просто, сохраняется структура. Минусы: на узких экранах пользователь прокручивает вбок — это нормально для сложных таблиц.

    2) «Карточки» на мобильных (stacked table)

    При небольших экранах каждую строку можно отображать блоком, а подписи колонок выводить через псевдоэлемент и атрибут data-label у ячеек.

    <table class="stacked">
      <thead>
        <tr>
          <th>Месяц</th>
          <th>Продукты</th>
          <th>Транспорт</th>
          <th>Итого</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <th scope="row" data-label="Месяц">Январь</th>
          <td data-label="Продукты">12000</td>
          <td data-label="Транспорт">3500</td>
          <td data-label="Итого" data-num>15500</td>
        </tr>
      </tbody>
    </table>
    
    /***** CSS *****/
    @media (max-width: 640px) {
      .stacked thead { display: none; }
      .stacked, .stacked tbody, .stacked tr, .stacked th, .stacked td { display: block; width: 100%; }
      .stacked tr { margin: 0 0 12px; border: 1px solid #e5e5e5; border-radius: 8px; overflow: hidden; }
      .stacked th[scope="row"] { background: #f7f7f7; font-weight: 600; padding: 10px 12px; border-bottom: 1px solid #e5e5e5; }
      .stacked td { padding: 8px 12px; position: relative; }
      .stacked td::before { content: attr(data-label) ": "; color: #666; margin-right: 8px; }
      .stacked td[data-num] { text-align: right; }
    }
    

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

    Доступность: минимум, который стоит сделать всегда

  • Добавляйте <caption> — короткая и точная подпись помогает понять суть данных.
  • Используйте <th> для заголовков и атрибут scope для связи со строками/столбцами.
  • Для сложных таблиц применяйте id у заголовков и headers у ячеек данных.
  • Следите за контрастом текста и размером шрифта (не менее 14–16px).
  • Не кодируйте смысл цветом без дополнительного текста или иконки с aria-label/visually-hidden подписью.
  • Частые ошибки и как их избежать

  • Использование таблиц для макета. Решение: применяйте Flexbox/Grid для сеток, таблицы — только для данных.
  • Отсутствие <th> и <caption>. Решение: всегда размечайте заголовки и подпись, это повышает доступность и SEO контента с данными.
  • Выравнивание чисел по центру. Решение: выравнивайте числа по правому краю, используйте tabular-nums для ровных колонок цифр.
  • Жёсткие width/height атрибуты в HTML. Решение: контролируйте размеры через CSS и избегайте ломки в мобильной версии.
  • Переусложнение объединениями ячеек. Решение: если требуется много colspan/rowspan — подумайте, не лучше ли разбить данные на несколько таблиц или секций.
  • Мини‑чеклист перед сдачей задачи

  • Есть ли у таблицы понятная подпись в <caption>?
  • Проставлены ли <th> и правильный scope?
  • Доступна ли таблица с клавиатуры и читабельна ли на скринридере?
  • Как таблица ведёт себя на 320–375px ширины экрана? Выбран подходящий адаптивный паттерн?
  • Ровно ли выровнены числовые колонки?
  • Хотите системно прокачать навыки HTML и CSS (в том числе работу с таблицами, сетками и адаптивом)? Посмотрите программу и первые уроки: Прокачать HTML и вёрстку на курсе «Вёрстка сайта с нуля 2.0» — практические модули, задания и разборы помогут превратить теорию в уверенную практику.

    Итоги

    Таблицы в HTML остаются незаменимым инструментом для структурированных данных. Используйте семантическую разметку (<caption>, <thead>, <tbody>, <tfoot>, <th>), думайте о доступности (scope, headers), добавляйте аккуратную стилизацию и подбирайте адаптивный паттерн под задачу. Такой подход даёт читабельность, удобство и устойчивую верстку в реальных проектах.

    Источник

    НЕТ КОММЕНТАРИЕВ

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