Switch

Switches são controles usados para alternar rapidamente entre dois estados possíveis. São usados ​​apenas para ações binárias que ocorrem imediatamente após o usuário “girar” o botão de alternância. São comumente usados ​​para interruptores “liga/desliga”.

Switch Padrão


<div class="br-switch" role="presentation">
  <input id="switch-default" type="checkbox" name="switch-default" checked="checked" role="switch"/>
  <label for="switch-default">Label</label>
</div>

Alinhamentos


<div class="row">
  <div class="col-md">
    <div class="br-switch mr-5" role="presentation">
      <input id="switch-left" type="checkbox" name="switch-left" checked="checked" role="switch"/>
      <label for="switch-left">Label na esquerda</label>
    </div>
  </div>
  <div class="col-md mt-3 mt-md-0">
    <div class="br-switch right mr-5" role="presentation">
      <input id="switch-right" type="checkbox" name="switch-right" checked="checked" role="switch"/>
      <label for="switch-right">Label na direita</label>
    </div>
  </div>
  <div class="col-md mt-3 mt-md-0">
    <div class="br-switch top mr-5" role="presentation">
      <input id="switch-top" type="checkbox" name="switch-top" checked="checked" role="switch"/>
      <label for="switch-top">Label no topo</label>
    </div>
  </div>
</div>

Com ícone


<div class="br-switch icon" role="presentation">
  <input id="switch-icon" type="checkbox" name="switch-icon" checked="checked" role="switch"/>
  <label for="switch-icon">Label</label>
</div>

Com rótulos adicionais


<div class="row">
  <div class="col-md">
    <div class="br-switch medium" role="presentation">
      <input id="switch-label-01" type="checkbox" name="switch-label-01" checked="checked" role="switch"/>
      <label for="switch-label-01">Label do switch</label>
      <div class="switch-data" data-enabled="Ligado" data-disabled="Desligado"></div>
    </div>
  </div>
  <div class="col-md mt-3 mt-md-0">
    <div class="br-switch medium" role="presentation">
      <input id="switch-label-02" type="checkbox" name="switch-label-02" checked="checked" role="switch"/>
      <label for="switch-label-02">Label do switch</label>
      <div class="switch-data" data-enabled="Concordo" data-disabled="Discordo"></div>
    </div>
  </div>
</div>

Densidades


<div class="row">
  <div class="col-md">
    <div class="br-switch small mr-5" role="presentation">
      <input id="switch-small" type="checkbox" name="switch-small" checked="checked" role="switch"/>
      <label for="switch-small">Densidade Alta</label>
    </div>
  </div>
  <div class="col-md mt-3 mt-md-0">
    <div class="br-switch medium" role="presentation">
      <input id="switch-medium" type="checkbox" name="switch-medium" checked="checked" role="switch"/>
      <label for="switch-medium">Densidade Média (Padrão)</label>
    </div>
  </div>
  <div class="col-md mt-3 mt-md-0">
    <div class="br-switch large mr-5" role="presentation">
      <input id="switch-large" type="checkbox" name="switch-large" checked="checked" role="switch"/>
      <label for="switch-large">Densidade Baixa</label>
    </div>
  </div>
</div>

Código compartilhado entre exemplos

