Я вот так на 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: только сейчас узнал, что это пагинацией называется.
Пошёл менять названия классов и ф-ций.