Пагинация
Пагинация делит длинный список на пронумерованные страницы и переключает их. Какие номера показать, решаете вы, а компонент их рисует.
<tk-pagination label="Search results"> <tk-pagination-prev href="?page=3"></tk-pagination-prev> <tk-pagination-item href="?page=1">1</tk-pagination-item> <tk-pagination-ellipsis></tk-pagination-ellipsis> <tk-pagination-item href="?page=3">3</tk-pagination-item> <tk-pagination-item href="?page=4" current>4</tk-pagination-item> <tk-pagination-item href="?page=5">5</tk-pagination-item> <tk-pagination-ellipsis></tk-pagination-ellipsis> <tk-pagination-item href="?page=20">20</tk-pagination-item> <tk-pagination-next href="?page=5"></tk-pagination-next> </tk-pagination>
Анатомия
| Часть | Что это |
|---|---|
tk-pagination |
навигационный ориентир со списком частей ниже |
tk-pagination-item |
номер страницы: ссылка или кнопка; current отмечает открытую |
tk-pagination-prev / tk-pagination-next |
шеврон на предыдущую или следующую страницу |
tk-pagination-ellipsis |
«…» на месте пропущенных страниц; не нажимается |
Каждая часть — одна ячейка, по умолчанию 40px. Страницы и prev/next — по одной остановке Tab.
Страницы
Каждая страница и каждый из prev/next — ссылка или кнопка:
- С
hrefэто ссылка. Подходит, когда у каждой страницы свой URL. - Без
hrefэто кнопка, которая отправляетtk-page-select. Подходит, когда страница меняется на месте, например строки в таблице.
<tk-pagination label="Table rows"> <tk-pagination-prev value="1"></tk-pagination-prev> <tk-pagination-item value="1">1</tk-pagination-item> <tk-pagination-item value="2" current>2</tk-pagination-item> <tk-pagination-item value="3">3</tk-pagination-item> <tk-pagination-next value="3"></tk-pagination-next> </tk-pagination>
pagination.addEventListener('tk-page-select', (e) => showPage(e.detail.value));current отмечает страницу, которая на экране. Она остаётся нажимаемой, не отключайте её.
Назад и вперёд
Prev и next показывают шеврон и называются «Previous page» и «Next page». На первой
странице задайте disabled у prev, на последней — у next.
<tk-pagination label="Search results"> <tk-pagination-prev href="?page=2">Previous</tk-pagination-prev> <tk-pagination-item href="?page=2">2</tk-pagination-item> <tk-pagination-item href="?page=3" current>3</tk-pagination-item> <tk-pagination-next disabled>Next</tk-pagination-next> </tk-pagination>
Текст внутри prev или next стоит рядом с шевроном. Доступное имя остаётся «Previous page» или «Next page», поэтому видимое слово должно в него входить.
Какие страницы показать
Компонент сам не решает, какие номера и многоточия показывать. Обычно показывают первую страницу, последнюю и текущую с одной соседней с каждой стороны, а на месте каждого пропуска ставят многоточие:
function pageWindow(current, total, siblings = 1) {
const range = (s, e) => Array.from({ length: e - s + 1 }, (_, i) => s + i);
if (total <= siblings * 2 + 5) return range(1, total);
const left = Math.max(current - siblings, 2);
const right = Math.min(current + siblings, total - 1);
return [
1,
...(left > 2 ? ['…'] : []),
...range(left, right),
...(right < total - 1 ? ['…'] : []),
total,
]; // pageWindow(4, 20) → [1, '…', 3, 4, 5, '…', 20]
}Каждое число выводите как tk-pagination-item, с current у открытой страницы, а
каждое '…' как tk-pagination-ellipsis.
Размеры
Размер один. Чтобы ряд стал компактнее, задайте --tk-pagination-cell-size у
tk-pagination, но не меньше 24px.
<tk-pagination label="Comments" style="--tk-pagination-cell-size: 32px"> <tk-pagination-prev disabled></tk-pagination-prev> <tk-pagination-item value="1" current>1</tk-pagination-item> <tk-pagination-item value="2">2</tk-pagination-item> <tk-pagination-next value="2"></tk-pagination-next> </tk-pagination>
Ячейка квадратная и расширяется под длинные номера. Цифры моноширинные, поэтому стоят ровно. Если места не хватает, ряд переносится.
Когда использовать
- Пагинация нужна, когда число страниц известно и полезно переходить к нужной: результаты поиска, таблица записей, галерея.
- Для бесконечной ленты подойдёт
Button «Показать ещё» или бесконечная прокрутка. - Для пошагового процесса, например оформления заказа, берите степпер.
- Чтобы листать строки
Table , поставьте пагинацию под ней. У таблицы своей пагинации нет.
Текст
- Не меняйте имена страниц без нужды. Страница читается как «Page 4», многоточие — как «More pages».
- Меняйте их через
labelтолько для перевода. - Дайте каждой пагинации
label, который называет, что она листает, например «Search results».
Можно / нельзя
| ✅ Можно | ❌ Нельзя |
|---|---|
href, когда у каждой страницы есть URL |
Кнопки там, где страницей можно поделиться ссылкой |
| Считать окно страниц в своём коде | Показывать все номера длинного списка |
Отмечать открытую страницу через current |
Отмечать её только другим цветом |
| Отключать prev на первой странице | Prev, который никуда не ведёт |
| Переводить фокус на новые результаты | Оставлять фокус на кнопке, которая только что отключилась |
Связанные
Table : пагинация обычно стоит под ней.Breadcrumb : путь вверх по иерархии, а не ряд страниц.
API
tk-pagination
| Атрибут | Тип | По умолчанию | Что делает |
|---|---|---|---|
label |
string | Pagination |
доступное имя ориентира |
| Слот | Содержимое |
|---|---|
| по умолчанию | части по порядку чтения: prev, страницы и многоточия, next |
tk-pagination-item
| Атрибут | Тип | По умолчанию | Что делает |
|---|---|---|---|
href |
string | — | делает страницу ссылкой; без него это кнопка, которая отправляет tk-page-select |
value |
string | текст страницы | значение, которое уходит с tk-page-select |
current |
boolean | false |
открытая страница: aria-current="page" и вид выбранной |
disabled |
boolean | false |
отключённая кнопка; нужна редко |
label |
string | «Page» + текст | заменяет доступное имя |
| Слот | Содержимое |
|---|---|
| по умолчанию | номер страницы |
tk-pagination-prev / tk-pagination-next
| Атрибут | Тип | По умолчанию | Что делает |
|---|---|---|---|
href |
string | — | делает элемент ссылкой; без него это кнопка, которая отправляет tk-page-select |
value |
string | — | номер нужной страницы, который уходит с tk-page-select |
disabled |
boolean | false |
на первой или последней странице |
label |
string | Previous page / Next page |
заменяет доступное имя |
| Слот | Содержимое |
|---|---|
| по умолчанию | необязательный текст после шеврона |
tk-pagination-ellipsis
| Атрибут | Тип | По умолчанию | Что делает |
|---|---|---|---|
label |
string | More pages |
что слышит скринридер |
События
| Событие | Detail | Когда |
|---|---|---|
tk-page-select |
{ value } |
нажата страница или prev/next без href; всплывает, слушайте на tk-pagination |
Ссылки просто открывают страницу, событий у них нет.
CSS
tk-pagination::part(list): элемент<ul>.--tk-pagination-cell-size: высота и минимальная ширина ячейки; по умолчанию40px.--tk-pagination-gap: промежуток между ячейками; по умолчаниюspace-4.
Токены
| Часть | Токены |
|---|---|
| ячейка | text/default, Label Medium (14/20), radius-8, space-8 по бокам |
| наведение / нажатие | state/hover / state/press |
| открытая страница | state/on + border/selected; под курсором state/on-hover |
| отключённая | text/disabled |
| многоточие | text/secondary |
| рамка фокуса | border/accent/focus |
Токены state/* — полупрозрачные слои, поэтому пагинация работает на любой поверхности.
Значения по темам:
Доступность
Встроено:
- Ориентир
<nav>с именем «Pagination» вокруг настоящего списка. - У открытой страницы
aria-current="page". - Страницы называются «Page 4», а не «4», поэтому понятны и в списке ссылок скринридера.
- У prev и next есть имена, а шевроны скрыты от скринридеров. Отключённые, они выпадают из порядка Tab, но сохраняют имя.
- Многоточие произносится как «More pages», поэтому о пропущенных страницах слышно.
- У каждой ячейки видимая рамка фокуса, по умолчанию размер 40px.
На вашей стороне:
- Решите, какие страницы показать, и отключите prev и next на краях.
- Свяжите
hrefилиtk-page-selectсо сменой страницы. - Когда страница сменилась на месте, переведите фокус на новое содержимое, например на заголовок результатов.
- Если пагинаций несколько или есть другой
<nav>, дайте каждому свойlabel.
| Клавиша | Действие |
|---|---|
Tab |
переходит по ячейкам; отключённые пропускает |
Enter |
открывает ссылку или нажимает кнопку |
Space |
нажимает кнопку |
Пределы контраста
- Открытая страница: в светлой и тёмной теме её заливка такая же, как у страницы под курсором, а в тёмной заливки почти нет. Отмечает её рамка; не убирайте её, когда меняете стиль.