.br-switch {
  --switch-height: var(--switch-height-medium);
  --switch-width: var(--switch-width-medium);
  --switch-toggle-size: var(--switch-toggle-medium);
  --switch-icon-size: var(--switch-icon-medium);
  --switch-height-small: 24px;
  --switch-height-medium: 30px;
  --switch-height-large: 36px;
  --switch-width-small: 40px;
  --switch-width-medium: 52px;
  --switch-width-large: 64px;
  --switch-toggle-small: 16px;
  --switch-toggle-medium: 22px;
  --switch-toggle-large: 28px;
  --switch-icon-small: var(--icon-size-xs);
  --switch-icon-medium: var(--icon-size-sm);
  --switch-icon-large: var(--icon-size-base);
  display: inline-flex;
  min-height: var(--switch-height);
  /* stylelint-disable no-descending-specificity */
  /* stylelint-enable no-descending-specificity */
}
.br-switch input {
  opacity: 0;
  position: absolute;
}
.br-switch input + label {
  align-items: center;
  color: var(--color);
  cursor: pointer;
  display: inline-flex;
  font-size: var(--font-size-scale-base);
  margin-bottom: 0;
  position: relative;
}
.br-switch input + label::before {
  background: var(--background-light);
  border: 1px solid var(--border-color);
  border-radius: 100em;
  content: "";
  height: var(--switch-height);
  position: absolute;
  width: var(--switch-width);
}
.br-switch input + label::after {
  background-color: var(--off);
  border-radius: 50%;
  content: "";
  height: var(--switch-toggle-size);
  position: absolute;
  transition: all 0.3s ease-in-out;
  width: var(--switch-toggle-size);
}
.br-switch input:checked + label::after {
  background-color: var(--on);
}
.br-switch input + label {
  padding-right: calc(var(--spacing-scale-2x) + var(--switch-width));
}
.br-switch input + label:empty {
  padding-right: var(--switch-width);
}
.br-switch input + label::before {
  right: 0;
}
.br-switch input + label::after {
  right: calc(4px + var(--switch-toggle-size));
}
.br-switch input:checked + label::after {
  right: 4px;
}
.br-switch.right input + label {
  padding-left: calc(var(--spacing-scale-2x) + var(--switch-width));
  padding-right: 0;
}
.br-switch.right input + label::before {
  left: 0;
}
.br-switch.right input + label::after {
  left: 4px;
}
.br-switch.right input:checked + label::after {
  left: calc(var(--switch-width) - var(--switch-toggle-size) - 4px);
}
.br-switch.top {
  min-height: calc(var(--switch-height) * 2);
}
.br-switch.top input + label {
  align-items: flex-start;
  padding-right: 0;
}
.br-switch.top input + label::before {
  bottom: 0;
  left: 0;
}
.br-switch.top input + label::after {
  bottom: 4px;
  left: 4px;
}
.br-switch.top input:checked + label::after {
  left: calc(var(--switch-width) - var(--switch-toggle-size) - 4px);
}
.br-switch.small {
  --switch-height: var(--switch-height-small);
  --switch-width: var(--switch-width-small);
  --switch-toggle-size: var(--switch-toggle-small);
  --switch-icon-size: var(--switch-icon-small);
}
.br-switch.medium {
  --switch-height: var(--switch-height-medium);
  --switch-width: var(--switch-width-medium);
  --switch-toggle-size: var(--switch-toggle-medium);
  --switch-icon-size: var(--switch-icon-medium);
}
.br-switch.large {
  --switch-height: var(--switch-height-large);
  --switch-width: var(--switch-width-large);
  --switch-toggle-size: var(--switch-toggle-large);
  --switch-icon-size: var(--switch-icon-large);
}
.br-switch input ~ .switch-data {
  align-self: center;
  color: var(--color);
  font-size: var(--font-size-scale-base);
  font-weight: var(--font-weight-regular);
  margin-left: 8px;
}
.br-switch input ~ .switch-data::before {
  content: attr(data-disabled);
}
.br-switch input:checked ~ .switch-data {
  color: var(--color);
}
.br-switch input:checked ~ .switch-data::before {
  content: attr(data-enabled);
}
.br-switch.icon input + label::after {
  align-items: center;
  color: var(--color-dark);
  content: "\f00d";
  display: inline-flex;
  font-family: "Font Awesome 5 Free", sans-serif;
  font-size: var(--switch-icon-size);
  font-weight: var(--font-weight-black);
  justify-content: center;
}
.br-switch.icon input:checked + label::after {
  content: "\f00c";
}
.br-switch input:focus-visible + label::before,
.br-switch input.focus-visible + label::before {
  border-color: var(--focus) !important;
  box-shadow: 0 0 0 var(--surface-width-md) var(--focus);
  outline: none;
}
.br-switch input:hover:not([disabled]):checked + label::before {
  background-image: linear-gradient(rgba(var(--on-rgb), var(--hover)), rgba(var(--on-rgb), var(--hover)));
}
.br-switch input:hover:not([disabled]):not(:checked) + label::before {
  background-image: linear-gradient(rgba(var(--off-rgb), var(--hover)), rgba(var(--off-rgb), var(--hover)));
}
.br-switch input:active:not([disabled]):checked + label::before {
  background-image: linear-gradient(rgba(var(--on-rgb), var(--pressed)), rgba(var(--on-rgb), var(--pressed)));
}
.br-switch input:active:not([disabled]):not(:checked) + label::before {
  background-image: linear-gradient(rgba(var(--off-rgb), var(--pressed)), rgba(var(--off-rgb), var(--pressed)));
}
.br-switch.inverted,
.br-switch.inverted label, .br-switch.dark-mode,
.br-switch.dark-mode label {
  color: var(--color-dark);
}

