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 (
pillouboxedficam 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
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
Escreva as abas dentro de
sw-tabs-nave 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
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.
<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>
<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>
<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>
<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>
<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.
<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>
<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.
<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.
<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
| Palavra | O que faz | Exemplo |
|---|---|---|
| Visual (palavra no sw-tabs) | ||
(nenhuma) | Linha embaixo das abas + barrinha colorida que desliza. | sw-tabs |
pill | Aba ativa em cápsula colorida (sem barrinha). | sw-tabs="pill" |
boxed | Trilho com fundo; a cápsula colorida desliza por dentro. | sw-tabs="boxed" |
glow | Aba ativa com brilho pulsante. | sw-tabs="glow" |
gradient | Aba ativa com degradê e leve elevação. | sw-tabs="gradient" |
vrt | Abas em coluna, à esquerda. Combina com boxed. | sw-tabs="vrt boxed" |
| Partes (atributos) | ||
sw-tabs-nav | A barra que segura as abas. | <div sw-tabs-nav> |
sw-tabs-it | Uma aba. Use <button>. | <button sw-tabs-it>Medidas</button> |
sw-tabs-pnl | Um painel. Fica escondido até a aba dele ser escolhida. | <div sw-tabs-pnl>…</div> |
sw-tabs-ind | Opcional: o marcador que desliza. Se você não escrever, o JS cria. | <span sw-tabs-ind></span> |
sw-tabs-nav-wrap | Opcional: 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-act | Classe na aba e no painel que começam abertos. Depois o JS cuida. | <button sw-tabs-it class="is-act"> |
disabled | Atributo 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.
<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>
<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>
<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[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)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 íconeswi-*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,glowougradient); só ovrtcombina 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.

