Como você desativa o zoom da viewport no Mobile Safari?

393

Eu tentei todos os três destes sem sucesso:

<meta name=”viewport” content=”width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;” />

<meta name=”viewport” content=”width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=false;” />

<meta name=”viewport” content=”width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no;” />

cada um tem valores diferentes que achei recomendados pela pesquisa no Google ou SO, mas nenhum dos valores ' user-scalable = X ' parece estar funcionando

Também tentei delimitar os valores por vírgula em vez de ponto e vírgula, sem sorte. Então tentei SOMENTE ter o user-scalablevalor presente, ainda sem sorte.


ATUALIZAR

Comprei isso no site da Apple e funciona:

<meta name="viewport" content="width=device-width, user-scalable=no" />

verifica-se que o problema eram as aspas fora do padrão, porque eu copiei a metatag de um site que as estava usando, gritos

MetaGuru
fonte
6
Se você está fazendo um jogo, é possível que o controle do zoom seja possível. No entanto, em quase todos os outros casos, deve ser fortemente desencorajado. Infelizmente, tornou-se uma prática padrão para muitos desenvolvedores de dispositivos móveis. Se um usuário deseja aumentar o zoom para poder ler texto com mais facilidade etc., impedi-lo de fazer isso não é muito bom.
precisa saber é o seguinte
72
Estamos desativando o zoom em um aplicativo móvel baseado na Web. Você não pode ampliar aplicativos iOS nativos e isso não é obrigatório em nosso aplicativo Web. Se seu site ou aplicativo for otimizado para dispositivos móveis, seus usuários não precisarão aumentar o zoom. Sempre existem casos de uso para desativar o zoom. Nem sempre tem que ser de um jeito ou de outro.
Bradley Flood
10
Sim, não estou seguindo a linha da lógica de que desativar o zoom em um site otimizado para celular é uma coisa ruim . O pior é que a janela de visualização se desloca acidentalmente, porque a tela capta entradas acidentais de panorâmica e zoom em um site que não exige o zoom. Realisticamente, se os usuários precisam aumentar o zoom no conteúdo do site otimizado para celular, o problema é o design, não a falta de zoom.
Nathan Hornby
3
@NathanHornby: O problema de desativar o zoom é a falta de respeito pelas preferências do usuário. Usuários diferentes preferem tamanhos de texto diferentes, o público mais jovem com boa visão pode preferir ver mais conteúdo, enquanto o público com baixa visão não pode usar nada que não tenha texto gigante. Outras pessoas têm Parkinson, mas ainda têm uma boa visão, então preferem botões muito grandes, mas não se beneficiam de textos grandes em geral.
Lie Ryan
4
@ NathanHornby Isso não significa que o designer tenha feito algo errado necessariamente. Significa simplesmente que o usuário, por qualquer motivo, deseja aumentar o zoom. O zoom de pitada é um recurso padrão de todos os telefones com tela de toque. Qualquer usuário que possua esse telefone sabe como usá-lo. Sei que é uma pergunta antiga, mas ainda estou constantemente frustrada por desenvolvedores que insistem em quebrar a funcionalidade do meu telefone porque acham que isso faz com que seus designs pareçam melhores.
user1751825

Respostas:

718

Seu código está exibindo aspas duplas de atributo como aspas duplas sofisticadas. Se as citações sofisticadas estiverem presentes no seu código fonte, eu acho que esse é o problema.

Isso funciona para mim no Mobile Safari no iOS 4.2.

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
BoltClock
fonte
12
eram as citações chiques, eu copiei a tag de um site sem perceber, obrigado por apontar isso!
MetaGuru
5
Talvez isso esteja na cauda longa aqui, mas pode valer a pena ressaltar que isso precisa ser aplicado na página "nível superior". Se você tiver essa metatag aplicada a um iframe, ela não funcionará, a menos que a metatag também seja aplicada à página superior.
founddrama
2
Por que alguém jamais criaria um software que cria cotações sofisticadas está além de mim.
Traubenfuchs
3
@Traubenfuchs: Tipografia.
BoltClock
3
Esta é uma resposta bastante antiga e, chegando ao problema, eu tinha lido que, se você definir como escalável pelo usuário, isso causaria problemas de acessibilidade. A partir do iOS 10, ele funciona bem, permitindo ao usuário aumentar o zoom, se desejar, mas sem aumentar o zoom na caixa de entrada. Também não é necessário definir tamanhos de fonte grandes.
David David
161

Para as pessoas que procuram uma solução para iOS 10, o Windows 10 user-scaleable=noestá desativado no Safari para iOS 10. O motivo é que a Apple está tentando melhorar a acessibilidade, permitindo que as pessoas ampliem as páginas da Web.

Das notas de versão :

Para melhorar a acessibilidade em sites no Safari, os usuários agora podem aumentar o zoom, mesmo quando um site define user-scalable = no na janela de exibição.

Tanto quanto eu entendo, estamos sem sorte.