/*# sourceMappingURL=switch.css.map*/

Como usar

Propriedades obrigatórias

Atributo Tipo Valor padrão Descrição
class string br-switch Container do componente

Propriedades Adicionais

Atributo Tipo Valor Padrão Descrição
class string right ou top Modifica alinhamento do label
class string icon Adiciona ícone na chave de alternância (switch toggle)
class string small, medium, ou large Modifica densidade do componente

Estados

Estado atributo Valores
Desativado class disabled

Informações adicionais

Switch com rótulos adicionais

Para o rótulo adiciona use a classe switch-data. Os textos de ligado e desligado devem ficar em atributos data-*:

  • data-enabled: é mostrado quando o componente está “ligado”
  • data-disabled: é mostrado quando o componente está “desligado”
Esta informação foi útil?

Gostaria de enviar mais detalhes sobre seu feedback?

Selecione a opção que melhor descreve sua insatisfação:


Exemplo de componente switch.
Exemplo do componente switch.

Utilize switches para ajudar usuários a atualizar preferências, configurações e outros tipos de informação que envolvam uma escolha entre duas seleções e os resultados são eficazes e visíveis imediatamente não havendo necessidade de o usuário clicar em um botão de envio.


Anatomia

ID Nome Referência Uso
1 Label Tipografia Opcional
2 container Superfície Obrigatório
3 Chave de alternância Obrigatório
4 Rótulo Tipografia Opcional
5 Ícone Iconografia Opcional

Anatomia do componente switch.
Anatomia do componente switch.


Detalhamento dos Itens

1. Label (Opcional)

Labels são itens opcionais. Muitas vezes switches podem funcionar adequadamente sem labels, porém, se houver necessidade de deixar o entendimento mais claro, não hesite em utilizar labels que devem descrever concisamente o que o componente faz quando a alternância estiver ativada.

O label pode estar localizado à esquerda, à direita ou acima do switch e a distância entre o label e o switch pode ser determinado pelo layout da tela. Uma vez definido como serão aplicados os labels em seu produto, mantenha sempre a consistência.

Possíveis posicionamentos do label em relação ao switch.
Labels podem estar localizados em diversas posições em relação ao switch para melhor se adequar ao layout da página.

2. Container (Obrigatório)

Container é o espaço que contem a chave de alternância e limita as duas posições aceitáveis para a escolha do usuário.

3. Chave de alternância (Obrigatório)

Chave de alternância é simplesmente o sinalizador que alterna as posições ligado/desligado. Embora o usuário possa interagir clicando em qualquer parte do switch, é por meio da chave que o usuário tem o feedback da ação realizada.

4. Rótulo (Opcional)

Rótulo são itens opcionais que ajudam a esclarecer as duas possibilidades de escolha do usuário. É recomendável usar rótulos quando for necessário dar maior visibilidade das opções disponíveis.

Rótulos favorecem a usabilidade, pois auxiliam no entendimento da posição em que a chave se encontra.

Exemplo de uso de rótulos no switch.
Use rótulos curtos e concisos.

5. Ícone (Opcional)

