Accordion Componentes
Lista de títulos que abrem e fecham com animação suave — um aberto por vez ou vários, com cinco visuais diferentes.
O que é
É o bloco de "Perguntas frequentes", "Detalhes do produto" ou "Módulos do curso": a pessoa clica no título e o conteúdo desliza para baixo; clica de novo e ele recolhe. Por padrão, abrir um fecha o outro. Você monta a estrutura com atributos (sw-accordion, sw-acc-it, sw-acc-hdr, sw-acc-bdy) e escolhe o visual escrevendo palavras dentro do sw-accordion: sw-accordion="split plus".
O JavaScript do SWCore mede a altura real do conteúdo e anima até ela, então a abertura é sempre suave, com texto curto ou longo. Ele também deixa o título acessível: dá para abrir com Tab + Enter (ou espaço) e o leitor de tela sabe se está aberto ou fechado. Funciona no tema claro e no escuro.
Quando usar
- Perguntas frequentes com abertura animada.
- Detalhes de produto ("Descrição", "Medidas", "Entrega").
- Conteúdo de curso ou cardápio por seções, com vários abertos ao mesmo tempo (
multi). - Painel administrativo: grupos de configurações que recolhem (
card). - Quer algo sem JavaScript? A Sanfona (
sw-sanfona) é a versão só HTML/CSS.
Comece aqui
-
1
Coloque o SWCore: o CSS no
<head>e o JavaScript no fim do<body>(é ele que abre e fecha).<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
Monte a estrutura: o grupo (
sw-accordion), cada item (sw-acc-it) com título (sw-acc-hdr) e corpo (sw-acc-bdy+sw-acc-bdy-in).class="is-act"= começa aberto.Quanto tempo leva para o site ficar pronto?De 7 a 15 dias, com textos e fotos em mãos.Vocês fazem a hospedagem?Sim. O primeiro ano já vem incluso no pacote.Posso mexer no site depois?Pode. Você recebe um painel para trocar textos e fotos.<div sw-accordion> <div sw-acc-it class="is-act"> <div sw-acc-hdr>Quanto tempo leva para o site ficar pronto?</div> <div sw-acc-bdy><div sw-acc-bdy-in>De 7 a 15 dias, com textos e fotos em mãos.</div></div> </div> <div sw-acc-it> <div sw-acc-hdr>Vocês fazem a hospedagem?</div> <div sw-acc-bdy><div sw-acc-bdy-in>Sim. O primeiro ano já vem incluso no pacote.</div></div> </div> <div sw-acc-it> <div sw-acc-hdr>Posso mexer no site depois?</div> <div sw-acc-bdy><div sw-acc-bdy-in>Pode. Você recebe um painel para trocar textos e fotos.</div></div> </div> </div> -
3
Para mudar o visual, escreva palavras no
sw-accordion. Aqui: cartões soltos com o ícone "+".Quanto tempo leva para o site ficar pronto?De 7 a 15 dias, com textos e fotos em mãos.Vocês fazem a hospedagem?Sim. O primeiro ano já vem incluso no pacote.Posso mexer no site depois?Pode. Você recebe um painel para trocar textos e fotos.<div sw-accordion="split plus"> ...os mesmos itens... </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
Sem palavra, os itens ficam juntos numa moldura só, separados por linha. Clique nos títulos para abrir e fechar.
<div sw-accordion>
<div sw-acc-it class="is-act">
<div sw-acc-hdr>Quanto tempo leva para o site ficar pronto?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>De 7 a 15 dias, com textos e fotos em mãos.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Vocês fazem a hospedagem?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Sim. O primeiro ano já vem incluso no pacote.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Posso mexer no site depois?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Pode. Você recebe um painel para trocar textos e fotos.</div></div>
</div>
</div>
<div sw-accordion="split">
<div sw-acc-it class="is-act">
<div sw-acc-hdr>Quanto tempo leva para o site ficar pronto?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>De 7 a 15 dias, com textos e fotos em mãos.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Vocês fazem a hospedagem?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Sim. O primeiro ano já vem incluso no pacote.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Posso mexer no site depois?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Pode. Você recebe um painel para trocar textos e fotos.</div></div>
</div>
</div>
<div sw-accordion="flush">
<div sw-acc-it class="is-act">
<div sw-acc-hdr>Quanto tempo leva para o site ficar pronto?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>De 7 a 15 dias, com textos e fotos em mãos.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Vocês fazem a hospedagem?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Sim. O primeiro ano já vem incluso no pacote.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Posso mexer no site depois?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Pode. Você recebe um painel para trocar textos e fotos.</div></div>
</div>
</div>
<div sw-accordion="card">
<div sw-acc-it class="is-act">
<div sw-acc-hdr>Quanto tempo leva para o site ficar pronto?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>De 7 a 15 dias, com textos e fotos em mãos.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Vocês fazem a hospedagem?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Sim. O primeiro ano já vem incluso no pacote.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Posso mexer no site depois?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Pode. Você recebe um painel para trocar textos e fotos.</div></div>
</div>
</div>
2. Ícone do título
Por padrão, uma setinha que vira para cima quando abre. Com plus vira um "+" que gira até "×". Combina com qualquer visual.
<div sw-accordion="split">
<div sw-acc-it class="is-act">
<div sw-acc-hdr>Quanto tempo leva para o site ficar pronto?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>De 7 a 15 dias, com textos e fotos em mãos.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Vocês fazem a hospedagem?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Sim. O primeiro ano já vem incluso no pacote.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Posso mexer no site depois?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Pode. Você recebe um painel para trocar textos e fotos.</div></div>
</div>
</div>
<div sw-accordion="split plus">
<div sw-acc-it class="is-act">
<div sw-acc-hdr>Quanto tempo leva para o site ficar pronto?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>De 7 a 15 dias, com textos e fotos em mãos.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Vocês fazem a hospedagem?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Sim. O primeiro ano já vem incluso no pacote.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Posso mexer no site depois?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Pode. Você recebe um painel para trocar textos e fotos.</div></div>
</div>
</div>
<div sw-accordion="flush plus">
<div sw-acc-it class="is-act">
<div sw-acc-hdr>Quanto tempo leva para o site ficar pronto?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>De 7 a 15 dias, com textos e fotos em mãos.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Vocês fazem a hospedagem?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Sim. O primeiro ano já vem incluso no pacote.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Posso mexer no site depois?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Pode. Você recebe um painel para trocar textos e fotos.</div></div>
</div>
</div>
<div sw-accordion="card plus">
<div sw-acc-it class="is-act">
<div sw-acc-hdr>Quanto tempo leva para o site ficar pronto?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>De 7 a 15 dias, com textos e fotos em mãos.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Vocês fazem a hospedagem?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Sim. O primeiro ano já vem incluso no pacote.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Posso mexer no site depois?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Pode. Você recebe um painel para trocar textos e fotos.</div></div>
</div>
</div>
3. Quantos abertos ao mesmo tempo
Por padrão, abrir um item fecha o que estava aberto. Com multi, cada um abre e fecha sozinho.
<div sw-accordion="split">
<div sw-acc-it class="is-act">
<div sw-acc-hdr>Quanto tempo leva para o site ficar pronto?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>De 7 a 15 dias, com textos e fotos em mãos.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Vocês fazem a hospedagem?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Sim. O primeiro ano já vem incluso no pacote.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Posso mexer no site depois?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Pode. Você recebe um painel para trocar textos e fotos.</div></div>
</div>
</div>
<div sw-accordion="split multi">
<div sw-acc-it class="is-act">
<div sw-acc-hdr>Quanto tempo leva para o site ficar pronto?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>De 7 a 15 dias, com textos e fotos em mãos.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Vocês fazem a hospedagem?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Sim. O primeiro ano já vem incluso no pacote.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Posso mexer no site depois?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Pode. Você recebe um painel para trocar textos e fotos.</div></div>
</div>
</div>
4. Título com ícone
Envolva o texto do título com sw-acc-hdr-ttl e coloque um ícone com as classes swi + swi-nome: ele sai na cor primária, alinhado ao texto.
<div sw-accordion="card">
<div sw-acc-it class="is-act">
<div sw-acc-hdr><span sw-acc-hdr-ttl><i class="swi swi-package"></i> Entrega</span></div>
<div sw-acc-bdy><div sw-acc-bdy-in>Enviamos em até 24h para todo o Brasil.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr><span sw-acc-hdr-ttl><i class="swi swi-refresh"></i> Trocas</span></div>
<div sw-acc-bdy><div sw-acc-bdy-in>Primeira troca grátis em até 30 dias.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr><span sw-acc-hdr-ttl><i class="swi swi-credit-card"></i> Pagamento</span></div>
<div sw-acc-bdy><div sw-acc-bdy-in>Pix, boleto ou cartão em até 12x.</div></div>
</div>
</div>
Tabela de opções
| Palavra | O que faz | Exemplo |
|---|---|---|
| Visual (palavra no sw-accordion) | ||
(nenhuma) | Junto: uma moldura só, itens separados por linha. | sw-accordion |
split | Cartões soltos, com espaço entre eles. | sw-accordion="split" |
flush | Sem moldura e sem fundo: só as linhas divisórias. | sw-accordion="flush" |
card | Cartões com sombra; o aberto ganha faixa colorida à esquerda. | sw-accordion="card" |
| Ícone e comportamento (palavra no sw-accordion) | ||
plus | Troca a seta por "+" que gira até "×". | sw-accordion="split plus" |
multi | Deixa vários itens abertos ao mesmo tempo. Sem ela, só um. | sw-accordion="multi" |
| Partes (atributos) | ||
sw-acc-it | Um item (título + corpo). | <div sw-acc-it> |
sw-acc-hdr | O título clicável. | <div sw-acc-hdr>Pergunta</div> |
sw-acc-bdy | A caixa que abre e fecha (é ela que anima). | <div sw-acc-bdy> |
sw-acc-bdy-in | O conteúdo, com o espaçamento interno. Vai dentro do sw-acc-bdy. | <div sw-acc-bdy-in>Resposta</div> |
sw-acc-hdr-ttl | Opcional: envolve ícone + texto do título, alinhados. | <span sw-acc-hdr-ttl><i class="swi swi-package"></i> Entrega</span> |
| Estado | ||
is-act | Classe no sw-acc-it: o item começa aberto. O JS liga/desliga ela sozinho depois. | <div sw-acc-it class="is-act"> |
Receitas prontas — usos reais
Situações que aparecem em quase todo site. Copie a que servir.
<div sw-accordion="flush plus">
<div sw-acc-it class="is-act">
<div sw-acc-hdr>Tem garantia?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Sim: 7 dias para pedir o dinheiro de volta, sem perguntas.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Como recebo o acesso?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Por e-mail, logo depois que o pagamento é aprovado.</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr>Posso parcelar?</div>
<div sw-acc-bdy><div sw-acc-bdy-in>Em até 12x no cartão.</div></div>
</div>
</div>
- Aula 1 — Boas-vindas (4 min)
- Aula 2 — Configurando tudo (12 min)
- Aula 3 — Anúncios que convertem (18 min)
- Aula 4 — WhatsApp de vendas (15 min)
<div sw-accordion="split multi">
<div sw-acc-it class="is-act">
<div sw-acc-hdr><span sw-acc-hdr-ttl><i class="swi swi-play-circle"></i> Módulo 1 — Primeiros passos</span></div>
<div sw-acc-bdy><div sw-acc-bdy-in>
<ul>
<li>Aula 1 — Boas-vindas (4 min)</li>
<li>Aula 2 — Configurando tudo (12 min)</li>
</ul>
</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr><span sw-acc-hdr-ttl><i class="swi swi-play-circle"></i> Módulo 2 — Vendendo mais</span></div>
<div sw-acc-bdy><div sw-acc-bdy-in>
<ul>
<li>Aula 3 — Anúncios que convertem (18 min)</li>
<li>Aula 4 — WhatsApp de vendas (15 min)</li>
</ul>
</div></div>
</div>
</div>
<div sw-accordion="card plus">
<div sw-acc-it class="is-act">
<div sw-acc-hdr><span sw-acc-hdr-ttl><i class="swi swi-store"></i> Dados da loja</span></div>
<div sw-acc-bdy><div sw-acc-bdy-in>
<div sw-fld><label for="rc-acc-nome">Nome da loja</label><input sw-inp id="rc-acc-nome" value="Doces da Bia"></div>
</div></div>
</div>
<div sw-acc-it>
<div sw-acc-hdr><span sw-acc-hdr-ttl><i class="swi swi-bell"></i> Avisos</span></div>
<div sw-acc-bdy><div sw-acc-bdy-in>
<label sw-chk><input type="checkbox" checked> Avisar por e-mail a cada pedido</label>
</div></div>
</div>
</div>
<button type="button" sw-btn="out p" id="ver-trocas">Ver trocas</button>
<div sw-accordion="split" id="detalhes">
<div sw-acc-it class="is-act">…Descrição…</div>
<div sw-acc-it>…Entrega…</div>
<div sw-acc-it>…Trocas…</div>
</div>
<script>
document.getElementById('ver-trocas').addEventListener('click', () => {
SW.Accordion.open('#detalhes', 2); // 0 = primeiro item, 2 = terceiro
});
// saber quando alguém abre um item
document.getElementById('detalhes').addEventListener('sw:accordion:open', (e) => {
console.log('abriu:', e.detail.item.querySelector('[sw-acc-hdr]').textContent);
});
</script>
Eventos
sw:accordion:opensw-acc-it e sobe pela página; event.detail.item é o item.sw:accordion:closeevent.detail.item é o item.API (JavaScript)
SW.Accordion.open(grupo, n)n (0 = primeiro). grupo pode ser o elemento ou um seletor, ex.: '#faq'.Precisa de quê
swcore.min.css— o visual.swcore.min.js— abrir e fechar.swcore.compl.min.css— só se usar íconeswi-*no título.
Cuidados — erros comuns
- Esquecer o
sw-acc-bdy-indentro dosw-acc-bdy: abre, mas o texto fica colado nas bordas. - Para começar aberto, a classe
is-actvai nosw-acc-it(o item), não no título. - Duas palavras de visual juntas (
split card) se atropelam. Escolha um visual + as opçõesplus/multi. - Conteúdo que muda de altura depois de aberto (imagem carregando, por exemplo) funciona: depois de abrir, a altura fica livre.
O que ele não faz
- Não tem
SW.Accordion.close(): para fechar por código, dispare um clique no título (item.querySelector('[sw-acc-hdr]').click()). - Não guarda qual item estava aberto quando a página recarrega.

