Segmentado CSS
Opções coladas lado a lado em que só uma fica marcada — "Mensal | Anual", "Grade | Lista", "Dia | Semana | Mês".
O que é
É aquele interruptor de várias posições: a pessoa escolhe uma opção e as outras se desmarcam. Serve para trocar o modo de ver alguma coisa (grade ou lista), o período de um preço (mensal ou anual) ou um filtro rápido (todos, abertos, fechados). Por baixo são botões de opção comuns do HTML (<input type="radio">) — então funciona em qualquer formulário, no teclado e em leitor de tela, e a escolha é enviada junto com o formulário.
O CSS já marca a opção escolhida com o fundo na cor primária. Com o JavaScript do SWCore, esse fundo vira uma cápsula que desliza de uma opção para a outra (sem JS, ela só troca na hora). Você escreve, dentro de <div sw-seg>, pares de <input type="radio"> + <label>. O input fica invisível; quem aparece é o rótulo. Todos os inputs do grupo precisam do mesmo name e cada um de um id próprio, ligado ao for do seu rótulo.
Quando usar
- Tabela de preços: "Mensal | Anual" no topo, trocando os valores.
- Modo de exibição de uma lista de produtos ou arquivos: "Grade | Lista".
- Filtro rápido no painel: "Todos | Pendentes | Pagos".
- Período de relatório: "Dia | Semana | Mês".
- Até umas 4 opções curtas. Com mais opções ou textos longos, use um Select ou um grupo de rádios comuns (Campo de formulário).
Comece aqui
-
1
Coloque o SWCore no
<head>da página (uma vez só). O segmentado só precisa do CSS principal.<link rel="stylesheet" href="https://swcore.sanweb.com.br/dist/2.1.0/swcore.min.css"> -
2
Escreva os pares input + rótulo dentro de
<div sw-seg>. Ocheckeddiz qual começa marcado.<div sw-seg> <input type="radio" name="plano" id="plano-mensal" value="mensal" checked> <label for="plano-mensal">Mensal</label> <input type="radio" name="plano" id="plano-anual" value="anual"> <label for="plano-anual">Anual</label> </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. Estilos
Sem valor, o grupo vem numa moldura com fundo, e a opção marcada fica cheia na cor primária. Com ghost a moldura some e a marcada ganha só um sublinhado.
<div sw-seg>
<input type="radio" name="vista" id="v-grade" checked><label for="v-grade">Grade</label>
<input type="radio" name="vista" id="v-lista"><label for="v-lista">Lista</label>
</div>
<div sw-seg="ghost">
<input type="radio" name="vista" id="v-grade" checked><label for="v-grade">Grade</label>
<input type="radio" name="vista" id="v-lista"><label for="v-lista">Lista</label>
</div>
<div sw-seg>
<input type="radio" name="periodo" id="p-dia"><label for="p-dia">Dia</label>
<input type="radio" name="periodo" id="p-sem" checked><label for="p-sem">Semana</label>
<input type="radio" name="periodo" id="p-mes"><label for="p-mes">Mês</label>
</div>
<div sw-seg>
<input type="radio" name="vista" id="v-grade" checked>
<label for="v-grade"><i class="swi-grid-alt"></i> Grade</label>
<input type="radio" name="vista" id="v-lista">
<label for="v-lista"><i class="swi-list-ul"></i> Lista</label>
</div>
2. Tamanhos
Sem palavra de tamanho ele fica no médio.
<div sw-seg="p">
<input type="radio" name="filtro" id="f-todos" checked><label for="f-todos">Todos</label>
<input type="radio" name="filtro" id="f-pagos"><label for="f-pagos">Pagos</label>
</div>
<div sw-seg>
<input type="radio" name="filtro" id="f-todos" checked><label for="f-todos">Todos</label>
<input type="radio" name="filtro" id="f-pagos"><label for="f-pagos">Pagos</label>
</div>
<div sw-seg="g">
<input type="radio" name="filtro" id="f-todos" checked><label for="f-todos">Todos</label>
<input type="radio" name="filtro" id="f-pagos"><label for="f-pagos">Pagos</label>
</div>
3. Largura cheia
Com fl o grupo ocupa a largura toda e as opções dividem o espaço em partes iguais. Para dividir igual, cada rótulo precisa de class="seg-it".
<div sw-seg="fl">
<input type="radio" name="tipo" id="t-pf" value="pf" checked>
<label class="seg-it" for="t-pf">Pessoa física</label>
<input type="radio" name="tipo" id="t-pj" value="pj">
<label class="seg-it" for="t-pj">Empresa</label>
</div>
<div sw-seg="fl ghost">
<input type="radio" name="aba" id="a-desc" checked><label class="seg-it" for="a-desc">Descrição</label>
<input type="radio" name="aba" id="a-med"><label class="seg-it" for="a-med">Medidas</label>
<input type="radio" name="aba" id="a-aval"><label class="seg-it" for="a-aval">Avaliações</label>
</div>
4. Com links (sem formulário)
Quando cada opção leva para outro endereço (ex.: ?vista=lista), use links com class="seg-it" e marque o atual com is-act. Aqui quem marca é o seu servidor, ao montar a página.
<div sw-seg>
<a class="seg-it is-act" href="?status=abertos">Abertos</a>
<a class="seg-it" href="?status=fechados">Fechados</a>
</div>
<div sw-seg="ghost">
<a class="seg-it" href="?dias=1">Hoje</a>
<a class="seg-it is-act" href="?dias=7">7 dias</a>
<a class="seg-it" href="?dias=30">30 dias</a>
</div>
Tabela de opções
| Palavra | O que faz | Exemplo |
|---|---|---|
| Estilo | ||
(nenhum) | Moldura com fundo; opção marcada cheia na cor primária. | <div sw-seg> |
ghost | Sem moldura nem fundo; a marcada fica na cor primária com sublinhado. | <div sw-seg="ghost"> |
| Largura | ||
(nenhuma) | Do tamanho do conteúdo. | <div sw-seg> |
fl | Largura toda; opções com class="seg-it" dividem o espaço igualmente. | <div sw-seg="fl"> |
| Tamanho | ||
p | Pequeno — para filtros de painel. | <div sw-seg="p"> |
(nenhum) | Médio (padrão). | |
g | Grande — para a escolha principal da tela. | <div sw-seg="g"> |
| Peças | ||
input type="radio" + label | Cada opção. Mesmo name no grupo; id do input igual ao for do rótulo. checked = começa marcada. | <input type="radio" name="plano" id="m" checked><label for="m">Mensal</label> |
seg-it | Classe da opção. Obrigatória com fl (para dividir igual) e em links. | <label class="seg-it" for="m"> |
is-act | Marca como escolhida uma opção que não é radio (link). Com radio, quem marca é o checked. | <a class="seg-it is-act" href="…"> |
Receitas prontas — usos reais
Situações que aparecem em quase todo site. Copie a que servir.
<div sw-seg id="plano">
<input type="radio" name="plano" id="p-m" value="mensal" checked><label for="p-m">Mensal</label>
<input type="radio" name="plano" id="p-a" value="anual"><label for="p-a">Anual (-20%)</label>
</div>
<strong id="preco">R$ 49,90/mês</strong>
<script>
document.getElementById('plano').addEventListener('change', (e) => {
document.getElementById('preco').textContent =
e.target.value === 'anual' ? 'R$ 479,00/ano' : 'R$ 49,90/mês';
});
</script>
<form action="/cadastro" method="post">
<div sw-seg="fl">
<input type="radio" name="tipo" id="t-pf" value="pf" checked>
<label class="seg-it" for="t-pf">Pessoa física</label>
<input type="radio" name="tipo" id="t-pj" value="pj">
<label class="seg-it" for="t-pj">Empresa</label>
</div>
<!-- o formulário envia tipo=pf ou tipo=pj -->
<div sw-fld>
<label for="doc">CPF ou CNPJ</label>
<input sw-inp id="doc" name="doc" sw-mask="document" placeholder="Só os números">
</div>
</form>
<div sw-seg="p">
<a class="seg-it is-act" href="/pedidos">Todos</a>
<a class="seg-it" href="/pedidos?status=pendente">Pendentes</a>
<a class="seg-it" href="/pedidos?status=pago">Pagos</a>
<a class="seg-it" href="/pedidos?status=cancelado">Cancelados</a>
</div>
Eventos
change<div sw-seg> (ele sobe dos inputs) quando a pessoa troca de opção. e.target.value é o valor escolhido.Precisa de quê
swcore.min.css— o segmentado.swcore.min.js— opcional: faz a cápsula deslizar entre as opções.swcore.compl.min.css— só se usar íconeswi-*nos rótulos.
Cuidados — erros comuns
- Todos os inputs do grupo precisam do mesmo
name. Com nomes diferentes, dá para marcar vários ao mesmo tempo. - O
fordo rótulo tem que ser igual aoiddo input, e o input vem logo antes do seu rótulo. Fora dessa ordem, clicar não marca. - Dois segmentados na mesma página não podem repetir
ids. - Com
fl, esquecerclass="seg-it"nos rótulos faz as opções ficarem de larguras diferentes. - Em links com
is-act, clicar não troca a marcação sozinho: a página seguinte é que tem que vir com ois-actno link certo.
O que ele não faz
- Não tem cores além da primária.
- Não tem aparência de opção desativada: um radio com
disablednão fica apagado, só deixa de responder ao clique. - A cápsula que desliza precisa do
swcore.min.js; sem ele a opção marcada troca de cor na hora. Noghostnão tem cápsula (só o sublinhado).

