SWCore

Tabs Componentes

Abas que trocam o conteúdo sem sair da página, com um marcador que desliza até a aba escolhida. Seis visuais.

O que é

São as abas "Descrição / Medidas / Entrega" de uma página de produto, ou "Mensal / Anual" numa tabela de preços. Só um painel aparece por vez; clicar numa aba mostra o painel dela. Você monta com atributos: o grupo (sw-tabs), a barra de abas (sw-tabs-nav), cada aba (sw-tabs-it) e cada painel (sw-tabs-pnl). O visual se escolhe com uma palavra: sw-tabs="pill".

O JavaScript do SWCore liga cada aba ao painel da mesma posição (1ª aba → 1º painel), mede a aba ativa e desliza o marcador até ela — por isso ele acompanha o tamanho de cada texto. Também funciona no teclado (setas ← → trocam de aba) e, se as abas não couberem na tela do celular, aparecem setinhas ‹ › para rolar a barra. Funciona no tema claro e no escuro.

Quando usar

  • Página de produto: Descrição, Medidas, Avaliações.
  • Preços: Mensal / Anual (pill ou boxed ficam com cara de chave seletora).
  • Painel administrativo: Perfil, Segurança, Faturamento — abas na vertical (vrt) economizam altura.
  • Conteúdo parecido que a pessoa compara: cardápio do almoço / jantar, planos A / B.
  • Se o conteúdo for longo e a pessoa precisar ver vários de uma vez, use o Accordion.

Comece aqui

  1. 1

    Coloque o SWCore: o CSS no <head> e o JavaScript no fim do <body> (é ele que troca as abas).

    <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 as abas dentro de sw-tabs-nav e os painéis logo depois, na mesma ordem. class="is-act" marca a aba e o painel que começam abertos.

    Camiseta 100% algodão, fio 30.1, costura reforçada.
    P 50×70 · M 53×72 · G 56×74 cm.
    Envio em 24h. Frete grátis acima de R$ 199.
    <div sw-tabs>
      <div sw-tabs-nav>
        <button sw-tabs-it class="is-act">Descrição</button>
        <button sw-tabs-it>Medidas</button>
        <button sw-tabs-it>Entrega</button>
      </div>
      <div sw-tabs-pnl class="is-act">Camiseta 100% algodão, fio 30.1, costura reforçada.</div>
      <div sw-tabs-pnl>P 50×70 · M 53×72 · G 56×74 cm.</div>
      <div sw-tabs-pnl>Envio em 24h. Frete grátis acima de R$ 199.</div>
    </div>
  3. 3

    Para trocar o visual, escreva uma palavra no sw-tabs:

    Camiseta 100% algodão, fio 30.1, costura reforçada.
    P 50×70 · M 53×72 · G 56×74 cm.
    Envio em 24h. Frete grátis acima de R$ 199.
    <div sw-tabs="pill">
      ...as mesmas abas e painéis...
    </div>

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. Visuais

Clique nas abas de cada quadro para ver o marcador trocar de lugar.

Camiseta 100% algodão, fio 30.1, costura reforçada.
P 50×70 · M 53×72 · G 56×74 cm.
Envio em 24h. Frete grátis acima de R$ 199.
sw-tabs — padrão: linha embaixo e barrinha que desliza
<div sw-tabs>
  <div sw-tabs-nav>
    <button sw-tabs-it class="is-act">Descrição</button>
    <button sw-tabs-it>Medidas</button>
    <button sw-tabs-it>Entrega</button>
  </div>
  <div sw-tabs-pnl class="is-act">Camiseta 100% algodão, fio 30.1, costura reforçada.</div>
  <div sw-tabs-pnl>P 50×70 · M 53×72 · G 56×74 cm.</div>
  <div sw-tabs-pnl>Envio em 24h. Frete grátis acima de R$ 199.</div>
</div>
Camiseta 100% algodão, fio 30.1, costura reforçada.
P 50×70 · M 53×72 · G 56×74 cm.
Envio em 24h. Frete grátis acima de R$ 199.
pill — a aba ativa vira uma cápsula colorida
<div sw-tabs="pill">
  <div sw-tabs-nav>
    <button sw-tabs-it class="is-act">Descrição</button>
    <button sw-tabs-it>Medidas</button>
    <button sw-tabs-it>Entrega</button>
  </div>
  <div sw-tabs-pnl class="is-act">Camiseta 100% algodão, fio 30.1, costura reforçada.</div>
  <div sw-tabs-pnl>P 50×70 · M 53×72 · G 56×74 cm.</div>
  <div sw-tabs-pnl>Envio em 24h. Frete grátis acima de R$ 199.</div>
