O Atributo inert

Como o atributo global inert desativa foco, cliques e leitura por leitores de tela de uma seção inteira da página com uma única palavra no HTML.

Desativar uma parte da página — um menu fora da tela, um passo inativo de um formulário multi-etapas, o conteúdo atrás de um modal — sempre exigiu resolver dois problemas ao mesmo tempo: impedir que o teclado e o mouse cheguem naqueles elementos, e esconder esse mesmo trecho dos leitores de tela. O atributo inert resolve os dois de uma vez, com uma única palavra no HTML.

O jeito antigo

Para desativar de verdade uma seção da página, era preciso combinar várias técnicas manualmente:

<nav id="menu-lateral" aria-hidden="true">
    <a href="/conta" tabindex="-1">Minha conta</a>
    <a href="/pedidos" tabindex="-1">Pedidos</a>
</nav>

aria-hidden some com o trecho para leitores de tela, mas não impede foco por teclado nem cliques — por isso era preciso adicionar tabindex="-1" em cada elemento focável manualmente, e ainda bloquear cliques via CSS (pointer-events: none) ou JavaScript. Esquecer um desses passos deixa a interface acessível de um jeito quebrado: um link "escondido" que o Tab ainda alcança, por exemplo.

Como funciona o inert

Basta adicionar o atributo booleano inert no elemento que deve ficar desativado:

<nav id="menu-lateral" inert>
    <a href="/conta">Minha conta</a>
    <a href="/pedidos">Pedidos</a>
</nav>

Com isso, o navegador cuida de tudo de uma vez: os links deixam de receber foco por Tab, cliques e toques não disparam mais eventos, e todo o subtree é removido da árvore de acessibilidade — exatamente como se tivesse aria-hidden="true", mas sem precisar declarar isso à parte. inert não altera a aparência visual do elemento; ele continua renderizado normalmente, só deixa de ser interativo.

Alternando via JavaScript

Além do atributo HTML, existe a propriedade inert correspondente no elemento, útil para ligar e desligar o estado dinamicamente:

const menu = document.getElementById('menu-lateral');
const botaoAbrir = document.getElementById('abrir-menu');
const botaoFechar = document.getElementById('fechar-menu');

botaoAbrir.addEventListener('click', () => {
    menu.inert = false;
    menu.classList.add('aberto');
});

botaoFechar.addEventListener('click', () => {
    menu.inert = true;
    menu.classList.remove('aberto');
});

Formulário multi-etapas

Um uso comum é desativar as etapas que ainda não estão visíveis num wizard, garantindo que o Tab não escape para campos escondidos por CSS:

<fieldset id="etapa-1">
    <legend>Dados pessoais</legend>
    <input type="text" placeholder="Nome">
</fieldset>

<fieldset id="etapa-2" inert>
    <legend>Endereço</legend>
    <input type="text" placeholder="Rua">
</fieldset>

Ao avançar para a próxima etapa, basta alternar qual fieldset tem inert, sem precisar desabilitar cada campo individualmente com disabled (o que, além de mais trabalhoso, também mudaria a aparência dos campos e os removeria do envio do formulário).

inert e o dialog modal

O próprio <dialog> aberto com showModal() se comporta de forma parecida com um inert aplicado ao restante da página: enquanto o modal estiver aberto, o Tab não escapa para o conteúdo por trás dele. Para overlays construídos manualmente — um painel lateral, um passo a passo guiado — aplicar inert no conteúdo principal enquanto o overlay estiver ativo reproduz esse mesmo comportamento sem precisar do elemento <dialog>.

Quando usar

Cuidados

inert não é disabled: campos de formulário dentro de um elemento inert continuam sendo enviados normalmente se o formulário for submetido por outro caminho, já que o atributo só afeta interação e foco, não o valor do campo. Vale lembrar também que inert não deixa o elemento visualmente diferente — geralmente faz sentido combinar com um estilo de opacidade reduzida via CSS, usando o seletor [inert], para dar uma pista visual de que aquele trecho está temporariamente desativado.

[inert] {
    opacity: 0.5;
}

Compatibilidade

O suporte é amplo em todos os navegadores modernos desde 2023, o que torna o inert seguro para usar em produção na grande maioria dos projetos atuais.

caniuse

Conclusão

O inert substitui uma combinação frágil de aria-hidden, tabindex="-1" manual e bloqueio de cliques por um único atributo que o navegador garante estar sempre consistente. É uma dessas mudanças pequenas que eliminam uma classe inteira de bugs de acessibilidade que antes dependiam de lembrar de todos os passos manuais.

Tecnologia:
html

Deixe seu Comentário!

Dúvida, sugestão ou só um "valeu!" — tudo é bem-vindo por aqui.

Comentário
Nome
Email
lock Seu e-mail não será publicado.