SWCore
SWCore / CSS / Segmentado

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

    Escreva os pares input + rótulo dentro de <div sw-seg>. O checked diz 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.

Padrão — com moldura <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>
ghost — sem moldura, sublinhado <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>
Três opções <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>
Com ícone <div sw-seg> <input type="radio" name="vista" id="v-grade" checked> <label for="v-grade"><i class="swi-grid-alt"></i>&nbsp;Grade</label> <input type="radio" name="vista" id="v-lista"> <label for="v-lista"><i class="swi-list-ul"></i>&nbsp;Lista</label> </div>

2. Tamanhos

Sem palavra de tamanho ele fica no médio.

p — pequeno <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>
Padrão — médio <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>
g — grande <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".

fl — duas opções
<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>
fl + ghost — abas simples
<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.

seg-it + is-act em links <div sw-seg> <a class="seg-it is-act" href="?status=abertos">Abertos</a> <a class="seg-it" href="?status=fechados">Fechados</a> </div>
seg-it + is-act, ghost <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

PalavraO que fazExemplo
Estilo
(nenhum)Moldura com fundo; opção marcada cheia na cor primária.<div sw-seg>
ghostSem 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>
flLargura toda; opções com class="seg-it" dividem o espaço igualmente.<div sw-seg="fl">
Tamanho
pPequeno — para filtros de painel.<div sw-seg="p">
(nenhum)Médio (padrão).
gGrande — para a escolha principal da tela.<div sw-seg="g">
Peças
input type="radio" + labelCada 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-itClasse da opção. Obrigatória com fl (para dividir igual) e em links.<label class="seg-it" for="m">
is-actMarca 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.

Tabela de preços: Mensal / Anual troca o valor Ao vivo
R$ 49,90/mês
<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>
Dentro de um formulário: tipo de cadastro Ao vivo
<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>
Filtro de pedidos no painel (links) Ao vivo
<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
Evento normal do navegador: dispara no <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 ícone swi-* 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 for do rótulo tem que ser igual ao id do 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, esquecer class="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 o is-act no 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 disabled nã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. No ghost não tem cápsula (só o sublinhado).