Пагинация
Пагинация делит длинный список результатов на страницы, показывает текущую и даёт перейти к соседней или конкретной странице. Ставьте её сразу после списка, которым она управляет.
Пример
Разметка
Минимальную разметку показывает пример выше. Части вложены так:
<nav class="sf-pagination"> → sf-pagination-main → счётчик
sf-pagination-total и sf-pagination-container → список
sf-pagination-list → пункты sf-pagination-item.
- Корень —
<nav>сaria-label. Строки и группы раскладывают утилитыflex,items-cross-center,content-main-between: CSS частей задаёт только отступы и цвета. - Список
<ol class="sf-pagination-list">с утилитамиlist-none m-0 p-0; в каждом пункте — одна страница или стрелка. - Номер страницы —
sf-page-numberс формойsf-page-number--squareилиsf-page-number--circleи утилитамиflex items-cross-center content-main-center. Он размером с элемент управления первой ступени. - Стрелки «назад» и «вперёд» — кнопки с иконкой
sf-icon-buttonи классомsf-pagination-direction: он разворачивает стрелку при письме справа налево. - Скрипта у компонента нет: номера, адреса и переходы задаёт приложение или Smart-компонент.
- Остальные части из таблицы классов — выбор числа строк
(
sf-pagination-count), поле номера страницы, отметка выбранных строк — собирает Smart-пагинация.
На узком экране строка счётчика и строка номеров встают друг под другом, а номера выравниваются по центру.
Варианты
Форма номера
sf-page-number--square даёт номеру скругление элементов управления,
sf-page-number--circle — круг. В одном блоке держите одну форму; квадрат
подходит таблицам и плотным спискам, круг — карточкам и галереям.
Ссылки на страницы
Когда у каждой страницы свой адрес, номера и стрелки — ссылки <a href>:
так страницу можно открыть в новой вкладке и скопировать её адрес, а
переход работает без JavaScript. Кнопки берите, когда список переключает
скрипт без смены адреса.
Длинный диапазон
В длинном диапазоне показывайте первую и последнюю страницы, текущую и её
соседей, а пропуски — многоточием sf-page-number--ellipsis. Многоточие —
текст, не действие: оно не получает фокус, и его пункт скрыт через
aria-hidden="true".
Поле номера страницы
Для длинных списков, как в табличном представлении, номер страницы вводится в поле между стрелками: человек видит, где он, и переходит на любую страницу, набрав номер. Поле — sf-pagination-page-field с полем ввода sf-input и классом sf-pagination-page-input; стрелки «в начало», «назад», «вперёд», «в конец» — кнопки-иконки с классом sf-pagination-direction. Переход по введённому номеру выполняет ваш код. Smart-компонент <sf-pagination> собирает эту раскладку сам: считает число страниц по total и page-size, переходит по Enter и сообщает о переходе событием sf-page-change.
Состояния
Наведение подсвечивает номер цветом --sf-surface-container; это состояние
компонент показывает сам.
Текущая
Класс selected выделяет текущую страницу рамкой и фоном основного цвета.
Добавьте ей aria-current="page".
Недоступна
Класс disabled приглушает номер; кнопке ставьте и атрибут disabled,
чтобы она не получала фокус. Недоступную стрелку на первой или последней
странице выключайте атрибутом disabled, как в основном примере.
Фокус
Номер в фокусе получает кольцо по :focus-visible. В примере фокус показан
классом focus-visible, который CSS компонента читает наравне с
псевдоклассом.
Доступность
- Корень —
<nav>сaria-label, например «Страницы результатов»; номера — список. - Текущая страница —
selectedиaria-current="page". - Номерам дайте
aria-labelвида «Страница 4», стрелкам — «Предыдущая страница» и «Следующая страница»; иконки —aria-hidden="true". - Многоточие скрыто от экранного диктора и не входит в порядок Tab.
- Номера и стрелки срабатывают по Enter, кнопки — и по пробелу; кольцо фокуса рисует компонент.
Классы
sf-pagination
| Что | Классы |
|---|---|
| Блок | sf-pagination |
| Части | sf-pagination-actions, sf-pagination-actions-count, sf-pagination-actions-separator, sf-pagination-bottom, sf-pagination-container, sf-pagination-count, sf-pagination-direction, sf-pagination-item, sf-pagination-left, sf-pagination-list, sf-pagination-main, sf-pagination-marked, sf-pagination-marked-text, sf-pagination-more, sf-pagination-page-field, sf-pagination-page-input, sf-pagination-pages-label, sf-pagination-top, sf-pagination-total |
| Размеры | sf-pagination--size-1/2 |
sf-page-number
| Что | Классы |
|---|---|
| Блок | sf-page-number |
| Модификаторы | sf-page-number--circle, sf-page-number--ellipsis, sf-page-number--square |
Классы и переменные собраны из CSS выпуска и обновляются вместе с ним.
Переменные
Компонент читает свои переменные, а модификаторы задают им значения; таблица показывает, из чего складывается вид. Переменные компонента — его внутренняя проводка, а не поверхность настройки: их имена и устройство могут меняться. Вид проекта меняют общие токены, а глубокий вид Smart-компонента — его шаблон (см. Переменные компонента). Значение по умолчанию — из базового правила блока (.sf-pagination, .sf-page-number); переменную без него задают только модификаторы.
| Переменная | По умолчанию | Задаёт |
|---|---|---|
--sf-pagination-actions--background-color |
не задана; задают модификаторы, например .sf-pagination-actions: var(--sf-elevation-2--surface) |
background-color |
--sf-pagination-actions--border-color |
не задана; задают модификаторы, например .sf-pagination-actions: var(--sf-outline-variant) |
border-top, border-block-start |
--sf-pagination-actions--gap |
не задана; задают модификаторы, например .sf-pagination-actions: var(--sf-space-1) |
gap |
--sf-pagination-actions--padding-block |
не задана; задают модификаторы, например .sf-pagination-actions: var(--sf-space-1) |
padding-top, padding-bottom, padding-block |
--sf-pagination-actions--padding-inline |
не задана; задают модификаторы, например .sf-pagination-actions: var(--sf-space-2) |
padding-left, padding-right, padding-inline |
--sf-pagination-actions--radius |
не задана; задают модификаторы, например .sf-pagination-actions: var(--sf-radius--surface) |
border-radius |
--sf-pagination-bottom--background-color |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-bottom: transparent |
background-color |
--sf-pagination-bottom--gap |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-bottom: var(--sf-space-1/2) |
gap |
--sf-pagination-bottom--padding-bottom |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-bottom: var(--sf-space-1) |
padding-bottom |
--sf-pagination-bottom--padding-top |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-bottom: var(--sf-space-1) |
padding-top |
--sf-pagination-container--background-color |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-container: transparent |
background-color |
--sf-pagination-container--font-size |
не задана; задают модификаторы, например .sf-pagination.sf-pagination--size-1/2: var(--sf-text-size-1/2) |
font-size |
--sf-pagination-container--gap |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-container: var(--sf-space-1/3) |
gap |
--sf-pagination-container--line-height |
не задана; задают модификаторы, например .sf-pagination.sf-pagination--size-1/2: var(--sf-text-height-1/2) |
line-height |
--sf-pagination-count--background-color |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-count: transparent |
background-color |
--sf-pagination-count--font-size |
не задана; задают модификаторы, например .sf-pagination.sf-pagination--size-1/2: var(--sf-text-size-1/2) |
font-size |
--sf-pagination-count--gap |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-count: var(--sf-space-1/3) |
gap |
--sf-pagination-count--line-height |
не задана; задают модификаторы, например .sf-pagination.sf-pagination--size-1/2: var(--sf-text-height-1/2) |
line-height |
--sf-pagination-left--background-color |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-left: transparent |
background-color |
--sf-pagination-left--gap |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-left: var(--sf-space-1) |
gap |
--sf-pagination-main--background-color |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-main: transparent |
background-color |
--sf-pagination-main--border-bottom-width |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-main: var(--sf-px) |
border-bottom-width |
--sf-pagination-main--border-color |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-main: var(--sf-outline-variant) |
border-color |
--sf-pagination-main--border-style |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-main: solid |
border-style |
--sf-pagination-main--padding-bottom |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-main: var(--sf-space-1) |
padding-bottom |
--sf-pagination-main--padding-top |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-main: var(--sf-space-1) |
padding-top |
--sf-pagination-marked--background-color |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-marked: transparent |
background-color |
--sf-pagination-marked--gap |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-marked: var(--sf-space-1/3) |
gap |
--sf-pagination-marked-text--color |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-marked-text:nth-child(1): var(--sf-on-surface-variant) |
color |
--sf-pagination-marked-text--font-family |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-marked-text: var(--sf-text--family) |
font-family |
--sf-pagination-marked-text--font-size |
не задана; задают модификаторы, например .sf-pagination.sf-pagination--size-1/2: var(--sf-text-size-1/2) |
font-size |
--sf-pagination-marked-text--font-weight |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-marked-text:nth-child(1): var(--sf-font-weight-regular) |
font-weight |
--sf-pagination-marked-text--line-height |
не задана; задают модификаторы, например .sf-pagination.sf-pagination--size-1/2: var(--sf-text-height-1/2) |
line-height |
--sf-pagination-page-input--digits |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-page-field: 1 |
width, inline-size |
--sf-pagination-top--background-color |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-top: transparent |
background-color |
--sf-pagination-top--border-bottom-width |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-top: var(--sf-px) |
border-bottom-width |
--sf-pagination-top--border-color |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-top: var(--sf-outline-variant) |
border-color |
--sf-pagination-top--border-style |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-top: solid |
border-style |
--sf-pagination-top--padding-bottom |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-top: calc(var(--sf-space-3) - var(--sf-space-1)) |
padding-bottom |
--sf-pagination-total--background-color |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-total: transparent |
background-color |
--sf-pagination-total--font-size |
не задана; задают модификаторы, например .sf-pagination.sf-pagination--size-1/2: var(--sf-text-size-1/2) |
font-size |
--sf-pagination-total--gap |
не задана; задают модификаторы, например .sf-pagination .sf-pagination-total: var(--sf-space-1/3) |
gap |
--sf-pagination-total--line-height |
не задана; задают модификаторы, например .sf-pagination.sf-pagination--size-1/2: var(--sf-text-height-1/2) |
line-height |
--sf-page-number--background-color |
var(--sf-surface-0) |
background-color |
--sf-page-number--border-bottom-width |
var(--sf-px) |
border-bottom-width, border-block-end-width |
--sf-page-number--border-color |
не задана; задают модификаторы, например .sf-page-number:not(:disabled):not(.disabled):active: var(--sf-primary-active) |
border-color |
--sf-page-number--border-end-end-radius |
не задана; задают модификаторы, например .sf-page-number--square: var(--sf-radius--ui) |
border-end-end-radius |
--sf-page-number--border-end-start-radius |
не задана; задают модификаторы, например .sf-page-number--square: var(--sf-radius--ui) |
border-end-start-radius |
--sf-page-number--border-inline-end-width |
var(--sf-px) |
border-inline-end-width |
--sf-page-number--border-inline-start-width |
var(--sf-px) |
border-inline-start-width |
--sf-page-number--border-start-end-radius |
не задана; задают модификаторы, например .sf-page-number--square: var(--sf-radius--ui) |
border-start-end-radius |
--sf-page-number--border-start-start-radius |
не задана; задают модификаторы, например .sf-page-number--square: var(--sf-radius--ui) |
border-start-start-radius |
--sf-page-number--border-style |
не задана; задают модификаторы, например .sf-page-number:not(:disabled):not(.disabled):active: solid |
border-style |
--sf-page-number--border-top-width |
var(--sf-px) |
border-top-width, border-block-start-width |
--sf-page-number--border-width |
не задана; задают модификаторы, например .sf-page-number:not(:disabled):not(.disabled):active: var(--sf-px) |
border-width |
--sf-page-number--color |
var(--sf-on-surface-variant) |
color |
--sf-page-number--font-size |
не задана; задают модификаторы, например .sf-pagination.sf-pagination--size-1/2: var(--sf-text-size-1/2) |
font-size |
--sf-page-number--font-weight |
не задана; задают модификаторы, например .sf-page-number:not(:disabled):not(.disabled):active: var(--sf-font-weight-medium) |
font-weight |
--sf-page-number--height |
не задана; задают модификаторы, например .sf-pagination.sf-pagination--size-1/2: var(--sf-ui-1/2--control-height) |
height, block-size |
--sf-page-number--line-height |
не задана; задают модификаторы, например .sf-pagination.sf-pagination--size-1/2: var(--sf-text-height-1/2) |
line-height |
--sf-page-number--width |
не задана; задают модификаторы, например .sf-pagination.sf-pagination--size-1/2: var(--sf-ui-1/2--control-height) |
width, inline-size |