SWCore
SWCore / Componentes / Select (JS)

Select (JS) Componentes

Lista de opções bonita e com busca: você digita "per" e aparece "Pernambuco". Com várias escolhas, cada uma vira uma etiqueta com ×.

O que é

É o campo de escolher numa lista ("Estado", "Categoria", "Serviços desejados"), só que melhor que o do navegador: tem busca para listas grandes, a opção escolhida aparece marcada com ✓, e quando a pessoa pode escolher várias, cada escolha vira uma etiqueta que se tira no ×. Você escreve um <select> comum, com as <option> de sempre, e coloca ele dentro de <div sw-select>. O <select> de verdade continua lá, escondido: o formulário envia o valor normalmente.

Precisa do CSS e do JavaScript do SWCore. Ao carregar a página, o SWCore lê as opções do seu <select> e monta a lista nova por cima. Com uma escolha, a busca é o próprio campo: é só clicar e digitar. Com várias (multiple), a busca fica no topo da lista aberta. Cada escolha atualiza o <select> escondido e dispara o evento change normal, então o código que você já tinha continua funcionando.

Quando usar

  • Lista grande (estados, cidades, países, produtos): com busca, que já vem ligada.
  • Várias escolhas ("Quais serviços você quer?"): <select multiple> vira etiquetas.
  • Lista curta (Prioridade: baixa, média, alta): sem busca — sw-select-search="false".
  • Painel admin: escolher categorias e marcas de um produto.
  • Para 2 a 4 opções que cabem lado a lado, o Segmentado é mais rápido de usar. Para uma lista simples sem JavaScript, use <select sw-inp> do Campo de formulário.

Comece aqui

  1. 1

    Coloque o SWCore na página: o CSS no <head> e o JavaScript antes de fechar o </body>.

    <link rel="stylesheet" href="https://swcore.sanweb.com.br/dist/2.1.0/swcore.min.css">
    <!-- … sua página … -->
    <script src="https://swcore.sanweb.com.br/dist/2.1.0/swcore.min.js"></script>
  2. 2

    Coloque o seu <select> dentro de <div sw-select>. O texto de "nada escolhido" vai em sw-select-ph. Clique e digite para buscar.

    <div sw-select>
      <select name="uf" sw-select-ph="Selecione o estado">
        <option value="">Selecione…</option>
        <option value="pe">Pernambuco</option>
        <option value="pb">Paraíba</option>
        <option value="ba">Bahia</option>
        <option value="ce">Ceará</option>
        <option value="sp">São Paulo</option>
      </select>
    </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. Uma escolha

Com busca (padrão), o próprio campo vira a caixa de busca. Sem busca, clicar só abre a lista.

Com busca (padrão) — clique e digite <div sw-select> <select name="cidade" sw-select-ph="Escolha a cidade"> <option value="">Selecione…</option> <option>Recife</option> <option>Olinda</option> <option>Caruaru</option> <option>Petrolina</option> <option>João Pessoa</option> <option>Natal</option> </select> </div>
sw-select-search="false" — sem busca <div sw-select> <select name="prioridade" sw-select-ph="Prioridade" sw-select-search="false"> <option value="b">Baixa</option> <option value="m">Média</option> <option value="a">Alta</option> </select> </div>
Grupos (optgroup) e opção desligada (disabled) <div sw-select> <select name="cidade" sw-select-ph="Escolha a cidade"> <option value="">Selecione…</option> <optgroup label="Pernambuco"> <option>Recife</option> <option>Olinda</option> <option disabled>Fernando de Noronha (esgotado)</option> </optgroup> <optgroup label="Bahia"> <option>Salvador</option> <option>Porto Seguro</option> </optgroup> </select> </div>
Já vem escolhido (selected) <div sw-select> <select name="pagamento" sw-select-search="false"> <option value="pix" selected>Pix</option> <option value="cartao">Cartão de crédito</option> <option value="boleto">Boleto</option> </select> </div>

2. Várias escolhas (multiple)

Com multiple no <select>, a lista fica aberta enquanto a pessoa escolhe, e cada escolha vira uma etiqueta. Clique no × da etiqueta para tirar.

multiple — com busca no topo da lista <div sw-select> <select name="servicos[]" multiple sw-select-ph="Serviços desejados"> <option value="site">Site institucional</option> <option value="loja">Loja virtual</option> <option value="sis">Sistema de gestão</option> <option value="seo">SEO</option> <option value="redes">Redes sociais</option> </select> </div>
multiple — já com escolhas <div sw-select> <select name="tamanhos[]" multiple sw-select-ph="Tamanhos"> <option value="p" selected>P</option> <option value="m" selected>M</option> <option value="g">G</option> <option value="gg">GG</option> </select> </div>
multiple + sem busca <div sw-select> <select name="dias[]" multiple sw-select-ph="Dias de atendimento" sw-select-search="false"> <option>Segunda</option> <option>Terça</option> <option>Quarta</option> <option>Quinta</option> <option>Sexta</option> </select> </div>

3. Estados

Erro e sucesso são classes na <div sw-select> (is-err, is-ok). Coloque-as pelo seu código depois de conferir.

is-err — erro <div sw-select class="is-err"> <select name="categoria" sw-select-ph="Escolha uma categoria" sw-select-search="false"> <option>Roupas</option> <option>Calçados</option> </select> </div>
is-ok — certo <div sw-select class="is-ok"> <select name="categoria" sw-select-search="false"> <option selected>Roupas</option> <option>Calçados</option> </select> </div>

Tabela de opções

