Таблицы на телефоне: сдвиг, карточки или меньше колонок

Три способа уместить таблицу в телефон и как выбрать, сначала главные колонки, числа, которые можно сравнить, и тарифы по одному на экран — с живыми примерами.

Интерфейс-элементы Обновлено

Коротко

Таблица не помещается в экран телефона, а если сжимать её, пока не влезет, она становится нечитаемой. Выход зависит от того, как данные читают. Значения, которые сравнивают по колонке, — цены, характеристики — остаются таблицей, которая листается вбок внутри своего блока, с закреплённой первой колонкой и тенью у края, показывающей, что дальше есть ещё. Строки, которые читают по одной, — заказы, заявки, документы — становятся карточками. Тарифы показывают по одному на экран с переключателем. В отчётах с десятком колонок остаются три главные, остальные открываются кнопкой. Числа выровнены вправо, цифры одинаковой ширины, единица — в заголовке, а в коде таблица остаётся настоящей таблицей.

Три способа уместить таблицу в телефон

Один и тот же прайс. Средняя таблица по-настоящему листается — сдвиньте её вбок: первая колонка остаётся на месте.

Сжата

мелко, переносы посреди слов

Сдвиг, колонка закреплена

для сравнения: листайте вбок

Карточки

для списка: строка — карточка

Какой способ для каких данных

Вопрос каждый раз один: значения сравнивают между собой или каждую строку читают отдельно?

ДанныеСпособПочему
Прайсы, характеристики сдвиг, первая колонка закреплена значения сравнивают по колонке
Заказы, заявки, документы карточки каждую строку читают отдельно
Тарифы по одному на экран с переключателем тариф выбирают, а не читают по ячейкам
Отчёты с десятком колонок главные колонки + «Все колонки» большинству нужны три колонки из десяти
Расписания список по дням на телефоне смотрят один день за раз

Сначала главные колонки

Список заказов для менеджера. На узком экране — номер, сумма и статус; остальное — в одно касание.

Числа, которые можно сравнить

Правый край, цифры одинаковой ширины, один формат и единица в заголовке — и колонка читается как шкала.

Вразнобой
По правому краю, единица в заголовке

Когда числа выровнены вправо, тысячи стоят под тысячами, и самое большое значение видно без чтения. Даты, коды и телефоны по величине не сравнивают — они остаются слева. Число никогда не переносится: разряды соединены неразрывными пробелами.

Тарифы: по одному на экран

Сравнительная таблица из трёх тарифов — самая частая таблица, которая ломается на телефоне.

Облако для фото

Нажмите на тариф в переключателе. Таблица на три колонки на телефоне превращается в мелкий шрифт и сдвиг; один тариф на экран читается целиком, а сравнение — переключением.

Таблицы в коде: 3 примера

Разметка, понятная клавиатуре и экранным читалкам, таблица со сдвигом и закреплённой колонкой и список, который превращается в карточки.

Разметка

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

table.html
<div class="table-wrap" role="region" aria-labelledby="worktops-caption" tabindex="0">
  <table class="table">
    <caption id="worktops-caption">Столешницы: цена и срок</caption>
    <thead>
      <tr>
        <th scope="col">Материал</th>
        <th scope="col">Толщина</th>
        <th scope="col" class="num">Цена за м², ₽</th>
        <th scope="col">Срок</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <th scope="row">Дуб</th>
        <td>40 мм</td>
        <td class="num">18 500</td>
        <td>14 дней</td>
      </tr>
    </tbody>
  </table>
</div>

Сдвиг с закреплённой колонкой

Тени у краёв видны, только пока есть куда листать, — без скрипта.

table.css
/* Таблица листается внутри своего блока, а не вся страница */
.table-wrap {
  overflow-x: auto;
  overscroll-behavior-x: contain;
  /* Тени у краёв: заслонки едут вместе с содержимым, тени стоят на месте */
  background:
    linear-gradient(to right, var(--color-surface) 30%, transparent) left / 2rem 100% no-repeat local,
    linear-gradient(to left, var(--color-surface) 30%, transparent) right / 2rem 100% no-repeat local,
    radial-gradient(farthest-side at 0 50%, rgb(0 0 0 / 0.15), transparent) left / 0.75rem 100% no-repeat scroll,
    radial-gradient(farthest-side at 100% 50%, rgb(0 0 0 / 0.15), transparent) right / 0.75rem 100% no-repeat scroll;
}

