全 10 ページ中 1 ページにいるとき

全 10 ページ中 2 ページにいるとき

全 10 ページ中 4 ページにいるとき

全 10 ページ中 5 ページにいるとき

軽く仕様

  • 1 ページまたは最後ページにいるとき,隣の矢印ボタンは出さない
  • 1 ページ,最終ページのボタンは常に表示
  • 現在のページのボタンの背景色を黒くする
  • 現在のページのボタンの隣 2 つのボタンがある場合はそれを表示
  • ボタンの番号が飛ぶ場合は省略記号(…)を表示する

実装

HTML

{{ $p := .Paginate $pctx.RegularPages }}
{{/*  activate buttons for two pages before and after the current page  */}}
{{ $activeBtnLen := 2 }}
{{ if not (and $p.HasPrev $p.HasNext)}}
  {{/*  if current page is start or last, increment it  */}}
  {{ $activeBtnLen = add $activeBtnLen 1 }}
{{ end }}

<nav class="paging">
  <ul>
    {{ if $p.HasPrev }}
      <li><a href="{{ $p.Prev.URL }}" class="fas fa-arrow-left active" ></a></li>
    {{ end }}
    {{ range $p.Pagers }}

      {{/*  when not among (i-2, i-1, i, i+1, i+2)  */}}
      {{ if gt (math.Abs (sub .PageNumber $p.PageNumber)) $activeBtnLen }}
        {{ if eq .PageNumber 1 }}
          <li><a href="{{ .URL }}" class="active">1</a></li>
        {{ end }}
        {{ if eq .PageNumber $p.PageSize }}
          <li><a href="{{ .URL }}" class="active">{{ $p.PageSize }}</a></li>
        {{ end }}

        {{ if eq .PageNumber 2 }}
          <li class="flex-shrink"><span class="ellipsis">...</span></li>
        {{ end }}
        {{ if eq .PageNumber (sub $p.PageSize 1) }}
          <li class="flex-shrink"><span class="ellipsis">...</span></li>
        {{ end }}

        {{ continue }}
      {{ end }}

      {{/*  when among (i-2, i-1, i, i+1, i+2)  */}}
      {{ if eq .PageNumber $p.PageNumber }}
        <li><span class="disabled">{{ .PageNumber }}</span></li>
      {{ else }}
        <li><a href="{{ .URL }}" class="active">{{ .PageNumber }}</a></li>
      {{ end }}
    {{ end }}
    {{ if $p.HasNext }}
      <li><a href="{{ $p.Next.URL }}" class="fas fa-arrow-right active" ></a></li>
    {{ end }}
  </ul>
</nav>

{{ end }}

SCSS

.paging {
  text-align: center;
  padding: 1rem 0;

  ul {
    list-style: none;
    display: flex;
    width: 100%;
    gap: 4px;
    justify-content: center;

    li {
      width: 35px;
    }
  }

  .active,
  .disabled,
  .ellipsis {
    display: inline-block;
    border-radius: 4px;
    color: #333;
    width: 100%;
    line-height: 3rem;
  }

  .active {
    box-shadow: 0 0 0 1px rgba(63, 63, 68, 0.05),
      0 1px 3px rgba(63, 63, 68, 0.1), 0 1px 2px rgba(0, 0, 0, 0.05);
    background-color: #fff;
  }

  .disabled {
    box-shadow: 0 0 0 1px rgba(63, 63, 68, 0.05),
      0 1px 3px rgba(63, 63, 68, 0.1), 0 1px 2px rgba(0, 0, 0, 0.05);
    background-color: #ccc;
  }

  .flex-shrink {
    flex-shrink: 3;
  }
}