SWCore
SWCore / Componentes / Paginação

Paginação Componentes

Os números de página (‹ 1 … 4 5 6 … 24 ›) calculados sozinhos: você diz quantos itens tem e quantos cabem por página. <nav sw-pagination sw-pagination-total='240'>.

O que é

Quando uma lista é grande demais para uma tela só — produtos da loja, posts do blog, pedidos no painel — ela é dividida em páginas, e embaixo aparecem os números para trocar de página. Com o SWCore você não monta os números à mão: informa o total de itens (sw-pagination-total), quantos mostram por página (sw-pagination-per) e em qual página está (sw-pagination-cur). Ele calcula quantas páginas existem, mostra as vizinhas da atual, resume o resto com "…" e coloca setas de anterior/próxima.

O JavaScript do núcleo desenha os números dentro da <nav>. A página atual ganha um fundo na cor primária que desliza até o número clicado. Ao clicar, ele atualiza sw-pagination-cur e dispara o evento sw:pagination:change com o número da nova página — é o seu código que carrega os itens daquela página (por AJAX ou trocando o endereço). As setas ficam apagadas na primeira e na última página. Funciona com teclado (Tab + Enter) e nos dois temas.

Quando usar

  • Loja virtual: grade de produtos com 12 ou 24 por página.
  • Blog / notícias: lista de posts.
  • Painel admin: tabelas de pedidos, clientes, agendamentos carregadas por AJAX.
  • Se a lista for pequena (cabe numa tela), não precisa. Se quiser "carregar mais ao rolar", veja o Infinite Scroll.

Comece aqui

  1. 1

    Coloque o SWCore na página: CSS no <head> e JS no fim do <body>. A paginação precisa dos dois.

    <link rel="stylesheet" href="https://swcore.sanweb.com.br/dist/2.1.0/swcore.min.css">
    
    <!-- fim do <body> -->
    <script src="https://swcore.sanweb.com.br/dist/2.1.0/swcore.min.js"></script>
  2. 2

    Escreva a <nav> vazia com o total, quantos por página e a página atual. 240 itens ÷ 10 por página = 24 páginas. Clique nos números.

    <nav sw-pagination sw-pagination-total="240" sw-pagination-per="10" sw-pagination-cur="4"></nav>
  3. 3

    Escute a troca de página e carregue os itens dela.

    const paginas = document.querySelector('[sw-pagination]');
    paginas.addEventListener('sw:pagination:change', (e) => {
      carregarProdutos(e.detail.page);   // sua função: busca a página e mostra na tela
    });

Todas as variações

Cada quadro abaixo é o componente de verdade, rodando. O código embaixo é exatamente o que está no quadro: copie e cole.

1. Estilos

O estilo vai no valor de sw-pagination. Sem valor: fundo deslizante com canto discreto. pill = cápsula. ghost = sem fundo, a atual fica sublinhada na cor primária. Os dois combinam.

Padrão <nav sw-pagination sw-pagination-total="80" sw-pagination-per="10" sw-pagination-cur="3"></nav>
pill — cápsula <nav sw-pagination="pill" sw-pagination-total="80" sw-pagination-per="10" sw-pagination-cur="3"></nav>
ghost — só sublinhado <nav sw-pagination="ghost" sw-pagination-total="80" sw-pagination-per="10" sw-pagination-cur="3"></nav>
pill ghost — combinados <nav sw-pagination="pill ghost" sw-pagination-total="80" sw-pagination-per="10" sw-pagination-cur="3"></nav>

2. Tamanhos

Três tamanhos: sm (pequeno, bom para tabela de painel), o padrão e lg (grande, bom para celular e sites com letra grande). Combinam com o estilo: "sm pill", "lg ghost"…

sm — pequeno <nav sw-pagination="sm" sw-pagination-total="80" sw-pagination-per="10" sw-pagination-cur="3"></nav>
Padrão — médio <nav sw-pagination sw-pagination-total="80" sw-pagination-per="10" sw-pagination-cur="3"></nav>
lg — grande <nav sw-pagination="lg" sw-pagination-total="80" sw-pagination-per="10" sw-pagination-cur="3"></nav>
sm pill — pequeno e cápsula <nav sw-pagination="sm pill" sw-pagination-total="80" sw-pagination-per="10" sw-pagination-cur="3"></nav>

3. Quantos números aparecem

sw-pagination-delta é quantos vizinhos da página atual aparecem de cada lado (padrão 2). A primeira e a última sempre aparecem; o que sobra vira "…". sw-pagination-ends acrescenta os botões « e » (ir para a primeira / última).

delta 1 — bem enxuto (bom no celular) <nav sw-pagination sw-pagination-total="500" sw-pagination-per="10" sw-pagination-cur="25" sw-pagination-delta="1"></nav>
Padrão — delta 2 <nav sw-pagination sw-pagination-total="500" sw-pagination-per="10" sw-pagination-cur="25"></nav>
delta 3 — mais números <nav sw-pagination sw-pagination-total="500" sw-pagination-per="10" sw-pagination-cur="25" sw-pagination-delta="3"></nav>
sw-pagination-ends — com « e » <nav sw-pagination sw-pagination-total="500" sw-pagination-per="10" sw-pagination-cur="25" sw-pagination-ends></nav>

4. Casos das pontas

Na primeira página a seta ‹ fica apagada; na última, a ›. Com poucas páginas, todos os números aparecem, sem "…".