</div>
Camiseta 100% algodão, fio 30.1, costura reforçada.
P 50×70 · M 53×72 · G 56×74 cm.
Envio em 24h. Frete grátis acima de R$ 199.
boxed — trilho com fundo; a cápsula colorida desliza por dentro (cara de chave seletora)
<div sw-tabs="boxed">
  <div sw-tabs-nav>
    <button sw-tabs-it class="is-act">Descrição</button>
    <button sw-tabs-it>Medidas</button>
    <button sw-tabs-it>Entrega</button>
  </div>
  <div sw-tabs-pnl class="is-act">Camiseta 100% algodão, fio 30.1, costura reforçada.</div>
  <div sw-tabs-pnl>P 50×70 · M 53×72 · G 56×74 cm.</div>
  <div sw-tabs-pnl>Envio em 24h. Frete grátis acima de R$ 199.</div>
</div>
Camiseta 100% algodão, fio 30.1, costura reforçada.
P 50×70 · M 53×72 · G 56×74 cm.
Envio em 24h. Frete grátis acima de R$ 199.
glow — a aba ativa ganha um brilho que pulsa
<div sw-tabs="glow">
  <div sw-tabs-nav>
    <button sw-tabs-it class="is-act">Descrição</button>
    <button sw-tabs-it>Medidas</button>
    <button sw-tabs-it>Entrega</button>
  </div>
  <div sw-tabs-pnl class="is-act">Camiseta 100% algodão, fio 30.1, costura reforçada.</div>
  <div sw-tabs-pnl>P 50×70 · M 53×72 · G 56×74 cm.</div>
  <div sw-tabs-pnl>Envio em 24h. Frete grátis acima de R$ 199.</div>
</div>
Camiseta 100% algodão, fio 30.1, costura reforçada.
P 50×70 · M 53×72 · G 56×74 cm.
Envio em 24h. Frete grátis acima de R$ 199.
gradient — a aba ativa ganha degradê (primária → secundária) e sobe um pouquinho
<div sw-tabs="gradient">
  <div sw-tabs-nav>
    <button sw-tabs-it class="is-act">Descrição</button>
    <button sw-tabs-it>Medidas</button>
    <button sw-tabs-it>Entrega</button>
  </div>
  <div sw-tabs-pnl class="is-act">Camiseta 100% algodão, fio 30.1, costura reforçada.</div>
  <div sw-tabs-pnl>P 50×70 · M 53×72 · G 56×74 cm.</div>
  <div sw-tabs-pnl>Envio em 24h. Frete grátis acima de R$ 199.</div>
</div>

2. Abas na vertical

Com vrt as abas ficam numa coluna à esquerda e o painel ao lado. Combina com boxed.

Camiseta 100% algodão, fio 30.1, costura reforçada.
P 50×70 · M 53×72 · G 56×74 cm.
Envio em 24h. Frete grátis acima de R$ 199.
vrt — coluna com barrinha deslizante à direita
<div sw-tabs="vrt">
  <div sw-tabs-nav>
    <button sw-tabs-it class="is-act">Descrição</button>
    <button sw-tabs-it>Medidas</button>
    <button sw-tabs-it>Entrega</button>
  </div>
  <div sw-tabs-pnl class="is-act">Camiseta 100% algodão, fio 30.1, costura reforçada.</div>
  <div sw-tabs-pnl>P 50×70 · M 53×72 · G 56×74 cm.</div>
  <div sw-tabs-pnl>Envio em 24h. Frete grátis acima de R$ 199.</div>
</div>
Camiseta 100% algodão, fio 30.1, costura reforçada.
P 50×70 · M 53×72 · G 56×74 cm.
Envio em 24h. Frete grátis acima de R$ 199.
vrt boxed — coluna com fundo e cápsula deslizante
<div sw-tabs="vrt boxed">
  <div sw-tabs-nav>
    <button sw-tabs-it class="is-act">Descrição</button>
    <button sw-tabs-it>Medidas</button>
    <button sw-tabs-it>Entrega</button>
  </div>
  <div sw-tabs-pnl class="is-act">Camiseta 100% algodão, fio 30.1, costura reforçada.</div>
  <div sw-tabs-pnl>P 50×70 · M 53×72 · G 56×74 cm.</div>
  <div sw-tabs-pnl>Envio em 24h. Frete grátis acima de R$ 199.</div>
