Atualizei meu iPhone 6 plus para a versão beta do iOS 10 e acabei de descobrir que, no safari para celular, você pode ampliar qualquer página da web tocando duas vezes ou beliscando IGNORAR o user-scalable=no
código na metatag. Não sei se é um bug ou recurso. Se for considerado um recurso, como desativar a janela de visualização com zoom no safari do iOS 10?
atualizado na versão iOS 11/12, o safari iOS 11 e iOS 12 ainda NÃO respeita a user-scalable=no
metatag.
Respostas:
É possível impedir o dimensionamento de páginas da Web no safari no iOS 10, mas isso envolverá mais trabalho da sua parte. Acho que o argumento é que um certo grau de dificuldade deve impedir que os desenvolvedores de cultos de carga largem "user-scalable = no" em todas as tags de viewport e dificultem desnecessariamente as coisas para usuários com deficiência visual.
Ainda assim, eu gostaria que a Apple mudasse sua implementação para que houvesse uma maneira simples (meta-tag) de desativar o toque duplo no zoom. A maioria das dificuldades está relacionada a essa interação.
Você pode parar de beliscar para ampliar com algo assim:
Observe que, se algum destino mais profundo chamar stopPropagation no evento, o evento não alcançará o documento e o comportamento da escala não será impedido por esse ouvinte.
Desativar o toque duplo para ampliar é semelhante. Você desativa qualquer toque no documento que ocorre dentro de 300 milissegundos do toque anterior:
Se você não configurar corretamente os elementos do formulário, o foco em uma entrada será ampliado automaticamente e, como você desativou o zoom manual, agora será quase impossível descompactar. Verifique se o tamanho da fonte de entrada é> = 16px.
Se você está tentando resolver isso em um WKWebView em um aplicativo nativo, a solução fornecida acima é viável, mas é uma solução melhor: https://stackoverflow.com/a/31943976/661418 . E, como mencionado em outras respostas, no iOS 10 beta 6, a Apple agora forneceu uma bandeira para honrar a metatag.
Atualização em maio de 2017: substituí o antigo método 'check toches length on touchstart' de desativar o zoom de pitada por uma abordagem mais simples do 'check event.scale on touchmove'. Deve ser mais confiável para todos.
fonte
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
e, se o navegador não respeitar a metatag, o design do navegador será muito ruim. O outro, como um design muito ruim, é a ação de retroceder / avançar deslizando, o que não pode ser evitado no iOS 9/10. Ele quebra severamente as ações de arrastar dentro do aplicativo da web.preventDefault
ativadotouchmove
. Você não pode (completamente) desativar o zoom sem desativar a rolagem.If you don't set up your form elements right, focusing on an input will auto-zoom, and since you have mostly disabled manual zoom, it will now be almost impossible to unzoom. Make sure the input font size is >= 16px.
Este é um novo recurso do iOS 10.
Nas notas de versão do iOS 10 beta 1:
Espero que em breve vejamos um complemento JS para desativá-lo de alguma forma.
fonte
Consegui consertar isso usando a
touch-action
propriedade css em elementos individuais. Tente definirtouch-action: manipulation;
elementos nos quais geralmente são clicados, como links ou botões.fonte
touch-action: none;
para controlar todos os gestos.touch-action: none
apenasmanipulatoin
, o que deixa o problema de pinch-zoom como está.Parece que esse comportamento foi supostamente alterado na versão beta mais recente, que no momento da redação é a versão 6.
Nas notas de versão do iOS 10 Beta 6:
No entanto, nos meus testes (muito limitados), ainda não posso confirmar que este é o caso.
Editar: verificado, o iOS 10 Beta 6 respeita
user-scalable=no
por padrão para mim.fonte
WKWebView
não o Safari. Fonte: Um dos nossos aplicativos de mapas quebrou e não temos nenhuma idéia de como corrigi-lo.WKWebView
e meio que assumi que a pergunta original era perguntadaWKWebView
ao escrever minha resposta. Portanto, suponho que durante uma das primeiras versões beta, a Apple alterou o comportamento doWKWebView
Safari móvel e, em seguida, no beta 6, eles reverteram o comportamento do,WKWebView
mas o mantiveram para o Safari móvel.user-scalable=no
. Não sei por que eles desfizeram isso, apenas para trazê-lo de volta, apenas para removê-lo novamente.A solução que funciona em Mobile Safari no momento da escrita, é ter o terceiro argumento a
addEventListener
seja{ passive: false }
, de modo a aparência de solução completa como este:Convém verificar se há opções compatíveis para permanecer compatível com versões anteriores.
fonte
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
.<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover, user-scalable=no, shrink-to-fit=no" />
e<meta name="HandheldFriendly" content="true">
Passei cerca de uma hora procurando uma opção javascript mais robusta e não encontrei uma. Acontece que, nos últimos dias, estive brincando com o hammer.js (Hammer.js é uma biblioteca que permite manipular todos os tipos de eventos de toque com facilidade) e falhando principalmente com o que eu estava tentando fazer.
Com essa ressalva, e entendendo que eu não sou especialista em javascript, esta é uma solução que eu criei que basicamente utiliza o hammer.js para capturar os eventos de pinch-zoom e toque duas vezes e depois registrá-los e descartá-los.
Certifique-se de incluir hammer.js em sua página e tente colocar esse javascript na cabeça em algum lugar:
fonte
.preventDefault
a todos os manipuladores de gesto do martelo. Estou usando furto / pitada / panela / torneira juntos, adicionei a todos os manipuladores, não sei se há um específico que esteja fazendo o trabalho.Eu tentei a resposta anterior sobre pitada de zoom
no entanto, em algum momento a tela ainda é ampliada quando o evento.touches.length> 1 Eu descobri a melhor maneira de usar o evento touchmove, para evitar qualquer movimento do dedo na tela. O código será algo como isto:
Espero que ajude.
fonte
Verifique o fator de escala no evento touchove e evite o evento touch.
fonte
Podemos obter tudo o que queremos injetando uma regra de estilo e interceptando eventos de zoom:
✔ Desativa o zoom de pitada.
✔ Desativa o toque duplo do zoom.
✔ A rolagem não é afetada.
✔ Desativa o toque em destaque (que é acionado, no iOS, pela regra de estilo).
AVISO: ajuste a detecção do iOS ao seu gosto. Mais sobre isso aqui .
Desculpas a lukejackson e Piotr Kowalski , cujas respostas aparecem na forma modificada no código acima.
fonte
addEventListener
respostas baseadas e passando{ passive: false }
comooptions
parâmetro em vez defalse
. No entanto, para compatibilidade com versões anteriores, você precisa passarfalse
, a menos que opassive
campo de opção seja suportado. Veja developer.mozilla.org/pt-BR/docs/Web/API/EventTarget/…Eu vim com uma solução bastante ingênua, mas parece funcionar. Meu objetivo era impedir que os toques duplos acidentais fossem interpretados como aumentar o zoom, mantendo a pressão para aumentar o zoom para garantir a acessibilidade.
A idéia é medir o tempo entre o primeiro
touchstart
e o segundotouchend
em um toque duplo e depois interpretar o últimotouchend
como clique, se o atraso for muito pequeno. Embora evite o zoom acidental, esse método parece manter a rolagem da lista inalterada, o que é bom. Não tenho certeza se não perdi nada.Inspirado por uma essência de mutewinter e a resposta de Joseph .
fonte
No meu caso particular, estou usando o Babylon.js para criar uma cena 3D e toda a minha página consiste em uma tela em tela cheia. O mecanismo 3D tem sua própria funcionalidade de zoom, mas no iOS a pressão do zoom interfere nisso. Atualizei a resposta @ Joseph para superar meu problema. Para desativá-lo, descobri que preciso passar o {passive: false} como uma opção para o ouvinte de eventos. O código a seguir funciona para mim:
fonte
Por mais estranho que pareça, pelo menos para o Safari no iOS 10.2, toque duas vezes para ampliar será desativado magicamente se o seu elemento ou qualquer um de seus ancestrais tiver um dos seguintes:
cursor: pointer
conjunto em CSSfonte
O zoom não intencional tende a acontecer quando:
Para impedir a comportamento de toque duplo , encontrei duas soluções simples:
Ambos impedem o Safari (iOS 10.3.2) de aumentar o zoom no botão. Como você pode ver, um é apenas JavaScript, o outro é apenas CSS. Use apropriadamente.
Aqui está uma demonstração: https://codepen.io/lukejacksonn/pen/QMELXQ
Ainda não tentei impedir o comportamento de pitada, principalmente porque não costumo criar interfaces de toque múltiplo para a Web e, em segundo lugar, cheguei à ideia de que talvez todas as interfaces, incluindo a interface do usuário do aplicativo nativo, devam ser "pitada de zoom" -able em alguns lugares. Eu ainda projetar para evitar que o usuário ter que fazer isso para tornar a sua interface acessível a eles, a todo o custo.
fonte
Encontrou este trabalho simples em torno do qual parece impedir o clique duplo para aumentar o zoom:
fonte
Conforme solicitado, transferi meu comentário para uma resposta, para que as pessoas possam votar novamente:
Isso funciona 90% do tempo para o iOS 13:
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover, user-scalable=no, shrink-to-fit=no" />
e
<meta name="HandheldFriendly" content="true">
fonte
Verifiquei todas as respostas acima na prática com minha página no iOS (iPhone 6, iOS 10.0.2), mas sem sucesso. Esta é a minha solução de trabalho:
fonte
isso funcionou para mim:
fonte