1
resposta

Diretiva focusTrap navegação infinita

Oi pessoal, beleza? Eu gostaria de saber como vocês fariam para travar a leitura do elemento quando estivesse no primeiro e último.

Hoje quando o usuário está com foco no último elemento do modal, e pressiona o Tab, o focusTrap leva ele para o primeiro elemento, tornando a navegação infinita.

Mas e se fosse preciso travar a navegação ali? Ele estando no primeiro elemento, não consegue voltar, navegar para elemento anterior, e ele estando no último elemento, travasse ali, não consegue navegar para o próximo apenas para os anteriores. Pensando nesse cenário, como seria ?

1 resposta

Olá Luiz, tudo bem com você?

Peço desculpas pela demora em obter um retorno.

Para o cenário descrito onde a navegação fique restrita aos limites dos elementos da modal e não retorne para o elemento inicial ao pressionarmos TAB estando com o foco no último elemento assim como não vá para o último elemento quando o foco está no primeiro elemento e pressionamos Shift + Tab, será necessário realizar uma modificação na lógica do método manageTab presente no arquivo focus-trap.directive.ts, deixando-o como apresentado abaixo:

@HostListener('keydown', ['$event'])
public manageTab(event: KeyboardEvent): void {
  if (event.key !== 'Tab') {
    return;
  }

  if (event.shiftKey && document.activeElement === this.firstFocusableElement) {
    event.preventDefault();
  } else if (!event.shiftKey && document.activeElement === this.lastFocusableElement) {
    event.preventDefault();
  }
}

No código acima, primeiramente é verificado se a tecla pressionada não é a tecla Tab, se não for a tecla Tab, o método retorna e não faz mais nada.

Em seguida verifica se a tecla Shift está pressionada e se o elemento atual com foco é o primeiro elemento focável do modal. Se essas condições forem atendidas, o método chama event.preventDefault() para cancelar o evento de tecla, impedindo que a ação padrão de navegação ocorra.

E por último, verifica se a tecla Shift não está pressionada e se o elemento atual com foco é o último elemento focável do modal. Se essas condições forem atendidas, o método chama event.preventDefault() para cancelar o evento de tecla, impedindo que a ação padrão de navegação ocorra.

Após realizar as modificações, salve o arquivo e reinicie a aplicação. Acesse a aplicação no navegador e verifique o comportamento apresentado ao pressionar as teclas Tab ou Shift + Tab. Deixo abaixo um GIF demonstrando o funcionamento da navegação após a modificação:

GIF contendo a apresentação da navegação pelos campos de um formulário utilizando as teclas Tab e shift

Espero ter ajudado. Continue mergulhando em conhecimento e não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.

Em caso de dúvidas estou à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!