PalavraO que fazExemplo
Onde vai cada coisa
sw-selectNa <div> que envolve o <select>. Liga o componente.<div sw-select><select>…</select></div>
sw-select-ph="…"No <select>: texto de "nada escolhido". Se faltar, usa o texto da <option value="">; se não houver, "Selecione…".<select sw-select-ph="Estado">
sw-select-search="false"No <select>: tira a busca. Sem ele, a busca vem ligada.<select sw-select-search="false">
Do próprio HTML (continuam valendo)
multipleVárias escolhas, mostradas como etiquetas com ×. Use name="algo[]" para o servidor receber a lista.<select multiple>
selectedNa <option>: já começa escolhida.<option selected>
value=""Opção vazia: não entra na lista; só serve de texto de "nada escolhido".<option value="">Selecione…</option>
disabledNa <option>: aparece apagada e não pode ser escolhida. Num <optgroup disabled>, vale para o grupo todo.<option disabled>
optgroup label="…"Separa a lista em grupos com título. Na busca, o título some quando nada do grupo sobra.<optgroup label="Nordeste">…</optgroup>
Estados (classe na div sw-select)
is-errBorda e brilho vermelhos.<div sw-select class="is-err">
is-okBorda e brilho verdes.<div sw-select class="is-ok">
Teclado
Enter / EspaçoCom a caixa em foco (modo sem busca ou múltiplo): abre a lista.
EscFecha a lista.

Receitas prontas — usos reais

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

Formulário de orçamento: estado + serviços Ao vivo
<form sw-frm action="/orcamento" method="post">
  <div sw-frm-row>
    <div sw-fld>
      <label>Seu estado</label>
      <div sw-select>
        <select name="uf" sw-select-ph="Selecione">
          <option>Alagoas</option><option>Bahia</option><option>Ceará</option>
          <option>Paraíba</option><option>Pernambuco</option><option>Rio Grande do Norte</option>
        </select>
      </div>
    </div>
    <div sw-fld>
      <label>Prazo</label>
      <div sw-select>
        <select name="prazo" sw-select-ph="Selecione" sw-select-search="false">
          <option>Sem pressa</option><option>Até 30 dias</option><option>Urgente</option>
        </select>
      </div>
    </div>
  </div>
  <div sw-fld>
    <label>O que você precisa?</label>
    <div sw-select>
      <select name="servicos[]" multiple sw-select-ph="Escolha um ou mais">
        <option>Site</option><option>Loja virtual</option>
        <option>Sistema</option><option>Identidade visual</option>
      </select>
    </div>
  </div>
  <div sw-frm-act><button sw-btn="pri" type="submit">Pedir orçamento</button></div>
</form>
Reagir à escolha (mostrar o preço do plano) Ao vivo

Escolha um plano para ver o preço.

<div sw-select id="plano">
  <select name="plano" sw-select-ph="Escolha o plano" sw-select-search="false">
    <option value="49,90">Básico</option>
    <option value="99,90">Profissional</option>
    <option value="199,90">Empresa</option>
  </select>
</div>
<p id="preco">Escolha um plano para ver o preço.</p>

<script>
  document.getElementById('plano').addEventListener('sw:select:change', (e) => {
    // e.detail.value = lista com o(s) valor(es) · e.detail.label = texto da 1ª escolha
    document.getElementById('preco').textContent =
      e.detail.label + ': R$ ' + e.detail.value[0] + '/mês';
  });
</script>
Escolher pelo JavaScript (ex.: vindo do cadastro salvo) Ao vivo
<div sw-select id="uf">
  <select name="uf" sw-select-ph="Estado">
    <option value="pe">Pernambuco</option>
    <option value="ba">Bahia</option>
    <option value="sp">São Paulo</option>
  </select>
</div>

<script>
  SW.Select.set('#uf', 'ba');                        // escolhe Bahia
  const atual = SW.Select.get('#uf');                // 'ba'
</script>

Eventos

sw:select:change
Na <div sw-select>, a cada escolha (também pelo código, com SW.Select.set). e.detail.value é uma lista com os valores escolhidos (mesmo com uma escolha só) e e.detail.label o texto da primeira.
change
Evento normal do navegador, no <select> escondido. O código que você já usava com selects comuns continua funcionando.

API (JavaScript)

SW.Select.set('#id', 'valor')
Escolhe uma opção pelo código (aceita o texto '#id' da div ou o elemento). No múltiplo, marca o valor (se já estava marcado, continua); para trocar a seleção inteira, passe uma lista: SW.Select.set('#id', ['a', 'b']) ([] limpa).
SW.Select.get('#id')
Lê o que está escolhido (o mesmo que div._swSelect.getValue()).
div._swSelect.getValue()
Lê o que está escolhido: o valor (uma escolha) ou a lista de valores (múltiplo).
div._swSelect.setValue('valor')
O mesmo que SW.Select.set, direto no elemento (também aceita lista no múltiplo).

Precisa de quê

  • swcore.min.css e swcore.min.js.

Cuidados — erros comuns

  • sw-select vai na <div> de fora; sw-select-ph e sw-select-search vão no <select> de dentro.
  • O <label for="…"> apontando para o select não abre a lista (o select de verdade está escondido). Use um <label> simples em cima, sem for.
  • No múltiplo, o nome do campo precisa terminar em [] (name="servicos[]") para o PHP receber todas as escolhas, e não só a última.
  • Se você trocar as <option> depois que a página carregou, a lista bonita não se atualiza sozinha: crie o <div sw-select> de novo (um bloco novo inserido na página é montado automaticamente).
  • Em e.detail.value vem sempre uma lista. Para uma escolha só, pegue e.detail.value[0].

O que ele não faz

  • Não navega pela lista com as setas do teclado; a escolha é por clique ou toque (a busca ajuda a chegar rápido).
  • Não tem tamanhos nem estilos (soft, fill…) como o sw-inp: é um visual só.
  • Não busca opções no servidor enquanto digita: a busca filtra só as opções que já estão no HTML.