Na primeira página <nav sw-pagination sw-pagination-total="120" sw-pagination-per="12" sw-pagination-cur="1" sw-pagination-ends></nav>
Na última página <nav sw-pagination sw-pagination-total="120" sw-pagination-per="12" sw-pagination-cur="10" sw-pagination-ends></nav>
Poucas páginas (5) <nav sw-pagination sw-pagination-total="50" sw-pagination-per="10" sw-pagination-cur="2"></nav>

Tabela de opções

PalavraO que fazExemplo
Números (obrigatórios)
sw-pagination-totalQuantos itens existem ao todo. Padrão 1.sw-pagination-total="240"
sw-pagination-perQuantos itens por página. Padrão 10. Páginas = total ÷ por página, arredondado para cima.sw-pagination-per="12"
sw-pagination-curPágina em que a pessoa está. Padrão 1. O JS atualiza a cada clique.sw-pagination-cur="4"
Quantos números mostrar
sw-pagination-deltaVizinhos de cada lado da página atual. Padrão 2.sw-pagination-delta="1"
sw-pagination-endsSem valor: mostra « (primeira) e » (última).<nav sw-pagination sw-pagination-ends>
Estilo (valor de sw-pagination)
(nenhum)Fundo na cor primária que desliza até a página atual.sw-pagination
pillCápsula (bem redondo).sw-pagination="pill"
ghostSem fundo: a atual fica na cor primária, sublinhada.sw-pagination="ghost"
Tamanho (valor de sw-pagination)
smPequeno (28 px).sw-pagination="sm"
(nenhum)Médio (34 px).
lgGrande (44 px).sw-pagination="lg"
Classes que o JS escreve (para o seu CSS)
sw-pagination-itCada número/seta.
is-actA página atual.
is-arrAs setas ‹ › « ».
is-disSeta apagada (não há para onde ir).
is-sepAs reticências "…".

Receitas prontas — usos reais

Situações que aparecem em quase todo site. Copie a que servir.

Loja: produtos carregados por AJAX Ao vivo

Mostrando produtos 1 a 12 de 96

<div id="produtos">…</div>
<p id="info">Mostrando produtos 1 a 12 de 96</p>
<nav sw-pagination="pill" id="paginas" sw-pagination-total="96" sw-pagination-per="12" sw-pagination-cur="1"></nav>

<script>
  document.getElementById('paginas').addEventListener('sw:pagination:change', async (e) => {
    const pagina = e.detail.page;
    const resp = await fetch('/produtos?pagina=' + pagina);
    document.getElementById('produtos').innerHTML = await resp.text();
    const de = (pagina - 1) * 12 + 1, ate = Math.min(pagina * 12, 96);
    document.getElementById('info').textContent = 'Mostrando produtos ' + de + ' a ' + ate + ' de 96';
  });
</script>
Painel admin: rodapé de tabela compacto Ao vivo
1.284 pedidos
<div class="flx j-sb alc">
  <span>1.284 pedidos</span>
  <nav sw-pagination="sm" sw-pagination-total="1284" sw-pagination-per="20"
       sw-pagination-cur="1" sw-pagination-delta="1" sw-pagination-ends></nav>
</div>
Blog: trocar de página mudando o endereço (sem AJAX) Referência
<!-- no PHP, escreva a página atual que veio na URL (?pagina=3) -->
<nav sw-pagination sw-pagination-total="<?= $totalPosts ?>" sw-pagination-per="9"
     sw-pagination-cur="<?= $paginaAtual ?>"></nav>

<script>
  document.querySelector('[sw-pagination]').addEventListener('sw:pagination:change', (e) => {
    location.href = '/blog?pagina=' + e.detail.page;
  });
</script>
Ir para uma página por código Referência
SW.Pagination.goto('#paginas', 5);   // vai para a página 5 (dispara sw:pagination:change)
// o mesmo, pelo elemento:
document.getElementById('paginas')._swPagination.goto(5);

Eventos

sw:pagination:change
Disparado na <nav> quando a página muda (clique, Enter ou goto). e.detail.page = número da nova página. Não dispara ao clicar na página que já está aberta.

API (JavaScript)

SW.Pagination.goto(nav, n)
Vai para a página n. nav é a <nav sw-pagination> ou o seletor dela ('#paginas'). Atalho para o de baixo.
nav._swPagination.goto(n)
Vai para a página n como se a pessoa tivesse clicado (move o destaque e dispara o evento). nav é a sua <nav sw-pagination>.
SW.Pagination.initAll(raiz)
Monta as paginações [sw-pagination] dentro de raiz que ainda não foram montadas. O núcleo já faz sozinho.

Precisa de quê

  • swcore.min.css + swcore.min.js — sem o JS a <nav> fica vazia.
  • Um jeito de buscar os itens de cada página (seu servidor/AJAX).

Cuidados — erros comuns

  • Esperar que a lista troque sozinha: a paginação só mostra os números e avisa a troca (sw:pagination:change). Buscar os itens daquela página é com você.
  • Colocar os números à mão dentro da <nav>: não precisa — e o que estiver lá continua aparecendo junto. Deixe-a vazia.
  • Mudar sw-pagination-total depois (ex.: filtro que reduz a lista) e esperar que ela recalcule: o total é lido só uma vez. Troque a <nav> inteira por uma nova com o total certo.
  • Esquecer sw-pagination-per: ele assume 10 por página e a conta fica errada se sua lista mostra 12.

O que ele não faz

  • Os números não são links de verdade (<a href>): o Google não segue essa paginação. Para SEO de blog/loja, mantenha também links normais "Próxima página" gerados no servidor.
  • A cor do destaque é sempre a primária; não há opção de outra cor.
  • Não mostra "ir para a página ___" nem "itens por página".