</div>

3. Muitas abas (celular)

Se as abas não cabem na largura, a barra rola para o lado e aparecem setinhas ‹ › nas pontas — tudo automático. Diminua a janela para ver.

Aberto das 9h às 18h.
Aberto das 9h às 18h.
Aberto das 9h às 18h.
Aberto das 9h às 20h.
Aberto das 9h às 20h.
Aberto das 9h às 14h.
Fechado.
Consulte pelo WhatsApp.
Barra que rola com setas automáticas
<div sw-tabs>
  <div sw-tabs-nav>
    <button sw-tabs-it class="is-act">Segunda</button>
    <button sw-tabs-it>Terça</button>
    <button sw-tabs-it>Quarta</button>
    <button sw-tabs-it>Quinta</button>
    <button sw-tabs-it>Sexta</button>
    <button sw-tabs-it>Sábado</button>
    <button sw-tabs-it>Domingo</button>
    <button sw-tabs-it>Feriados</button>
  </div>
  <div sw-tabs-pnl class="is-act">Aberto das 9h às 18h.</div>
  <div sw-tabs-pnl>Aberto das 9h às 18h.</div>
  <div sw-tabs-pnl>Aberto das 9h às 18h.</div>
  <div sw-tabs-pnl>Aberto das 9h às 20h.</div>
  <div sw-tabs-pnl>Aberto das 9h às 20h.</div>
  <div sw-tabs-pnl>Aberto das 9h às 14h.</div>
  <div sw-tabs-pnl>Fechado.</div>
  <div sw-tabs-pnl>Consulte pelo WhatsApp.</div>
</div>

4. Aba com ícone

A aba é um <button> normal: dá para pôr ícone antes do texto.

Nome, foto e contato.
Senha e verificação em duas etapas.
Cartões salvos e notas fiscais.
Ícones swi-* dentro das abas
<div sw-tabs="boxed">
  <div sw-tabs-nav>
    <button sw-tabs-it class="is-act"><i class="swi-user"></i> Perfil</button>
    <button sw-tabs-it><i class="swi-lock"></i> Segurança</button>
    <button sw-tabs-it><i class="swi-credit-card"></i> Pagamento</button>
  </div>
  <div sw-tabs-pnl class="is-act">Nome, foto e contato.</div>
  <div sw-tabs-pnl>Senha e verificação em duas etapas.</div>
  <div sw-tabs-pnl>Cartões salvos e notas fiscais.</div>
</div>

Tabela de opções

PalavraO que fazExemplo
Visual (palavra no sw-tabs)
(nenhuma)Linha embaixo das abas + barrinha colorida que desliza.sw-tabs
pillAba ativa em cápsula colorida (sem barrinha).sw-tabs="pill"
boxedTrilho com fundo; a cápsula colorida desliza por dentro.sw-tabs="boxed"
glowAba ativa com brilho pulsante.sw-tabs="glow"
gradientAba ativa com degradê e leve elevação.sw-tabs="gradient"
vrtAbas em coluna, à esquerda. Combina com boxed.sw-tabs="vrt boxed"
Partes (atributos)
sw-tabs-navA barra que segura as abas.<div sw-tabs-nav>
sw-tabs-itUma aba. Use <button>.<button sw-tabs-it>Medidas</button>
sw-tabs-pnlUm painel. Fica escondido até a aba dele ser escolhida.<div sw-tabs-pnl>…</div>
sw-tabs-indOpcional: o marcador que desliza. Se você não escrever, o JS cria.<span sw-tabs-ind></span>
sw-tabs-nav-wrapOpcional: moldura da barra (onde entram as setinhas). O JS cria sozinho.<div sw-tabs-nav-wrap>
Ligar aba ↔ painel (opcional)
(ordem)Padrão: 1ª aba abre o 1º painel, 2ª abre o 2º…
sw-tabs-idx="n"Na aba: número do painel que ela abre (0 = primeiro).<button sw-tabs-it sw-tabs-idx="2">
sw-tabs-idx="nome"Na aba: nome do painel. O painel leva sw-tabs-pnl="nome" (ou id="nome").<button sw-tabs-it sw-tabs-idx="anual">
Estado
is-actClasse na aba e no painel que começam abertos. Depois o JS cuida.<button sw-tabs-it class="is-act">
disabledAtributo do HTML na aba: não abre e é pulada pelas setas do teclado.<button sw-tabs-it disabled>