Ícones podem ser utilizados opcionalmente para reforçar a opção escolhida pelo usuário. Neste caso, a usabilidade é potencializada, pois além da cor e da posição, o ícone auxilia semanticamente a posição que a chave de alternância se encontra.

Exemplo de uso de ícone na chave de alternância.
Ícones podem auxiliar a leitura das posições ligado/desligado.


Comportamentos

1. Densidades

O componente switch possui três densidades. Quanto menor for a densidade, maior a área de interação.

Exemplos de possíveis densidades para o componente switch.
Exemplos das possíveis densidades do componente switch.

2. Área interativa

O componente switch pode ser interativo em toda a área compreendida pelo elemento container e pelo label correspondente.

exemplo de áreas interativas do componente switch.
A interatividade do componente switch ocorre tanto na área compreendida pelo container como pelo label correspondente.

Atenção: nos casos em que o label e o container não estejam próximos apenas o container deverá ser interativo.

Exemplo de situação em que apenas o *container* deve ser interativo.
Neste exemplo apenas o container é interativo.

3. Estados

Desabilitado

Um switch pode ficar desabilitado quando uma interação for feita pelo usuário anteriormente e que reflita neste switch.

Exemplo de switch com estado desabilitado.
Switches desabilitados.

A seguir apresentamos uma tabela com outros possíveis estados para o componente switches.

Outros casos possíveis de serem encontrados em switches.
Estados possíveis dos switches.

Atenção: consulte o documento de estados para se informar sobre a aplicação dos estados mencionados no componente switch.

4. Agrupamento

O componente switch, funciona basicamente como um interruptor de alternância, permitindo aos usuários ligar ou desligar as opções apresentadas. No entanto, quando utilizados de forma agrupada, deverão vir associados a um componente checkbox principal, permitindo ao usuário selecionar e desselecionar todas, além de ter o feedback relacionado ao estado intermediário. Para maiores informações consultar “Estado Intermediário” na documentação do componente checkbox.
Exemplo de switches agrupados em uma lista associado a um checkbox principal
Exemplo de switches agrupados em uma lista associado a um checkbox principal.

5. Responsividade

Não há nenhum comportamento especial previsto para o componente switch quando aplicado em resoluções menores. Apenas esteja atento quanto à área de interação. Em dispositivos touch screen prefira utilizar densidade baixa, pois apresenta uma maior área de interação ao toque.


Melhores Práticas

  • Switches devem ter efeito imediato e não devem exigir que o usuário clique em botões de “Salvar” ou “Enviar” para aplicar o novo estado.

  • Evite incluir switches em formulários longos onde outros tipos de campos de formulário estão presentes e os usuários precisarão clicar no botão “Enviar” para que outras alterações tenham efeito. Este cenário confunde os usuários porque eles não podem ter certeza se sua escolha de alternância terá efeito imediato.

  • Mantenha os rótulos dos switches curtos e diretos.

  • Certifique-se de que os switches sejam implementados de forma consistente. A inconsistência força os usuários a gastar mais tempo pensando em como interagir com os componentes.

  • O Switch deve ser posicionado na interface de forma firme e consistente durante o movimento da chave de alternância ou alternância de labels e surgimento de bordas de foco, evitando mudar o posicionamento do seu container. Caso contrário, poderá confundir ou atrapalhar o processo de interação do usuário com o componente.

  • Os rótulos devem descrever o que o switch fará quando a chave estiver ligada ou desligada. Eles não devem ser neutros ou ambíguos.

  • Evite mais de três termos para definir rótulos.

  • Use rótulos sempre na mesma posição em relação ao switch.

  • Evite utilizar rótulo apenas para um estado possível.

Exemplos de uso correto e incorreto de rótulos no switch.
Use rótulos curtos e concisos.

Exemplos de uso correto e incorreto de rótulos no switch.
Não alterne a posição dos rótulos.

Exemplos de uso correto e incorreto de rótulos no switch.
Use os rótulos sempre em pares.

Atenção: quando utilizar rótulos prefira alinhar o componente reservando espaço pelo rótulo de maior extensão. desta forma, evita-se o deslocamento do componente quando for alterada a chave de alternância.

