Come si disabilita lo zoom delle finestre su Mobile Safari?


393

Ho provato tutti e tre questi inutilmente:

<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;” />

ognuno di essi ha valori diversi che ho trovato raccomandati dalla ricerca google o dalla ricerca SO, ma nessuno dei valori " user-scalable = X " sembra funzionare

Ho anche provato la virgola che delimita i valori anziché il punto e virgola, senza fortuna. Poi ho provato SOLO a presentare il user-scalablevalore, ancora senza fortuna.


AGGIORNARE

Capito dal sito di Apple e funziona:

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

si scopre che il problema erano le virgolette non standard perché avevo copiato il meta tag da un sito Web che le stava usando, whoops


6
Se stai realizzando un gioco, è probabilmente possibile controllare lo zoom. Tuttavia, in quasi tutti gli altri casi dovrebbe essere fortemente scoraggiato. Sfortunatamente è diventata una pratica standard per molti sviluppatori mobili. Se un utente desidera eseguire lo zoom in avanti per poter leggere il testo più facilmente ecc., Impedendo loro di farlo, non è molto bello.
user2268788

72
Stiamo disattivando lo zoom su un'applicazione basata sul Web mobile. Non puoi ingrandire le app iOS native e non è richiesto nella nostra applicazione web. Se il tuo sito o la tua app sono ottimizzati per dispositivi mobili, i tuoi utenti non dovranno zoomare. Ci sono sempre casi d'uso per disabilitare lo zoom. Non deve essere sempre in un modo o nell'altro.
Bradley Flood

10
Sì, non sto seguendo la linea logica che disabilitare lo zoom su un sito ottimizzato per dispositivi mobili è una cosa negativa . Quel che è peggio è che la finestra viene spostata accidentalmente in giro perché lo schermo sta rilevando una panoramica accidentale e lo zoom in ingresso su un sito che non richiede comunque lo zoom. Realisticamente se i tuoi utenti hanno bisogno di ingrandire i contenuti del tuo sito ottimizzato per dispositivi mobili, il problema è il design, non la mancanza di zoom.
Nathan Hornby,

3
@NathanHornby: il problema di disabilitare lo zoom è la mancanza di rispetto delle preferenze dell'utente. Utenti diversi preferiscono dimensioni di testo diverse, un pubblico più giovane con una buona vista potrebbe preferire vedere più contenuti, mentre un pubblico con una vista scarsa non può usare nulla che non abbia un testo gigante. Altre persone hanno il Parkinson ma hanno ancora una buona vista, quindi preferiscono pulsanti extra-large ma non traggono vantaggio da un testo di grandi dimensioni in generale.
Lie Ryan,

4
@NathanHornby Non significa che il designer abbia necessariamente fatto qualcosa di sbagliato. Significa semplicemente che l'utente, per qualsiasi motivo, desidera ingrandire. Lo zoom con pizzico è una funzione standard di tutti i telefoni touch-screen. Qualsiasi utente che possiede un telefono di questo tipo, sa come usarlo. So che è una vecchia domanda, ma sono ancora costantemente frustrato da tutti gli sviluppatori che insistono nel rompere la funzionalità del mio telefono perché pensano che renda i loro progetti più belli.
user1751825

Risposte:


718

Il tuo codice mostra le virgolette doppie degli attributi come doppie virgolette fantasiose. Se nel tuo vero codice sorgente sono presenti le virgolette, immagino che questo sia il problema.

Questo funziona per me su Mobile Safari in iOS 4.2.

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

12
erano le virgolette, avevo copiato il tag da un sito Web senza accorgermene, grazie per averlo sottolineato!
MetaGuru,

5
Forse questo è alla lunga coda qui, ma potrebbe valere la pena sottolineare che questo deve essere applicato nella pagina "di livello superiore". Se hai applicato questo metatag a un iframe, non funzionerà a meno che il metatag non sia applicato anche alla pagina più in alto.
founddrama,

2
Perché qualcuno dovrebbe mai creare un software che crea citazioni fantasiose è al di là di me.
Traubenfuchs,

3
@Traubenfuchs: Tipografia.
BoltClock

3
Questa è una risposta piuttosto vecchia e arrivando al problema che avevo letto che se si imposta scalabile dall'utente su no questo causerebbe problemi di accessibilità. A partire da iOS 10 funziona bene, consentendo all'utente di ingrandire se lo desidera, ma non ingrandire la casella di input in caso contrario. Non è necessario impostare caratteri di grandi dimensioni.
David,

161

Per le persone in cerca di una soluzione iOS 10, user-scaleable=noè disabilitato in Safari per iOS 10. Il motivo è che Apple sta cercando di migliorare l'accessibilità consentendo alle persone di ingrandire le pagine Web.