.table {
  border-collapse: collapse;
  white-space: nowrap;
}

/* Первая колонка остаётся на месте */
.table tr > :first-child {
  position: sticky;
  left: 0;
  background: var(--color-surface);
}

/* Числа: правый край, цифры одинаковой ширины */
.table .num {
  text-align: right;
  font-variant-numeric: tabular-nums;
}

Строки — в карточки

Название колонки берётся из data-label. Некоторые браузеры перестают озвучивать таблицу, у которой поменяли display, — role="table", "row" и "cell" в разметке это возвращают.

orders.css
/* Список заказов: на телефоне каждая строка становится карточкой */
@media (max-width: 47.99rem) {
  .table--cards thead {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip-path: inset(50%);
  }

  .table--cards tr {
    display: grid;
    gap: var(--space-1);
    padding: var(--space-3) 0;
    border-bottom: 1px solid var(--color-border);
  }

  /* <td data-label="Сумма">84 000</td> */
  .table--cards td {
    display: flex;
    justify-content: space-between;
    gap: var(--space-3);
  }

  .table--cards td::before {
    content: attr(data-label);
    color: var(--color-text-muted);
  }
}

7 правил таблиц на телефоне

  1. 01

    Не сжимать до нечитаемого

    Текст в ячейках — не мельче 14 px, даже если таблице придётся листаться.

  2. 02

    Способ — по тому, как читают

    Сравнивают по колонке — сдвиг; читают по строке — карточки.

  3. 03

    Первая колонка на месте

    При сдвиге всегда понятно, в какой ты строке.

  4. 04

    Показывать, что есть ещё

    Тень или обрезанная колонка у края.

  5. 05

    Числа вправо, единица в заголовке

    Цифры одинаковой ширины и один формат во всей колонке.

  6. 06

    Меньше колонок на телефоне

    Главные на виду, остальные — по кнопке.

  7. 07

    Таблица остаётся таблицей

    В коде — table, th и caption, как бы она ни выглядела.

Частые ошибки с таблицами на телефоне

  1. Текст ужат до 9 px

    Без увеличения ничего не прочитать.

  2. Сдвиг без подсказки

    Люди не знают, что половина колонок за краем.

  3. Карточки для сравнения

    Чтобы сравнить цены, приходится листать вверх-вниз и запоминать.

  4. Единицы в каждой ячейке и в разном виде

    «18500 р», «16 200₽» и «24900 руб.» в одной колонке.

  5. Число, разорванное переносом

    «24» на одной строке и «000» на следующей.

  6. Таблица из div

    Читалка не может ходить по строкам и колонкам, а поисковики не видят данных.

Вопросы о таблицах на телефоне

Сдвиг или карточки?

Сдвиг — когда значения сравнивают по колонке, карточки — когда каждую строку читают отдельно.

Как показать, что таблица листается?

Тенью у края и колонкой, обрезанной наполовину. И то и другое делается на CSS, без скрипта.

Какие колонки можно спрятать на телефоне?

Те, что не нужны для первого решения. Спросите у тех, кто работает с таблицей, на какие три колонки они смотрят.

Все ли числа выравнивать вправо?

Суммы, цены и количества — да. Даты, коды и телефоны по величине не сравнивают, они остаются слева.

Полосы через строку или линии?

Для коротких таблиц хватает тонких линий; полосы помогают глазу в длинных широких строках.

Можно ли выложить таблицу картинкой?

Лучше нет: её не прочитать на телефоне без увеличения, не найти поиском и не озвучить читалкой.

Форма

Данные, которые
читаются на телефоне

Проектирую и верстаю таблицы, прайсы и дашборды, которые работают на телефоне так же, как на большом экране. Расскажите о проекте — отвечу в течение рабочего дня.

Или пишите на [email protected]