Exemplos de uso correto de alinhamento dos rótulos.
Exemplos de boas práticas no alinhamento dos rótulos.


Especificações

Alinhamento

Name Spacing Token
Label --spacing-vertical-center
Label --spacing-horizontal-left

Espaçamento

Name Property Token/Value
Label (depende da posição) margin-right/margin-left/margin-botton --spacing-scale-2x
Rótulo (depende da posição) margin-right/margin-left --spacing-scale-base
container (alta) padding-all --spacing-scale-half
container (média) padding-all --spacing-scale-half
container (baixa) padding-left, padding-right --spacing-scale-half
container (baixa) padding-top, padding-botton --spacing-scale-half
container margin-bottom --spacing-scale-base
Chave (ligado) horizontal align right
Chave (desligado) horizontal align left

Dimensão

Name Property Token/Value
container (alta) width 40px
container (alta) height 24px
Chave de alternância (alta) width 16px
Chave de alternância (alta) height 16px
container (média) width 52px
container (média) height 30px
Chave de alternância (média) width 22px
Chave de alternância (média) height 22px
container (baixa) width 64px
container (baixa) height 36px
Chave de alternância (baixa) width 28px
Chave de alternância (baixa) height 28px

Cor

Name Property Color Token
Superfície background --pure-0
Label text --gray-80
Rótulo text --gray-80
chave de alternância - on icon --blue-warm-vivid-40
chave de alternância - off icon --gray-20
Ícones icon --pure-0

Tipografia

Name Property Token/Value
Label size --font-size-scale-base
Label font-weight --font-weight-semi-bold
Rótulo size --font-size-scale-base
Rótulo font-weight --font-weight-regular

Iconografia

Name Ícone Size Class (Font Awesome)
Chave de alternância (alta) --icon-size-sm fa-circle
Chave de alternância (média) --icon-size-lg fa-circle
Chave de alternância (baixa) --icon-size-2x fa-circle
Ícone off (alta) --icon-size-xs fa-times-circle
Ícone off (média) --icon-size-sm fa-times-circle
Ícone off (baixa) --icon-size-base fa-times-circle
Ícone on (alta) --icon-size-xs fa-check-circle
Ícone on (média) --icon-size-sm fa-check-circle
Ícone on (baixa) --icon-size-base fa-check-circle
Esta informação foi útil?

Gostaria de enviar mais detalhes sobre seu feedback?

Selecione a opção que melhor descreve sua insatisfação:

Acessibilidade no Switch

  • Os usuários devem poder acessar o switch por meio da tecla Tab e alternar seu estado (ligado/desligado) por meio das teclas Space ou Enter;

  • Para que usuários com deficiência visual possam entender completamente a opção selecionada, os leitores de tela devem anunciar o rótulo descritivo e o estado atual do switch.

Recomendações para Estilo e Design

  • O switch deve ter um rótulo claro e de fácil entendimento, que explica seu propósito;

  • Forneça indicação visual de foco conforme a recomendação na diretriz de estados. Isto ajuda os usuários que navegam com o teclado perceber claramente o switch selecionado;

  • Forneça feedback visual e/ou auditivo indicando qual é o estado atual da opção selecionada. Observe as indicações de cores de estado na diretriz do componente;

  • Ofereça uma área ampla o suficiente para que os usuários possam clicar ou tocar facilmente, mesmo para aqueles com deficiência motora.

Recomendações para Código

  • Utilize o atributo aria-label ou forneça um rótulo associado através da tag <label> e o atributo for;

  • Quando ativado, o elemento switch deve ter o atributo aria-checked definido como true e quando desativado, o atributo aria-checked definido como false;

  • Se o switch for um elemento HTML do tipo <input type="checkbox"> ou <input type="radio">, recomenda-se usar o atributo checked em vez da propriedade aria-checked.

Referências

Esta informação foi útil?

Gostaria de enviar mais detalhes sobre seu feedback?

Selecione a opção que melhor descreve sua insatisfação: