Esconder ou desabilitar uma ação indisponível?

Esconder reduz ruído quando uma ação não faz parte do contexto. Desabilitar preserva a descoberta quando ela é importante e pode voltar a funcionar.

Wireframe comparando uma ação escondida com uma ação visível em estado indisponível
Nível de impácto
Alto
Status
Usar com atenção
Nível de evidênica
Evidência moderada

Contexto

Uma ação pode estar indisponível porque ainda falta uma condição, porque não se aplica ao contexto atual, porque a pessoa não tem permissão ou porque o sistema está temporariamente indisponível. Nesses casos, a interface precisa decidir se mantém o controle visível ou se o remove.

Esconder e desabilitar comunicam coisas diferentes. Esconder reduz ruído e evita apresentar uma opção que não faz sentido. Desabilitar preserva a existência e a posição da ação, mas impede seu uso. A escolha deve considerar a relevância para o fluxo, a chance de disponibilidade futura, a necessidade de explicar o bloqueio e a possibilidade de descoberta por teclado.

Esconda a ação quando ela for irrelevante para o contexto atual, não puder ser usada por aquela pessoa e não houver motivo para que ela descubra ou solicite acesso. A ausência não deve desorientar o fluxo.

Mantenha a ação visível e use um estado desabilitado quando uma condição clara e temporária precisa ser atendida, quando a posição ajuda a entender o fluxo ou quando a ação é importante para completar a tarefa. Mostre o que falta e, se necessário, como resolver.

Se a ação precisa continuar visível e responder ao foco ou ao acionamento com uma explicação, use um estado inativo focável. Nesse caso, não use aria-disabled="true" se o controle ainda puder ser acionado para mostrar a explicação, pois esse atributo comunica que o elemento está inoperável. Se o controle não puder ser acionado, aria-disabled="true" pode manter sua descoberta por teclado, mas o código também deve impedir a operação.

Se a indisponibilidade vier de falha, permissão ou limitação de plataforma, preserve a descoberta e ofereça uma explicação persistente, uma alternativa ou um caminho de recuperação. Quando a disponibilidade ainda estiver sendo carregada, use um estado de carregamento em vez de esconder ou desabilitar sem contexto.

Captura do SP Sem Papel com o botão Criar Novo destacado como indisponível durante a transição para o SEI
Exemplo real brasileiro: no manual do SP Sem Papel, do Centro Paula Souza, o botão “Criar Novo” aparece indisponível durante a transição para o SEI!. A explicação contextual informa por que a ação não poderá ser usada naquele período. Fonte: Centro Paula Souza, https://cggp.cps.sp.gov.br/manuais/transicao-sei-contagem/

Porque isso importa?

Uma ação que parece disponível, mas não responde, gera incerteza. Uma ação escondida pode fazer a pessoa concluir que o recurso não existe. Já o estado nativo disabled costuma sair da sequência de tabulação, reduzindo sua descoberta por pessoas que usam teclado ou leitor de tela.

Em alguns fluxos, manter a ação visível ajuda a pessoa a entender o produto e encontrar o requisito. Em outros, bloqueá-la evita uma operação inválida ou duplicada. A escolha afeta clareza, prevenção de erros, eficiência e acessibilidade, por isso não deve ser tratada como regra universal.

  • Esconda a ação quando ela não fizer sentido para o contexto atual e sua ausência não causar desorientação.
  • Esconda uma ação permanentemente indisponível para aquela pessoa quando não houver caminho de solicitação, upgrade ou descoberta que justifique mantê-la visível.
  • Use desabilitado quando uma condição clara e temporária precisa ser atendida.
  • Use desabilitado para evitar um novo acionamento durante o processamento, desde que o estado de carregamento e o retorno do sistema sejam comunicados.
  • Mantenha a ação visível quando ela for central ao fluxo ou quando sua posição ajudar a explicar o que falta.
  • Use um estado inativo focável quando a pessoa precisar consultar uma explicação ao focar ou acionar o controle.
  • Use um estado de leitura quando o conteúdo precisar ser consultado, mas não editado; não confunda somente leitura com desabilitado.
  • Não esconda uma ação central do fluxo só porque ela está temporariamente indisponível.
  • Não desabilite sem explicar o motivo, o requisito ou o caminho para prosseguir.
  • Não use um tooltip como única explicação para um controle nativo com disabled, pois ele não recebe foco por teclado.
  • Não dependa apenas de cinza, opacidade ou baixo contraste para comunicar o estado.
  • Não use aria-hidden="true" para esconder visualmente uma ação focável.
  • Não use apenas pointer-events: none; isso não impede necessariamente a ativação por teclado.
  • Não esconda ou desabilite enquanto a disponibilidade ainda estiver indefinida; mostre carregamento ou uma mensagem de estado.
  • Não mantenha uma ação permanentemente desabilitada sem motivo para continuar presente.
Exemplo do GitHub Primer mostrando uma reação de comentário removida da interface
Exemplo real: o GitHub Primer recomenda remover ações não funcionais quando elas não são essenciais ao fluxo. A captura mostra uma reação de comentário omitida, ilustrando quando esconder reduz ruído sem retirar uma ação central. Fonte: Primer, https://primer.style/product/ui-patterns/degraded-experiences/

Recomendações

Faça

Práticas recomendadas
  • Classifique a causa: ação irrelevante, pré-requisito, carregamento, permissão ou falha externa.
  • Esconda a ação irrelevante ou permanentemente sem caminho de descoberta.
  • Mantenha a ação visível e desabilitada quando o pré-requisito for claro, temporário e relevante para o fluxo.
  • Mostre o requisito em texto persistente e próximo ao controle.
  • Use um estado inativo focável quando a explicação depender de foco ou acionamento.
  • Preserve o rótulo e a posição da ação principal.
  • Reative o controle assim que a condição mudar e comunique a mudança quando ela for importante.
  • Teste a decisão com teclado, leitor de tela, zoom e modos de alto contraste.