Dalle note di rilascio :

Per migliorare l'accessibilità sui siti Web in Safari, gli utenti possono ora pizzicare con lo zoom anche quando un sito Web imposta scalabile dall'utente = no nella finestra.

Per quanto ho capito, siamo sfortunati.


6
Che decisione terribile di Apple. L'uso di uno spinner con i pulsanti "-" e "+" per ridurre / incrementare un numero ora ingrandisce e rimpicciolisce ripetutamente la pagina su iOS Safari. Le macchine da stampa vengono interpretate come doppio tocco per ingrandire, senza alcun modo per disabilitarlo. iOS Chrome funziona perfettamente. Frustrante.
Paolo,

5
Anche se sono fregato da quella decisione, ma sono davvero contento di Apple come utente poiché volevo forzare questa funzione in molti siti Web che utilizzavano piccoli elementi all'interno.
Bishoy Hanna l'

10
il mondo andrà all'inferno
omino

2
Oh cavolo, chi avrebbe indovinato? Un'altra scelta ridicola fatta da Apple
Emil Pedersen l'

3
Lascia a Apple il
compito

98

@mattis ha ragione sul fatto che iOS 10 Safari non ti consentirà di disabilitare il pizzico per eseguire lo zoom con l'attributo scalabile dall'utente. Tuttavia, l'ho trovato per disabilitare l'utilizzo di preventDefault sull'evento 'gesturestart'. L'ho verificato solo su Safari in iOS 10.0.2.

document.addEventListener('gesturestart', function (e) {
    e.preventDefault();
});

