Dropdown Componentes
Botão que abre uma lista de opções por cima da página — com títulos, divisórias, item de perigo, submenu, e que nunca fica cortado pela caixa onde está.
O que é
É o menu "Minha conta ▾" (Perfil, Configurações, Sair), o "⋮" de ações numa linha de tabela, ou o "Exportar ▾" com PDF e planilha. A pessoa clica no botão e a lista aparece embaixo dele; escolheu uma opção, clicou fora ou apertou Esc, ela fecha. Você monta com atributos: o grupo (sw-dropdown), o botão (sw-dropdown-tgl), a lista (sw-dropdown-mn) e cada opção (sw-dropdown-it).
O JavaScript do SWCore, ao abrir, leva a lista para o fim da página e a posiciona exatamente embaixo do botão. Por isso ela aparece por cima de tudo, mesmo dentro de um cartão ou tabela que "corta" o que sai para fora. Se não couber embaixo, abre para cima; se não couber à direita, encosta na borda. Quando fecha, volta para o lugar de origem no HTML.
Quando usar
- Menu do usuário no topo do site ou do painel (foto + nome ▾).
- Ações de uma linha de tabela ou de um cartão ("⋮": Editar, Duplicar, Excluir).
- Botão com várias saídas: "Exportar ▾" → PDF, Planilha; "Compartilhar ▾" → WhatsApp, E-mail.
- Para escolher um valor dentro de um formulário, use o Select, não o dropdown.
Comece aqui
-
1
Coloque o SWCore: o CSS no
<head>e o JavaScript no fim do<body>(é ele que abre e posiciona). O terceiro arquivo traz os íconesswi-*.<link rel="stylesheet" href="https://swcore.sanweb.com.br/dist/2.1.0/swcore.min.css"> <link rel="stylesheet" href="https://swcore.sanweb.com.br/dist/2.1.0/swcore.compl.min.css"> <!-- fim do body --> <script src="https://swcore.sanweb.com.br/dist/2.1.0/swcore.min.js"></script> -
2
Escreva o grupo com o botão e a lista. Clique:
<div sw-dropdown> <button sw-dropdown-tgl sw-btn="pri">Minha conta <i class="swi-chevron-down" sw-dropdown-arr></i></button> <div sw-dropdown-mn> <a href="/pedidos" sw-dropdown-it>Meus pedidos</a> <a href="/enderecos" sw-dropdown-it>Endereços</a> <a href="/sair" sw-dropdown-it>Sair</a> </div> </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. O que pode ir dentro da lista
Opções, título de seção, linha divisória e ícones. Clique nos botões para abrir cada lista.
<div sw-dropdown>
<button sw-dropdown-tgl sw-btn="out">Ordenar <i class="swi-chevron-down" sw-dropdown-arr></i></button>
<div sw-dropdown-mn>
<div sw-dropdown-it>Mais vendidos</div>
<div sw-dropdown-it>Menor preço</div>
<div sw-dropdown-it>Maior preço</div>
</div>
</div>
<div sw-dropdown>
<button sw-dropdown-tgl sw-btn="out">Conta <i class="swi-chevron-down" sw-dropdown-arr></i></button>
<div sw-dropdown-mn>
<div sw-dropdown-hdr>Beatriz Rocha</div>
<div sw-dropdown-it>Perfil</div>
<div sw-dropdown-it>Plano</div>
<div sw-dropdown-div></div>
<div sw-dropdown-it>Sair</div>
</div>
</div>
<div sw-dropdown>
<button sw-dropdown-tgl sw-btn="out">Opções <i class="swi-chevron-down" sw-dropdown-arr></i></button>
<div sw-dropdown-mn>
<div sw-dropdown-it><i class="swi swi-user"></i> Perfil</div>
<div sw-dropdown-it><i class="swi swi-cog"></i> Configurações</div>
<div sw-dropdown-it><i class="swi swi-log-out"></i> Sair</div>
</div>
</div>
<div sw-dropdown>
<button sw-dropdown-tgl sw-btn="out">Ajuda <i class="swi-chevron-down" sw-dropdown-arr></i></button>
<div sw-dropdown-mn>
<a href="#" sw-dropdown-it>Central de ajuda</a>
<a href="#" sw-dropdown-it>Falar no WhatsApp</a>
</div>
</div>
2. Tipos de opção
Palavras dentro do sw-dropdown-it mudam a opção.
<div sw-dropdown>
<button sw-dropdown-tgl sw-btn="out">Pedido <i class="swi-chevron-down" sw-dropdown-arr></i></button>
<div sw-dropdown-mn>
<div sw-dropdown-it><i class="swi swi-edit"></i> Editar</div>
<div sw-dropdown-div></div>
<div sw-dropdown-it="dgr"><i class="swi swi-trash"></i> Cancelar pedido</div>
</div>
</div>
<div sw-dropdown>
<button sw-dropdown-tgl sw-btn="out">Relatório <i class="swi-chevron-down" sw-dropdown-arr></i></button>
<div sw-dropdown-mn>
<div sw-dropdown-it><i class="swi swi-printer"></i> Imprimir</div>
<div sw-dropdown-it="dis"><i class="swi swi-download"></i> Baixar (plano Pro)</div>
</div>
</div>
3. Alinhamento e cor da lista
Por padrão a lista começa na ponta esquerda do botão. rgt alinha pela ponta direita (bom para o último item do topo da página). tint (sw-dropdown="tint") dá à lista um fundo levemente colorido.
<div sw-dropdown>
<button sw-dropdown-tgl sw-btn="sec">Esquerda <i class="swi-chevron-down" sw-dropdown-arr></i></button>
<div sw-dropdown-mn>
<div sw-dropdown-it>Começa na ponta esquerda</div>
<div sw-dropdown-it>do botão</div>
</div>
</div>
<div sw-dropdown="rgt">
<button sw-dropdown-tgl sw-btn="sec">Direita <i class="swi-chevron-down" sw-dropdown-arr></i></button>
<div sw-dropdown-mn>
<div sw-dropdown-it>Termina na ponta direita</div>
<div sw-dropdown-it>do botão</div>
</div>
</div>
<div sw-dropdown="tint">
<button sw-dropdown-tgl sw-btn="pri">Tingido <i class="swi-chevron-down" sw-dropdown-arr></i></button>
<div sw-dropdown-mn>
<div sw-dropdown-it>Fundo com um toque</div>
<div sw-dropdown-it>da cor primária</div>
</div>
</div>
4. Submenu
Uma opção pode abrir outra lista ao passar o mouse (ou ao receber foco). Envolva a opção e a lista de dentro com sw-dropdown-sub. A setinha › aparece sozinha; se não couber à direita, a lista de dentro abre à esquerda.
<div sw-dropdown>
<button sw-dropdown-tgl sw-btn="pri">Exportar <i class="swi-chevron-down" sw-dropdown-arr></i></button>
<div sw-dropdown-mn>
<div sw-dropdown-it><i class="swi swi-printer"></i> Imprimir</div>
<div sw-dropdown-sub>
<div sw-dropdown-it><i class="swi swi-download"></i> Baixar como</div>
<div sw-dropdown-mn>
<div sw-dropdown-it>PDF</div>
<div sw-dropdown-it>Planilha (CSV)</div>
<div sw-dropdown-it>Excel (XLSX)</div>
</div>
</div>
</div>
</div>
5. Tipos de botão
O gatilho pode ser qualquer coisa com sw-dropdown-tgl: botão com texto, botão só com ícone, ou a foto do usuário. O ícone com sw-dropdown-arr gira quando a lista abre.
<div sw-dropdown="rgt">
<button sw-dropdown-tgl sw-btn="ghost rnd" aria-label="Ações"><i class="swi-dots-vertical-rounded"></i></button>
<div sw-dropdown-mn>
<div sw-dropdown-it><i class="swi swi-edit"></i> Editar</div>
<div sw-dropdown-it><i class="swi swi-copy"></i> Duplicar</div>
<div sw-dropdown-it="dgr"><i class="swi swi-trash"></i> Excluir</div>
</div>
</div>
<div sw-dropdown="rgt">
<button sw-dropdown-tgl sw-btn="ghost" aria-label="Menu do usuário"><span sw-avt="p onl">BR</span> <i class="swi-chevron-down" sw-dropdown-arr></i></button>
<div sw-dropdown-mn>
<div sw-dropdown-hdr>Beatriz Rocha</div>
<div sw-dropdown-it><i class="swi swi-user"></i> Perfil</div>
<div sw-dropdown-it><i class="swi swi-log-out"></i> Sair</div>
</div>
</div>
<div sw-dropdown>
<button sw-dropdown-tgl sw-btn="ghost p">Português <i class="swi-chevron-down" sw-dropdown-arr></i></button>
<div sw-dropdown-mn>
<div sw-dropdown-it>Português</div>
<div sw-dropdown-it>English</div>
<div sw-dropdown-it>Español</div>
</div>
</div>
Tabela de opções
| Palavra | O que faz | Exemplo |
|---|---|---|
| No grupo (palavra no sw-dropdown) | ||
(nenhuma) | A lista começa na ponta esquerda do botão. | sw-dropdown |
rgt | A lista termina na ponta direita do botão. | sw-dropdown="rgt" |
tint | Fundo da lista levemente tingido com a cor primária (vale também nos submenus). Combina: sw-dropdown="rgt tint". | sw-dropdown="tint" |
| Partes (atributos) | ||
sw-dropdown-tgl | O botão que abre e fecha. | <button sw-dropdown-tgl sw-btn="pri"> |
sw-dropdown-mn | A lista. Filho direto do sw-dropdown. | <div sw-dropdown-mn> |
sw-dropdown-it | Uma opção. Pode ser <div>, <a> ou <button>. Clicar fecha a lista. | <a href="/perfil" sw-dropdown-it> |
sw-dropdown-hdr | Título de seção (texto pequeno em maiúsculas). | <div sw-dropdown-hdr>Conta</div> |
sw-dropdown-div | Linha divisória. | <div sw-dropdown-div></div> |
sw-dropdown-sub | Envolve uma opção + uma lista de dentro: vira submenu. | <div sw-dropdown-sub> |
sw-dropdown-arr | No ícone de seta do botão: gira quando a lista abre. | <i class="swi-chevron-down" sw-dropdown-arr></i> |
| Tipo de opção (palavra no sw-dropdown-it) | ||
dgr | Perigo: texto vermelho e fundo vermelho claro ao passar o mouse. | sw-dropdown-it="dgr" |
dis | Desativada: apagada e sem clique. | sw-dropdown-it="dis" |
| Classe na lista | ||
is-tint | O mesmo que sw-dropdown="tint", escrito direto na lista (forma antiga, continua valendo). | <div sw-dropdown-mn class="is-tint"> |
| Automático (escrito pelo JS) | ||
is-open | Classe no grupo e na lista enquanto está aberta. Serve para você estilizar. | |
data-sw-flip="up" | Aparece na lista quando ela abriu para cima. | |
Receitas prontas — usos reais
Situações que aparecem em quase todo site. Copie a que servir.
<header class="flx j-sb alc gap-3">
<strong>Doces da Bia · Painel</strong>
<div sw-dropdown="rgt">
<button sw-dropdown-tgl sw-btn="ghost" aria-label="Menu do usuário">
<span sw-avt="p">BR</span> Beatriz <i class="swi-chevron-down" sw-dropdown-arr></i>
</button>
<div sw-dropdown-mn>
<div sw-dropdown-hdr>beatriz@docesdabia.com</div>
<a href="/perfil" sw-dropdown-it><i class="swi swi-user"></i> Meu perfil</a>
<a href="/loja" sw-dropdown-it><i class="swi swi-store"></i> Dados da loja</a>
<div sw-dropdown-div></div>
<a href="/sair" sw-dropdown-it="dgr"><i class="swi swi-log-out"></i> Sair</a>
</div>
</div>
</header>
<td>
<div sw-dropdown="rgt">
<button sw-dropdown-tgl sw-btn="ghost rnd p" aria-label="Ações do pedido">
<i class="swi-dots-vertical-rounded"></i>
</button>
<div sw-dropdown-mn>
<div sw-dropdown-it><i class="swi swi-show"></i> Ver detalhes</div>
<div sw-dropdown-it><i class="swi swi-printer"></i> Imprimir etiqueta</div>
<div sw-dropdown-div></div>
<div sw-dropdown-it="dgr"><i class="swi swi-x-circle"></i> Cancelar pedido</div>
</div>
</div>
</td>
<div sw-dropdown id="compartilhar">
<button sw-dropdown-tgl sw-btn="out">Compartilhar <i class="swi-chevron-down" sw-dropdown-arr></i></button>
<div sw-dropdown-mn>
<div sw-dropdown-it data-canal="whatsapp"><i class="swi swi-share-alt"></i> WhatsApp</div>
<div sw-dropdown-it data-canal="email"><i class="swi swi-envelope"></i> E-mail</div>
</div>
</div>
<script>
// a lista vai para o fim da página quando abre: ouça no document
document.addEventListener('click', (e) => {
const it = e.target.closest('[data-canal]');
if (it) console.log('escolheu', it.dataset.canal);
});
document.getElementById('compartilhar').addEventListener('sw:dropdown:open', () => {
console.log('abriu');
});
SW.Dropdown.open('#compartilhar'); // abre por código
SW.Dropdown.close('#compartilhar'); // fecha por código
</script>
Eventos
sw:dropdown:open[sw-dropdown] (o grupo).sw:dropdown:closeAPI (JavaScript)
SW.Dropdown.open(grupo)grupo é o elemento [sw-dropdown] ou um seletor ('#compartilhar'). Se já estiver aberta, continua aberta.SW.Dropdown.close(grupo)Precisa de quê
swcore.min.css— o visual.swcore.min.js— abrir, posicionar e fechar.swcore.compl.min.css— os íconesswi-*(seta e ícones das opções).
Cuidados — erros comuns
dgredissão palavras DENTRO do atributo:sw-dropdown-it="dgr". Como classe (class="dgr") não funciona.- A lista vai para o fim da página enquanto está aberta. Um CSS seu do tipo
.meu-card [sw-dropdown-mn]deixa de valer nessa hora — estilize pela própria lista (dê uma classe a ela). - A lista (
sw-dropdown-mn) tem que ser filha direta dosw-dropdown. Embrulhada em outra div, o botão não abre nada.
O que ele não faz
- Não dá para andar pelas opções com as setas do teclado; o Esc fecha. Para as opções receberem o Tab, escreva-as como
<a href>ou<button>. - Submenu abre no passar do mouse ou no foco — no celular, prefira listas sem submenu.
- Abre só no clique, não ao passar o mouse sobre o botão.

