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
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
Coloque o seu
<select>dentro de<div sw-select>. O texto de "nada escolhido" vai emsw-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.
<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>
<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>
<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>
<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.
<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>
<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>
<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.
<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>
<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
| Palavra | O que faz | Exemplo |
|---|---|---|
| Onde vai cada coisa | ||
sw-select | Na <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) | ||
multiple | Várias escolhas, mostradas como etiquetas com ×. Use name="algo[]" para o servidor receber a lista. | <select multiple> |
selected | Na <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> |
disabled | Na <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-err | Borda e brilho vermelhos. | <div sw-select class="is-err"> |
is-ok | Borda e brilho verdes. | <div sw-select class="is-ok"> |
| Teclado | ||
Enter / Espaço | Com a caixa em foco (modo sem busca ou múltiplo): abre a lista. | |
Esc | Fecha a lista. | |
Receitas prontas — usos reais
Situações que aparecem em quase todo site. Copie a que servir.
<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>
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>
<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<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<select> escondido. O código que você já usava com selects comuns continua funcionando.API (JavaScript)
SW.Select.set('#id', 'valor')'#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')div._swSelect.getValue()).div._swSelect.getValue()div._swSelect.setValue('valor')SW.Select.set, direto no elemento (também aceita lista no múltiplo).Precisa de quê
swcore.min.csseswcore.min.js.
Cuidados — erros comuns
sw-selectvai na<div>de fora;sw-select-phesw-select-searchvã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, semfor. - 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.valuevem sempre uma lista. Para uma escolha só, peguee.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.

