Atraso de 300 ms ao tocar, sumiu

Jake Archibald
Jake Archibald

Por muitos anos, os navegadores para dispositivos móveis aplicaram um atraso de 300 a 350 ms entre touchend e click enquanto esperavam para ver se isso seria um toque duplo ou não, já que o toque duplo era um gesto para aumentar o zoom no texto.

Desde a primeira versão do Chrome para Android, esse atraso era removido quando o zoom por gesto também era desativado. No entanto, o zoom com o gesto de pinça é um recurso de acessibilidade importante. A partir do Chrome 32 (desde 2014), esse atraso não existe mais em sites otimizados para dispositivos móveis sem remover o gesto de pinça. O Firefox e o IE/Edge fizeram a mesma coisa logo depois e, em março de 2016, uma correção semelhante ocorreu no iOS 9.3.

A diferença de desempenho é enorme.

Ter uma IU que responde instantaneamente significa que o usuário pode pressionar rapidamente cada botão com confiança, em vez de pausar e esperar por uma resposta. Saiba mais sobre o impacto dos tempos de reação das pessoas e do desempenho na Web na introdução ao RAIL.

Para remover o atraso por toque de 300 a 350 ms, você só precisa do seguinte no <head> da sua página:

<meta name="viewport" content="width=device-width">

Isso define a largura da janela de visualização da mesma forma que o dispositivo e geralmente é uma prática recomendada para sites otimizados para dispositivos móveis. Com essa tag, os navegadores consideram que você tornou o texto legível em dispositivos móveis, e o recurso de tocar duas vezes para aplicar zoom é descartado para receber cliques mais rápidos.

Se por algum motivo não for possível fazer essa mudança, use touch-action: manipulation para ter o mesmo efeito em toda a página ou em elementos específicos:

html {
    touch-action: manipulation;
}

Essa técnica não é compatível com o Safari. Por isso, a tag da janela de visualização é preferível.

Perder o toque duplo para aplicar zoom é uma preocupação de acessibilidade?

Não. O zoom com o gesto de pinça continua funcionando, e os recursos do SO atendem a usuários com dificuldade para fazer esse gesto. No Android, os gestos de ampliação cuidam disso. Ferramentas como essa funcionam até mesmo fora do navegador.

E os navegadores mais antigos?

O FastClick da FT Labs usa eventos de toque para acionar os cliques com mais rapidez e remove o gesto de tocar duas vezes. Ele analisa o quanto o dedo moveu entre touchstart e touchend para diferenciar rolagens e toques.

Adicionar um listener touchstart a tudo tem um impacto no desempenho, porque interações de nível inferior, como rolagem, são atrasadas ao chamar o listener para ver se ele event.preventDefault()s. Felizmente, o FastClick evitará configurar listeners em casos em que o navegador já remova o atraso de 300 ms, para que você obtenha o melhor de ambos.