Таблицы на телефоне: сдвиг, карточки или меньше колонок
Три способа уместить таблицу в телефон и как выбрать, сначала главные колонки, числа, которые можно сравнить, и тарифы по одному на экран — с живыми примерами.
Коротко
Таблица не помещается в экран телефона, а если сжимать её, пока не влезет, она становится нечитаемой. Выход зависит от того, как данные читают. Значения, которые сравнивают по колонке, — цены, характеристики — остаются таблицей, которая листается вбок внутри своего блока, с закреплённой первой колонкой и тенью у края, показывающей, что дальше есть ещё. Строки, которые читают по одной, — заказы, заявки, документы — становятся карточками. Тарифы показывают по одному на экран с переключателем. В отчётах с десятком колонок остаются три главные, остальные открываются кнопкой. Числа выровнены вправо, цифры одинаковой ширины, единица — в заголовке, а в коде таблица остаётся настоящей таблицей.
Три способа уместить таблицу в телефон
Один и тот же прайс. Средняя таблица по-настоящему листается — сдвиньте её вбок: первая колонка остаётся на месте.
мелко, переносы посреди слов
для сравнения: листайте вбок
для списка: строка — карточка
Какой способ для каких данных
Вопрос каждый раз один: значения сравнивают между собой или каждую строку читают отдельно?
| Данные | Способ | Почему |
|---|---|---|
| Прайсы, характеристики | сдвиг, первая колонка закреплена | значения сравнивают по колонке |
| Заказы, заявки, документы | карточки | каждую строку читают отдельно |
| Тарифы | по одному на экран с переключателем | тариф выбирают, а не читают по ячейкам |
| Отчёты с десятком колонок | главные колонки + «Все колонки» | большинству нужны три колонки из десяти |
| Расписания | список по дням | на телефоне смотрят один день за раз |
Сначала главные колонки
Список заказов для менеджера. На узком экране — номер, сумма и статус; остальное — в одно касание.
Числа, которые можно сравнить
Правый край, цифры одинаковой ширины, один формат и единица в заголовке — и колонка читается как шкала.
Когда числа выровнены вправо, тысячи стоят под тысячами, и самое большое значение видно без чтения. Даты, коды и телефоны по величине не сравнивают — они остаются слева. Число никогда не переносится: разряды соединены неразрывными пробелами.
Тарифы: по одному на экран
Сравнительная таблица из трёх тарифов — самая частая таблица, которая ломается на телефоне.
Облако для фото
Нажмите на тариф в переключателе. Таблица на три колонки на телефоне превращается в мелкий шрифт и сдвиг; один тариф на экран читается целиком, а сравнение — переключением.
Таблицы в коде: 3 примера
Разметка, понятная клавиатуре и экранным читалкам, таблица со сдвигом и закреплённой колонкой и список, который превращается в карточки.
Разметка
Блок можно листать с клавиатуры; подпись и заголовки сообщают читалке, что в каждой ячейке.
<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-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" в разметке это возвращают.
/* Список заказов: на телефоне каждая строка становится карточкой */
@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 правил таблиц на телефоне
-
01
Не сжимать до нечитаемого
Текст в ячейках — не мельче 14 px, даже если таблице придётся листаться.
-
02
Способ — по тому, как читают
Сравнивают по колонке — сдвиг; читают по строке — карточки.
-
03
Первая колонка на месте
При сдвиге всегда понятно, в какой ты строке.
-
04
Показывать, что есть ещё
Тень или обрезанная колонка у края.
-
05
Числа вправо, единица в заголовке
Цифры одинаковой ширины и один формат во всей колонке.
-
06
Меньше колонок на телефоне
Главные на виду, остальные — по кнопке.
-
07
Таблица остаётся таблицей
В коде — table, th и caption, как бы она ни выглядела.
Частые ошибки с таблицами на телефоне
-
Текст ужат до 9 px
Без увеличения ничего не прочитать.
-
Сдвиг без подсказки
Люди не знают, что половина колонок за краем.
-
Карточки для сравнения
Чтобы сравнить цены, приходится листать вверх-вниз и запоминать.
-
Единицы в каждой ячейке и в разном виде
«18500 р», «16 200₽» и «24900 руб.» в одной колонке.
-
Число, разорванное переносом
«24» на одной строке и «000» на следующей.
-
Таблица из div
Читалка не может ходить по строкам и колонкам, а поисковики не видят данных.
Вопросы о таблицах на телефоне
Сдвиг или карточки?
Сдвиг — когда значения сравнивают по колонке, карточки — когда каждую строку читают отдельно.
Как показать, что таблица листается?
Тенью у края и колонкой, обрезанной наполовину. И то и другое делается на CSS, без скрипта.
Какие колонки можно спрятать на телефоне?
Те, что не нужны для первого решения. Спросите у тех, кто работает с таблицей, на какие три колонки они смотрят.
Все ли числа выравнивать вправо?
Суммы, цены и количества — да. Даты, коды и телефоны по величине не сравнивают, они остаются слева.
Полосы через строку или линии?
Для коротких таблиц хватает тонких линий; полосы помогают глазу в длинных широких строках.
Можно ли выложить таблицу картинкой?
Лучше нет: её не прочитать на телефоне без увеличения, не найти поиском и не озвучить читалкой.
Форма
Данные, которые
читаются на телефоне
Проектирую и верстаю таблицы, прайсы и дашборды, которые работают на телефоне так же, как на большом экране. Расскажите о проекте — отвечу в течение рабочего дня.