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 aguardavam para saber se seria um toque duplo ou não, já que esse gesto era usado para dar zoom no texto.

Desde a primeira versão do Chrome para Android, esse atraso foi removido se o zoom de pinça também estava desativado. No entanto, o zoom por pinça é um recurso de acessibilidade importante. A partir do Chrome 32 (em 2014), esse atraso foi removido para sites otimizados para dispositivos móveis, sem remover o zoom de pinça. O Firefox e o IE/Edge fizeram o mesmo logo depois, e em março de 2016 uma correção semelhante foi lançada no iOS 9.3.

A diferença de performance é enorme.

Ter uma interface 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 humana e o desempenho da Web na nossa introdução ao RAIL.

Para remover o atraso de 300 a 350 ms no toque, basta fazer o seguinte no <head> da sua página:

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

Isso define a largura da janela de visualização como a mesma do dispositivo e geralmente é uma prática recomendada para sites otimizados para dispositivos móveis. Com essa tag, os navegadores presumem que você deixou o texto legível em dispositivos móveis, e o recurso de tocar duas vezes para ampliar é substituído por cliques mais rápidos.

Se, por algum motivo, você não puder fazer essa mudança, use touch-action: manipulation para conseguir 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, então a tag de viewport é a melhor opção.

A perda do recurso de tocar duas vezes para aumentar o zoom é um problema de acessibilidade?

Não. O zoom por pinça continua funcionando, e os recursos do SO atendem aos usuários que acham esse gesto difícil. 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 cliques mais rapidamente e remove o gesto de tocar duas vezes. Ele analisa a quantidade de movimento do dedo entre touchstart e touchend para diferenciar rolagens e toques.

Adicionar um listener touchstart a tudo tem um impacto na performance, porque interações de nível inferior, como a rolagem, são atrasadas ao chamar o listener para saber se ele event.preventDefault(). Felizmente, o FastClick evita a configuração de listeners nos casos em que o navegador já remove o atraso de 300 ms. Assim, você aproveita o melhor dos dois mundos.