8
Su iOS 10, ho scoperto che funzionava, ma se si scorre la pagina e si esegue lo zoom con il pizzico mentre si continua a scorrere, si consente lo zoom. Quindi ti ritrovi bloccato al nuovo livello di zoom fino a quando non scorri di nuovo. Quindi questa non sembra una buona soluzione a meno che il tuo corpo della pagina non sia scorrevole. :(
Rand Scullard,

1
Un avvertimento: l'utente può ancora toccare due volte lo schermo che sarà / può zoomare e non ne viene catturato.
Stephen,

1
A volte consente ancora lo zoom toccando due volte lo schermo. :(
Jarzka,

4
A cosa equivale il "doppio tocco" gesturestart? dblclick ?
Lowtechsun

3
Un'altra nota, se si desidera disabilitare l'aspetto del doppio tocco dello zoom. Mobile Safari supporta anche "touch-action: manipolazione" (rientra nel "supporto di base", che disabilita gli eventi di doppio tocco. Documentazione qui: developer.mozilla.org/en-US/docs/Web/CSS/touch-action
jeremypress

15

per iPhone Safari fino a iOS 10 "viewport" non è una soluzione, non mi piace in questo modo, ma ho usato questo codice javascript e mi ha aiutato

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

3
Dovrebbe essereevent.scale !== 1
aleclarson

@aleclarson event.scale> 1 include condition event.scale! == 1
Arthur Tsidkilov

@aleclarson per impedire lo zoom su Mobile Safari è abbastanza, ho scritto che non mi piace in questo modo, normalmente per usare il viewport, ma su IOS iPhone 6 e versioni successive non funziona (penso che il tuo evento.scale ! == 1 dovrebbe essere più corretto, ma tutto ciò non è corretto, è una specie di hacking)
Arthur Tsidkilov,

@aleclarson Sembra usare! == rompe il browser nativo in Android 4.4; event.scale non è definito.
James Pizzurro,

3
@JamesPizzurro Sì, puoi usareevent.scale !== undefined && event.scale !== 1
aleclarson il

11
user-scalable=0

Questo non funziona più su iOS 10. Apple ha rimosso la funzione.

Non è possibile disabilitare ora il sito Web di zoom su iOS, a meno che non si realizzi un'app di piattaforma lorda.


Che peccato ... Qualche idea sul perché l'hanno rimosso?
Stephen Tetreault,

3
@smt non vogliono che l'esperienza web sia in concorrenza con l'esperienza dell'app sull'app store.
Marvin Danig,

2
@marvindanig sì ... dal momento che prendono una commissione di 99 $ per produrre un'app che altrimenti potrebbe facilmente diventare un'applicazione per pagine Web più accessibile per tutte le piattaforme. Anche di Apple non può piacere una "esperienza web", se ciò significa che utenti + sviluppatori possono evitare il giardino recintato. Si tratta di potere e denaro di Apple :(
umanità e

In realtà è possibile farlo funzionare su versioni iOS più recenti. Vedere la mia risposta: stackoverflow.com/a/62165035
Feross

7

Prova ad aggiungere quanto segue al tuo head-tag:

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

Inoltre

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

Infine, come attributo di stile o nel tuo file css, aggiungi il seguente testo per i browser basati su webkit:

html {
    -webkit-text-size-adjust: none
}

Non funziona con le versioni iOS più recenti
Feross il

7

L'ho fatto funzionare in iOS 12 con il seguente codice:

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

Con la prima dichiarazione if mi assicuro che verrà eseguito solo in ambienti iOS (se viene eseguito in Android, il comportamento di scorrimento verrà interrotto). Inoltre, notare l' passiveopzione impostata su false.


Non funziona sul mio iOS 12.3.1, ecco il link di prova: https://output.jsbin.com/liqiraj
Jess

4

Funziona bene in IOS 10.3.2

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

grazie @arthur e @aleclarson


iOS 13 cambia falso in {passivo: falso}
wayofthefuture il

4

Sono riuscito a interrompere questo comportamento aggiungendo quanto segue all'intestazione HTML. Funziona su dispositivi mobili, poiché i browser desktop supportano lo zoom quando si utilizza la rotellina del mouse. Non è un grosso problema sui browser desktop, ma è importante tenerne conto.

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

e la seguente regola per il foglio di stile CSS

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


Non funziona con le versioni iOS più recenti
Feross il

3

a volte quelle altre direttive nel contenttag possono confondere la migliore ipotesi / euristica di Apple su come impaginare la tua pagina, tutto ciò che serve per disabilitare lo zoom con pizzico è.

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

Non funziona su versioni iOS più recenti
Feross,

2

In Safari 9.0 e versioni successive puoi utilizzare il ridimensionamento per adattarlo al metatag della finestra come mostrato di seguito

<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">

Non funziona su versioni iOS più recenti
Feross,

0

Ho stupidamente avuto un div wrapper che aveva una larghezza misurata in pixel. Gli altri browser sembravano abbastanza intelligenti da occuparsene. Dopo aver convertito la larghezza in un valore percentuale, ha funzionato bene anche su Safari mobile. Molto noioso.

.page{width: 960px;}

per

.page{width:93.75%}

<div id="divPage" class="page">
</div>

0

L'uso della touch-actionproprietà CSS è la soluzione più elegante. Testato su iOS 13.5.

Per disabilitare i gesti di zoom con pizzico e toccare due volte per ingrandire:

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

Se anche la tua app non ha bisogno di panning , ad esempio scorrimento, usa questo:

body {
  touch-action: none;
}

-3

Per soddisfare i requisiti di accessibilità WAI WCAG 2.0 AA non è mai necessario disabilitare lo zoom con pizzico. (WCAG 2.0: SC 1.4.4 Ridimensiona livello testo AA). Puoi leggere ulteriori informazioni qui: Accessibilità mobile: come WCAG 2.0 e altre linee guida W3C / WAI si applicano al cellulare, 2.2 Zoom / Ingrandimento


13
Questa non è una risposta .. e molti clienti ancora chiedono di bloccare lo zoom .. quindi non posso prenderlo come regola generale

9
Lo zoom dell'accessibilità non è responsabilità della pagina (né di alcuna app). È responsabilità del sistema operativo fornire uno strumento di zoom accessibile. Al giorno d'oggi ogni sistema operativo fornisce tale funzionalità, che si applica come uno zoom dello schermo e non dovrebbe interferire con lo zoom della pagina stessa, poiché non è inteso per l'accessibilità.
Bruno Finger,

4
Ci sono sempre casi d'uso validi per cose come questa. Per qualche ragione, praticamente tutta la letteratura web sembra presumere che il web sia solo per fare blog. Proprio come ci sono casi d'uso validi per JavaScript eval(), così ci sono per disabilitare lo zoom. Lo sto usando per un'app Web che viene utilizzata in combinazione con uno scanner Bluetooth, per impedire lo zoom della pagina durante la scansione di un codice a barre.
user128216

3
Sono completamente d'accordo con gli obiettivi delle raccomandazioni sull'accessibilità, ma non c'è dubbio che ci sono momenti in cui lo zoom non è desiderato o necessario, o potrebbe persino interrompere l'esperienza dell'utente. Inoltre, sai, clienti.
Chuck Le Butt,

2
Direi che in un'app html / javascript, queste linee guida non si applicano. Dopotutto, un'app nativa ti permetterebbe di ingrandire o ridurre?
Jörgen Sigvardsson,

-5

Questo dovrebbe funzionare su iPhone ecc.

<meta name="viewport" content="width=device-width, initial-scale=1 initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.