SWCore
SWCore / Componentes / Dropdown

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. 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 ícones swi-*.

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

Mais vendidos
Menor preço
Maior preço
Só opções <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>
Beatriz Rocha
Perfil
Plano
Sair
sw-dropdown-hdr (título) + sw-dropdown-div (linha) <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>
Perfil
Configurações
Sair
Com ícones (swi-nome) <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>
Opções como links (<a>) <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.

Editar
Cancelar pedido
sw-dropdown-it="dgr" — perigo (vermelho) <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>
Imprimir
Baixar (plano Pro)
sw-dropdown-it="dis" — desativada (apagada, sem clique) <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.

Começa na ponta esquerda
do botão
Padrão — alinhada à esquerda do botão <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>
Termina na ponta direita
do botão
sw-dropdown="rgt" — alinhada à direita do botão <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>
Fundo com um toque
da cor primária
sw-dropdown="tint" — fundo tingido <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.

Imprimir
Baixar como
PDF
Planilha (CSV)
Excel (XLSX)
sw-dropdown-sub <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.

Editar
Duplicar
Excluir
Botão "⋮" só com ícone <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>
Beatriz Rocha
Perfil
Sair
Foto do usuário (avatar) <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>
Português
English
Español
Link de texto <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

PalavraO que fazExemplo
No grupo (palavra no sw-dropdown)
(nenhuma)A lista começa na ponta esquerda do botão.sw-dropdown
rgtA lista termina na ponta direita do botão.sw-dropdown="rgt"
tintFundo 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-tglO botão que abre e fecha.<button sw-dropdown-tgl sw-btn="pri">
sw-dropdown-mnA lista. Filho direto do sw-dropdown.<div sw-dropdown-mn>
sw-dropdown-itUma opção. Pode ser <div>, <a> ou <button>. Clicar fecha a lista.<a href="/perfil" sw-dropdown-it>
sw-dropdown-hdrTítulo de seção (texto pequeno em maiúsculas).<div sw-dropdown-hdr>Conta</div>
sw-dropdown-divLinha divisória.<div sw-dropdown-div></div>
sw-dropdown-subEnvolve uma opção + uma lista de dentro: vira submenu.<div sw-dropdown-sub>
sw-dropdown-arrNo í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)
dgrPerigo: texto vermelho e fundo vermelho claro ao passar o mouse.sw-dropdown-it="dgr"
disDesativada: apagada e sem clique.sw-dropdown-it="dis"
Classe na lista
is-tintO 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-openClasse 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.

Topo do painel: menu do usuário à direita Ao vivo
Doces da Bia · Painel
beatriz@docesdabia.com
Meu perfil Dados da loja
Sair
<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>
Tabela: ações de cada linha (a lista escapa da caixa que corta) Ao vivo
Pedido #1042 · R$ 189,90
Ver detalhes
Imprimir etiqueta
Cancelar pedido
<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>
Reagir à escolha e abrir por código Ao vivo
WhatsApp
E-mail
Copiar link
Escolhido: nada
<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
A lista abriu. Dispara no [sw-dropdown] (o grupo).
sw:dropdown:close
A lista fechou (clique numa opção, clique fora, Esc ou clique no botão).

API (JavaScript)

SW.Dropdown.open(grupo)
Abre a lista. grupo é o elemento [sw-dropdown] ou um seletor ('#compartilhar'). Se já estiver aberta, continua aberta.
SW.Dropdown.close(grupo)
Fecha a lista, se estiver aberta.

Precisa de quê

  • swcore.min.css — o visual.
  • swcore.min.js — abrir, posicionar e fechar.
  • swcore.compl.min.css — os ícones swi-* (seta e ícones das opções).

Cuidados — erros comuns

  • dgr e dis sã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 do sw-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.