Алгоритм пагинации
Дано:
Количество записей на странице Количество всех страниц Количество всех записей. С этими данными сейчас выводятся страницы все подряд и это очень не красиво выглядит. ![]() Так как статьи будут только умножаться, то количество ссылок на страницы будет расти. Как сделать чтобы была допустим первая страница, затем те на которой мы находимся, справа и слева от нее две-три и последняя страница? |
1. Вывести первую
2. Вывести ту на которой находимся и справа и слева от неё две-три 3. Вывести последнюю 4. PROFIT |
Нужен пример кода.
Тут есть нюансы типа: На какой странице мы сейчас находимся, здесь нужны правильные проверки на количество, а то вдруг страниц всего две, а выведется две справа и две слева, плюс первая, тогда получится 1 -1 1 2 3 4 2 (если мы на второй находимся. Прошу помощи с кодом |
Вообще-то сервер должен формировать навигатор, и почему не устраивает задание ширины навигатора с переходами на каждую из частей страниц определяемых этой шириной?
|
Я вот так на PHP делал:
function generatePages($url, $count, $checked = 0, $extra = false) { $j = 1 + ($checked < 2 || ($checked > $count - 3) ? 0 : $checked - 2 - ($checked == $count - 3)); for($i = 1, $l = $count > 7 ? 7 : $count; $i <= $l; $i++, $j++) { if($i > 3 && $count > 7) { if($i == 4) { $result[] = '<a class="pages-change" data-count="'.$count.'" data-url="'.$url.'" title="Выбрать другую страницу">...</a>'; continue; } $k = $count - ($l - $i); } else $k = $j; $result[] = '<a '.($checked == $k ? 'class="checked"': 'href="'.$url.'?page='.$k.'"').'>'.$k.'</a>'; } if($extra) { array_unshift($result, '<a'.($checked != 1 ? ' href="'.$url.'?page='.($checked - 1).'"' : '').' title="Предыдущая страница">«</a>'); $result[] = '<a'.($checked != $count ? ' href="'.$url.'?page='.($checked + 1).'"' : '').' title="Следующая страница">»</a>'; } return implode("\n", $result); } generatePages(ссылка, количество страниц, текущая страница. Вкл/Выкл стрелочки) Итого получается примерно такой код: <div class="pages"> <?=generatePages('', 12, 5, true)?> </div> <div class="pages"> <a href="?page=4" title="Предыдущая страница">«</a> <a href="?page=4">4</a> <a class="checked">5</a> <a href="?page=6">6</a> <a class="pages-change" title="Выбрать другую страницу">...</a> <a href="?page=10">10</a> <a href="?page=11">11</a> <a href="?page=12">12</a> <a href="?page=6" title="Следующая страница">«</a> </div> P.S.: мой код конечно не идеален, но я особо не заморачивался. :) P.P.S: только сейчас узнал, что это пагинацией называется. Пошёл менять названия классов и ф-ций. :D |
|
riki-tik,
:write: function pagination(b, c, d) { return Array(d + 1).join("1").split("").map(function(a, b) { return b + 1 }).filter(function(a, e) { return c ? 1 == a || a == b || a == d || a <= b + c && a >= b - c : !0 }) }; //pagination(current,step,max ) step = 0 полный диапазон alert(pagination(13, 2, 14)) alert(pagination( 5, 0 , 14)) |
Каждый должен написать свою пагинацию :lol:
Мой вариант http://jsfiddle.net/vlasenkofedor/hyQnb/ |
У всех все неправильно, один я в белом. Решение давно известно, вот такое
задается макс слотов, скажем 10 в эти 10 слотов загоняется весь интерфейс с кнопками, логика построения которого такова: если паг меньше кол-ва слотов - вывести континуально если паг больше - задать минимальный охват континуума, скажем в 5 страниц, а все остальное поделить между квантами начала и конца, особенно важен конец который показывает юзеру что ему ни в жизнь дотудова не домотать. Ну то есть общее количество страниц должно сохраняться всегда. Например мы на первой странице где их 12 1 2 3 4 5 6 7 … 11 12 Вперед » Как видите разрыв шаблона начинается со страницы 7. Потому что континуум 5 слотов, а когда он целиком влезает, к нему континуально добавляется неиспользуемый квант начала. Если домотать до страницы 7, то получим « Назад 1 2 … 5 6 7 8 … 11 12 Вперед » ... - hellip'ы - тоже кнопки, это третья кнопка в боковых отростках которая имеет номер страницы как обычно, но рендерится в качестве индикатора разрыва континуума Теперь если мотать дальше, то неразрывный диапазон переедет к концу и там захапает отросток « Назад 1 2 … 6 7 8 9 10 11 12 Вперед » Он так и будет сдвигаться вправо пока не упрется в конец номеров и на последней странице получится « Назад 1 2 … 10 11 12 Такая логика обеспечивает всегда отображение начала и конца диапазона страниц и небольшой промежуток для навигации вокруг выбранной. Такая логика на многих коммерческих сайтах применена. Я по внешним признакам писал код, он на php. Готовый для такой логики найти не удалось, кругом были баяны. |
Часовой пояс GMT +3, время: 13:54. |