Wireframe de uma ação importante visível em estado inativo com explicação próxima
A ação importante permanece descoberta, em sua posição habitual, e o contexto próximo explica a condição que impede o uso.

Evite

Práticas a evitar
  • Esconder a ação principal sem informar como a tarefa pode ser concluída.
  • Desabilitar uma ação que poderia validar a tentativa e explicar o que falta.
  • Deixar o controle desabilitado depois que a condição já foi atendida.
  • Usar tooltip, cor ou opacidade como única comunicação do estado.
  • Marcar aria-disabled="true" e manter a operação executável no código.
  • Remover da interface uma ação importante durante falha ou indisponibilidade temporária.
Wireframe de uma interface que esconde ou apaga uma ação importante sem explicar o motivo
A ação central desaparece ou fica apagada sem motivo visível, deixando a pessoa sem pista sobre o recurso ou sobre como prosseguir.
Exemplo do Fluent 2 mostrando um recurso indisponível com explicação de que ele só está disponível na versão desktop
Exemplo real: o Fluent 2 mantém um controle visível em estado indisponível e usa uma explicação para indicar que o recurso só está disponível na versão desktop. O caso demonstra quando a visibilidade ajuda a explicar a limitação. Fonte: Fluent 2, https://fluent2.microsoft.design/components/web/react/core/tooltip/usage

Acessibilidade

O atributo HTML disabled remove o controle da sequência de tabulação e impede sua operação nativa. Use-o quando a pessoa não precisar descobrir a ação naquele estado. Quando a ação precisa continuar descoberta, aria-disabled="true" pode manter o elemento focável; nesse caso, a implementação deve impedir a ativação e fornecer uma explicação acessível.

Se o controle puder ser acionado para mostrar uma explicação, mantenha-o interativo e não o marque como aria-disabled="true". Se a ação não puder ser acionada, informe o estado por semântica e comportamento, não apenas por CSS. Não use aria-hidden="true" em elemento focável.

Não use apenas cor, opacidade ou baixo contraste para comunicar a indisponibilidade. Preserve o nome acessível, o foco visível e o motivo próximo ao controle. Garanta que mensagens de estado sejam encontradas por teclado e leitores de tela. Teste a ordem de foco, o zoom, o alto contraste e a reativação do controle.

Checklist

  • A causa da indisponibilidade foi classificada?
  • A ação é relevante para o contexto atual?
  • Sua ausência deixaria o fluxo desorientador?
  • A pessoa precisa descobrir que o recurso existe?
  • Existe uma condição clara para liberar a ação?
  • O requisito aparece perto do controle?
  • A explicação é persistente e acessível sem mouse?
  • O estado não depende só de cor, opacidade ou baixo contraste?
  • disabled é realmente necessário ou a validação no acionamento seria mais útil?
  • aria-disabled, quando usado, bloqueia a operação no código?
  • O controle volta ao estado disponível assim que a condição muda?
  • A decisão foi testada com teclado, leitor de tela, zoom e alto contraste?

Referências

  • W3C, WAI-ARIA Authoring Practices Guide. Orienta a implementação de interfaces de teclado e o tratamento de controles desabilitados. Fonte normativa de acessibilidade aplicada: Keyboard Interface.
  • MDN Web Docs, aria-disabled. Explica que aria-disabled comunica o estado, mas não bloqueia o comportamento; também descreve quando manter um controle focável pode ser importante para descoberta. Fonte técnica: aria-disabled.
  • MDN Web Docs, aria-hidden. Diferencia remoção da árvore de acessibilidade de ocultação visual e alerta para não usar o atributo em elementos focáveis. Fonte técnica: aria-hidden.
  • GitHub Primer, Degraded experiences. Recomenda remover ações não funcionais quando elas não são essenciais e preservar a descoberta de ações centrais; apresenta uma árvore de decisão para escolher entre remover, usar botão inativo e usar botão desabilitado. Guideline oficial de design system: Degraded experiences.
  • GitHub Primer, Create. Recomenda esconder ações de criação quando a pessoa não tem permissão e não mostrar um botão desabilitado que não pode ser alcançado ou não explica a indisponibilidade. Guideline contextual de produto: Create.
  • GitHub Primer, Button guidelines e accessibility. Diferencia botão inativo, que pode responder para explicar o bloqueio, de botão desabilitado, e documenta o impacto do estado nativo na navegação por teclado. Guidelines de componente: Button guidelines e Button accessibility.
  • Microsoft Fluent 2, Button. Recomenda explicar o que está indisponível e por que, especialmente quando o botão desabilitado não puder receber interação. Guideline oficial de componente: Button usage.
  • IBM Carbon Design System, Read-only states. Diferencia desabilitado temporário de somente leitura, que deve continuar navegável quando o conteúdo precisa ser consultado. Guideline oficial de estado: Read-only states.
  • Material Design 3, Applying states. Documenta o estado desabilitado como indicação de que um componente não está operável naquele momento. Guideline oficial de interação: Applying states.
  • Centro Paula Souza, SP Sem Papel. Manual oficial brasileiro usado no exemplo da transição para o SEI!, com a ação “Criar Novo” indisponível e explicação de contexto: O que acontecerá no dia da adesão do SEI! no meu órgão?.
  • Nielsen Norman Group, Why Disabled Buttons Hurt UX. Síntese especializada sobre o risco de um botão não responder sem explicar o motivo e sobre o uso criterioso do estado. Referência aplicada: Why Disabled Buttons Hurt UX.
Veja também

Esta recomendação foi útil para você?