Умные стрелки пагинации для Юкоза: принципы работы и реализация
В современном веб-дизайне навигация по страницам - важный элемент, особенно на форумах и каталогах, где пользователь может перемещаться между большим количеством контента. Стандартная пагинация Юкоза показывает стрелку вправо всегда, что создаёт визуальные и логические ошибки. Под нашим руководством мы разработали умные стрелки, которые решают эти проблемы.
Основные задачи
1. Управление активностью стрелок
1. Левая стрелка видна всегда, но неактивна на первой странице.
2. Правая стрелка видна всегда, но неактивна на последней странице.
3. При наведении деактивированные стрелки не анимируются и не реагируют на клики.
Поддержка оригинальных кнопок страниц
1. Номера страниц остаются квадратными кнопками.
2. Активная страница подсвечена другим цветом.
3. Юкозовские стрелки скрыты полностью, чтобы не было визуального дублирования.
Динамическое обновление состояния
1. После любого клика по стрелке или номеру страницы скрипт проверяет текущую страницу.
2. На основе текущей страницы вычисляется состояние стрелок: активна/мертвая.
3. Используется метод setTimeout(updateArrows, 50) для корректного обновления после асинхронного изменения контента.
Принцип работы
1. Определение текущей страницы
3. Скрипт находит активную страницу через селектор:
Код
const active = document.querySelector('.custom-pages b span');
Если страница найдена - считывается её номер.
2. Определение последней страницы
Юкоз возвращает ссылки на страницы, но иногда правая стрелка присутствует всегда. Мы создаём функцию:
Код
function getTotalPages() { const pageLinks = document.querySelectorAll('.custom-pages a.swchItem'); let maxPage = getCurrentPage(); pageLinks.forEach(link => { const match = link.textContent.match(/\d+/); if (match) { const num = parseInt(match[0]); if (num > maxPage) maxPage = num; } }); return maxPage; }
Эта функция находит максимальный номер страницы среди ссылок и текущей страницы, что позволяет корректно определять последнюю страницу.
3. Обновление состояния стрелок
1. Функция updateArrows() проверяет текущую страницу и последнюю:
2. Если текущая страница = 1, левая стрелка получает класс disabled.
3. Если текущая страница = последняя, правая стрелка получает класс disabled.
В противном случае стрелки активны.
Код
prev.classList.toggle('disabled', current <= 1); next.classList.toggle('disabled', current >= total);
4. Действие стрелок
1. Левая стрелка: вызывает клик по ссылке предыдущей страницы, если есть куда переходить.
2. Правая стрелка: вызывает клик по ссылке следующей страницы, если текущая не последняя.
3. После клика состояние стрелок обновляется.
5. Скрытие стандартных стрелок Юкоза
Юкоз всегда отображает стрелку вправо. Чтобы убрать визуальное дублирование, мы скрываем стандартные стрелки:
1. Логичная навигация: пользователь всегда видит, куда можно перейти.
2. Единая визуальная схема: нет лишних стрелок Юкоза, активные и деактивированные стрелки визуально различимы.
3. Адаптивность: работает при любом количестве страниц, независимо от структуры Юкоза.
Простота поддержки: весь код сосредоточен в одном блоке HTML+CSS+JS.
Заключение
Был создан "умный" блок пагинации, который полностью заменяет стандартное поведение Юкоза. Благодаря правильной логике определения текущей и последней страницы, стрелки работают как и ожидалось.
<script> // Получаем текущую страницу function getCurrentPage() { const active = document.querySelector('.custom-pages b span'); return active ? parseInt(active.textContent) : 1; }
// Получаем общее количество страниц, включая текущую function getTotalPages() { const pageLinks = document.querySelectorAll('.custom-pages a.swchItem'); // Берем максимальный номер страницы среди ссылок и активной let maxPage = getCurrentPage(); pageLinks.forEach(link => { const match = link.textContent.match(/\d+/); if (match) { const num = parseInt(match[0]); if (num > maxPage) maxPage = num; } }); return maxPage; }
// Обновляем состояние стрелок function updateArrows() { const current = getCurrentPage(); const total = getTotalPages();
const prev = document.querySelector('.swchItem-prev'); const next = document.querySelector('.swchItem-next');
prev.classList.toggle('disabled', current <= 1); next.classList.toggle('disabled', current >= total); }
// Переключение назад function goPrev() { const current = getCurrentPage(); if (current <= 1) return; const prevLink = document.querySelector(`.custom-pages a[onclick*="spages('${current-1}'"]`); prevLink?.click(); setTimeout(updateArrows, 50); }
// Переключение вперед function goNext() { const current = getCurrentPage(); const total = getTotalPages(); if (current >= total) return; const nextLink = document.querySelector(`.custom-pages a[onclick*="spages('${current+1}'"]`); nextLink?.click(); setTimeout(updateArrows, 50); }