Mattis
fonte
6
Que decisão terrível da Apple. O uso de um controle giratório com os botões "-" e "+" para diminuir / incrementar um número agora amplia e reduz a página repetidamente na página no iOS Safari. As impressoras estão sendo interpretadas como toque duplo para aumentar o zoom, sem nenhuma maneira de desativar isso. iOS Chrome funcionando perfeitamente. Frustrante.
Paul
5
Embora eu esteja ferrado com essa decisão, estou muito feliz com a Apple como usuário, pois queria forçar esse recurso em muitos sites que usavam pequenos elementos no interior.
Bishoy Hanna 8/16
10
o mundo está indo para o inferno
homenzinho minúsculo
2
Oh caramba, quem teria adivinhado? Outra escolha ridícula feita pela Apple
Emil Pedersen
3
Deixe-o para a Apple para forçar uma "característica" acessibilidade para todos, em vez de apenas adicionar uma opção para ele nos acessibilidade configurações ...
Lennholm
98

@mattis está correto em relação ao iOS 10 Safari não permitir que você desative o beliscar para ampliar com o atributo escalável pelo usuário. No entanto, consegui desativar o uso preventDefault no evento 'gesturestart'. Eu só verifiquei isso no Safari no iOS 10.0.2.

document.addEventListener('gesturestart', function (e) {
    e.preventDefault();
});
jeremypress
fonte
8
No iOS 10, descobri que isso funcionava, mas se você rolar a página e apertar o zoom enquanto continua a rolar, ele permitirá o zoom. Depois, você fica preso no novo nível de zoom até rolar novamente. Portanto, isso não parece uma boa solução, a menos que o corpo da página não seja rolável. :(
Rand Scullard
11
Uma ressalva: o usuário ainda pode tocar duas vezes na tela que pode / pode ampliar e não é capturada por isso.
Stephen
11
Às vezes, ainda permite o zoom tocando duas vezes na tela. :(
Jarzka
4
O que é o "toque duplo" equivalente gesturestart? dblclick ?
lowtechsun
3
Outra nota, se você quiser desativar o aspecto de toque duplo do zoom. O Mobile Safari também suporta 'touch-action: manipulation' (cai em 'basic support', que desativa eventos de toque duplo. Documentação aqui: developer.mozilla.org/en-US/docs/Web/CSS/touch-action
jeremypress
15

para iphones safari até iOS 10 "viewport" não é uma solução, não gosto dessa maneira, mas usei esse código javascript e me ajudou

 document.addEventListener('touchmove', function(event) {
    event = event.originalEvent || event;
    if(event.scale > 1) {
      event.preventDefault();
    }
  }, false);
Arthur Tsidkilov
fonte
3
Deve serevent.scale !== 1
aleclarson
@aleclarson event.scale> 1 inclui a condição event.scale! == 1
Arthur Tsidkilov
@aleclarson para impedir o zoom no Mobile Safari é suficiente, eu escrevi que não gosto dessa maneira, normalmente para que seja usada a viewport, mas no IOS iphone 6 e superior não está funcionando (acho que o seu event.scale ! == 1 deve ser mais correto, mas tudo isso não é correto, é uma espécie de hacking)
Arthur Tsidkilov
@aleclarson Parece usar! == quebra o navegador nativo no Android 4.4; event.scale é indefinido.
James Pizzurro
3
@JamesPizzurro Sim, você pode usarevent.scale !== undefined && event.scale !== 1
aleclarson
11
user-scalable=0

Isso não funciona mais no iOS 10. A Apple removeu o recurso.

Não há como desativar o site de zoom no iOS agora, a menos que você faça um aplicativo de plataforma bruta.

kiwi com raiva
fonte
Que chatice ... Alguma idéia de por que eles removeram isso?
Stephen Tetreault
3
@smt eles não querem que a experiência na web concorra com a experiência do aplicativo na app store.
Marvin Danig
2
@marvindanig sim ... uma vez que eles cobram uma taxa de 99 $ para produzir um aplicativo que poderia ser facilmente transformado em um aplicativo de página da web mais acessível para todas as plataformas. Também da Apple não pode gostar de uma "experiência na Web", se isso significa que usuários + desenvolvedores podem evitar o jardim murado. É tudo sobre poder e dinheiro da Apple :(
humanityANDpeace
Na verdade, é possível fazer isso funcionar nas versões mais recentes do iOS. Veja minha resposta: stackoverflow.com/a/62165035
Feross
7

Tente adicionar o seguinte ao seu head-tag:

<meta name="viewport" content="width=device-width, initial-scale=1.0, 
minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">

Além disso

<meta name="HandheldFriendly" content="true">

Por fim, como um atributo de estilo ou em seu arquivo css, adicione o seguinte texto para navegadores baseados em webkit:

html {
    -webkit-text-size-adjust: none
}
Lorenz Lo Sauer
fonte
Não funciona em versões mais recentes do iOS
Feross
7

Consegui trabalhar no iOS 12 com o seguinte código:

if (/iPad|iPhone|iPod/.test(navigator.userAgent)) {
  window.document.addEventListener('touchmove', e => {
    if(e.scale !== 1) {
      e.preventDefault();
    }
  }, {passive: false});
}

Com a primeira instrução if, garanto que ela será executada apenas em ambientes iOS (se for executada no Android, o mecanismo de rolagem será quebrado). Além disso, observe a passiveopção definida como false.

José Antonio Postigo
fonte
Não trabalho no meu iOS 12.3.1, aqui está link de teste: https://output.jsbin.com/liqiraj
Jess
4

Isso funciona bem no IOS 10.3.2

    document.addEventListener('touchmove', function(event) {
        event = event.originalEvent || event;
        if (event.scale !== 1) {
           event.preventDefault();
        }
    }, false);

obrigado @arthur e @aleclarson

Nikhil Gowda
fonte
Alteração do iOS 13 false para {passive: false} #
wayofthefuture
4

Eu consegui parar esse comportamento adicionando o seguinte ao cabeçalho HTML. Isso funciona em dispositivos móveis, pois os navegadores da área de trabalho oferecem suporte ao zoom ao usar a roda do mouse. Não é grande coisa nos navegadores de desktop, mas é importante levar isso em conta.

<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />

e a regra a seguir para a folha de estilo CSS

html {
	-webkit-text-size-adjust: none;
	touch-action: manipulation;
}

imelgrat
fonte
Não funciona em versões mais recentes do iOS
Feross
3

Às vezes, essas outras diretivas na contenttag podem atrapalhar o melhor palpite / heurística da Apple sobre como planejar sua página, tudo o que você precisa para desativar o zoom de pitada é.

<meta name="viewport" content="user-scalable=no" />
Alex Borsody
fonte
Não funciona em versões mais recentes do iOS
Feross 03/06
2

No Safari 9.0 e superior, você pode usar a metatag reduzir a ajustar na viewport, como mostrado abaixo

<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
ursuleacv
fonte
Não funciona em versões mais recentes do iOS
Feross 03/06
0

Eu tolamente tinha uma div wrapper que tinha uma largura medida em pixels. Os outros navegadores pareciam ser inteligentes o suficiente para lidar com isso. Depois de converter a largura em um valor percentual, também funcionou bem no Safari mobile. Muito irritante.

.page{width: 960px;}

para

.page{width:93.75%}

<div id="divPage" class="page">
</div>
Welshboy
fonte
0

Usar a touch-actionpropriedade CSS é a solução mais elegante. Testado no iOS 13.5.

Para desativar os gestos de zoom pitada e toque duas vezes para ampliar:

body {
  touch-action: pan-x pan-y;
}

Se o seu aplicativo também não precisar de panorâmica , ou seja, rolagem, use este:

body {
  touch-action: none;
}
Feross
fonte
-3

Para cumprir os requisitos de acessibilidade WAI WCAG 2.0 AA, você nunca deve desativar o zoom de pitada. (WCAG 2.0: SC 1.4.4 Redimensionar texto nível AA). Você pode ler mais sobre isso aqui: Acessibilidade móvel: como as WCAG 2.0 e outras diretrizes do W3C / WAI se aplicam ao celular, 2.2 Zoom / ampliação

haltersweb
fonte
13
Esta não é uma resposta .. e muitos clientes ainda pedem para bloquear o zoom .. por isso não posso aceitar isso como regra geral #
9
O zoom de acessibilidade não é de responsabilidade da página (nem de nenhum aplicativo). É responsabilidade do sistema operacional fornecer uma ferramenta de zoom acessível. Atualmente, todos os sistemas operacionais oferecem esse recurso, que se aplica como um zoom na tela , e não deve interferir no próprio zoom da página, porque não se destina à acessibilidade.
Bruno Finger
4
Sempre existem casos de uso válidos para coisas assim. Por alguma razão, praticamente toda a literatura da Web parece assumir que a Web é apenas para criar blogs. Assim como existem casos de uso válidos para JavaScript eval(), também existem para desativar o zoom. Estou usando-o para um aplicativo Web usado em combinação com um scanner Bluetooth, para impedir o zoom da página quando um código de barras é lido.
user128216
3
Concordo plenamente com os objetivos das recomendações de acessibilidade, mas não há dúvida de que há momentos em que o zoom não é desejado ou necessário, ou pode até prejudicar a experiência do usuário. Além disso, você sabe, clientes.
Chuck Le Butt
2
Eu diria que em um aplicativo html / javascript, essas diretrizes não se aplicam. Afinal, um aplicativo nativo permitiria aumentar e diminuir o zoom?
Jörgen Sigvardsson
-5

Este deve estar trabalhando no iphone etc.

<meta name="viewport" content="width=device-width, initial-scale=1 initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
Cihan Zengin
fonte