Receitas prontas — usos reais

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

Preços: mensal ou anual Ao vivo
R$ 49/mês — cancele quando quiser.
R$ 470/ano — equivale a R$ 39/mês.
<div sw-tabs="boxed">
  <div sw-tabs-nav>
    <button sw-tabs-it class="is-act">Mensal</button>
    <button sw-tabs-it>Anual <span sw-badge="suc pp">-20%</span></button>
  </div>
  <div sw-tabs-pnl class="is-act"><strong>R$ 49/mês</strong> — cancele quando quiser.</div>
  <div sw-tabs-pnl><strong>R$ 470/ano</strong> — equivale a R$ 39/mês.</div>
</div>
Painel: configurações com abas na vertical Ao vivo
<div sw-tabs="vrt">
  <div sw-tabs-nav>
    <button sw-tabs-it class="is-act">Perfil</button>
    <button sw-tabs-it>Segurança</button>
    <button sw-tabs-it>Notificações</button>
  </div>
  <div sw-tabs-pnl class="is-act">
    <div sw-fld><label for="rc-tb-nome">Nome</label><input sw-inp id="rc-tb-nome" value="Beatriz Rocha"></div>
  </div>
  <div sw-tabs-pnl>
    <button sw-btn="out p">Trocar senha</button>
  </div>
  <div sw-tabs-pnl>
    <label sw-chk><input type="checkbox" checked> Receber aviso de novo pedido</label>
  </div>
</div>
Abrir uma aba por um link de fora (nome no lugar da ordem) Ao vivo

Tênis de corrida com amortecimento.
★★★★★ "Muito confortável!" — Carla
<button type="button" sw-btn="ghost p" id="ver-avaliacoes">Ver avaliações ↓</button>

<div sw-tabs id="produto">
  <div sw-tabs-nav>
    <button sw-tabs-it sw-tabs-idx="descricao" class="is-act">Descrição</button>
    <button sw-tabs-it sw-tabs-idx="avaliacoes">Avaliações</button>
  </div>
  <div sw-tabs-pnl="descricao" class="is-act">Tênis de corrida com amortecimento.</div>
  <div sw-tabs-pnl="avaliacoes">★★★★★ "Muito confortável!" — Carla</div>
</div>

<script>
  document.getElementById('ver-avaliacoes').addEventListener('click', () => {
    SW.Tabs.show('#produto', 'avaliacoes');
  });

  // saber qual aba a pessoa abriu
  document.getElementById('produto').addEventListener('sw:tabs:change', (e) => {
    console.log('aba:', e.detail.key);   // "avaliacoes"
  });
</script>

Eventos

sw:tabs:change
A pessoa trocou de aba (clique ou teclado). Dispara no [sw-tabs]. event.detail traz key (o sw-tabs-idx da aba, se tiver), btn (a aba) e panel (o painel aberto).

API (JavaScript)

SW.Tabs.show(grupo, nome)
Abre a aba cujo sw-tabs-idx é nome (ou cujo id é nome). grupo é o elemento ou um seletor, ex.: '#produto'. Também aceita número: SW.Tabs.show('#produto', 1) abre a 2ª aba (0 = primeira).

Precisa de quê

  • swcore.min.css — o visual.
  • swcore.min.js — trocar as abas.
  • swcore.compl.min.css — só se usar ícone swi-* nas abas.

Cuidados — erros comuns

  • Número de abas diferente do número de painéis: a aba que sobrar não mostra nada (todos os painéis somem). Uma aba para cada painel, na mesma ordem.
  • Esquecer o is-act: a primeira aba é marcada sozinha, mas escreva nas duas (aba e painel) para a página não "piscar" ao carregar.
  • Dentro de um <form>, use <button type="button" sw-tabs-it> — senão clicar na aba envia o formulário.
  • Uma palavra de visual por vez (pill, boxed, glow ou gradient); só o vrt combina com elas.

O que ele não faz

  • Não troca de aba sozinha (sem autoplay) nem guarda a aba escolhida quando a página recarrega.
  • Os painéis trocam sem animação de entrada.