Impedisci all'iPhone di aumentare lo zoom su `select` nella web-app


86

Ho questo codice:

<select>
    <option value="c">Klassen</option>
    <option value="t">Docenten</option>
    <option value="r">Lokalen</option>
    <option value="s">Leerlingen</option>
</select>

In esecuzione in un'app Web a schermo intero su iPhone.

Quando si seleziona qualcosa da questo elenco, l'iPhone ingrandisce l' selectelemento. E non riduce lo zoom dopo aver selezionato qualcosa.

Come posso impedirlo? O rimpicciolire?

Risposte:


107

Probabilmente è perché il browser sta tentando di ingrandire l'area poiché la dimensione del carattere è inferiore alla soglia, questo generalmente accade in iphone.

Dare un attributo metatag "user-scalable = no" impedirà all'utente di eseguire lo zoom altrove. Poiché il problema riguarda solo l'elemento selezionato , prova a utilizzare quanto segue nel tuo css, questo hack è originariamente utilizzato per jquery mobile.

HTML:

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

CSS:

select{
font-size: 50px;
}

src: rimuovi lo zoom dopo aver selezionato in iphone


21
Se il testo è visibile (come nel mio caso) sembra che 16px sia il minimo prima di abilitare lo zoom.
Marlon Creative

6
Giusto per renderlo più chiaro, questa riga impedirà la scalabilità automatica:$('<meta>', {name: 'viewport',content: 'user-scalable=no'}).appendTo('head');
Abbas

11
Da quando il testo è nascosto in un elemento select ?? "Non porterà problemi di layout"
Bill

1
@ Billy voglio dire, quando alla dimensione del carattere viene assegnato un valore di 50px, sembra strano su altri elementi html rispetto a un menu a discesa, che ho chiamato problema di layout.
Sasi Dhar

1
Ma se è necessario consentire la scalabilità dall'utente per problemi di accessibilità o per qualsiasi altro motivo, vedere la risposta sotto stackoverflow.com/questions/6483425/…
gota

53

scalabile dall'utente = no è ciò di cui hai bisogno, solo così c'è effettivamente una risposta definitiva a questa domanda

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

4
In realtà, l'aggiunta di width = device-width, initial-scale = 1.0, maximum-scale = 1.0 dovrebbe essere sufficiente. Non credo che tu abbia bisogno di scalabilità utente con scala massima.
Dan Smart

2
@DanSmart, almeno nel mio caso (e non so cosa lo distingua), la scala min / max non era sufficiente: l'aggiunta di scalabile dall'utente = no ha fatto la differenza.
corolla

8
Questo sembra un approccio molto pesante: consiglio di utilizzare scalabile dall'utente = no con cautela. Da Dev.Opera , "È anche possibile disattivare completamente lo zoom, tuttavia tieni presente che lo zoom è un'importante funzione di accessibilità che viene utilizzata da molte persone. La disattivazione dovrebbe quindi avvenire solo quando veramente necessario, ad esempio per alcuni tipi di giochi e applicazioni. "
Charlie Stanard

4
scalabile dall'utente viene ignorato a partire da iOS 10.
nickdnk

1
Quando il tuo font è più grande di 16px, il browser potrebbe rimpicciolire quando focalizzi un input. Per me, ho solo bisogno di aggiungere minimum-scale=1, che preserva anche la possibilità dell'utente di ingrandire.
Micros

33

Questo sembrava funzionare per il mio caso nell'affrontare questo problema:

@media screen and (-webkit-min-device-pixel-ratio: 0) {
select:focus, textarea:focus, input:focus {
        font-size: 16px;
    }
}

Suggerito qui da Christina Arasmo Beymer


2
Nel mio caso IOS 7x il vecchio scalabile dall'utente non era sufficiente. Quanto sopra ha funzionato, grazie per la condivisione.
atterrato il

27

iPhone ingrandirà leggermente i campi del modulo se il testo è impostato su meno di 16 pixel . Suggerirei di impostare il testo del campo del modulo mobile su 16 pixel e quindi sovrascrivere le dimensioni per il desktop.

Le risposte che dicono di disabilitare lo zoom non sono utili per gli utenti ipovedenti potrebbero comunque voler ingrandire i cellulari più piccoli.

Esempio:

# Mobile first
input, textarea, select {
  font-size: 16px;
}

# Tablet upwards
@media (min-width: 768px) {
  font-size: 14px;
}

Quello è buono! Ma cosa succede se il mio testo supera l'intera larghezza della casella di selezione? Cosa posso fare in questo caso?
gota

Se il messaggio dell'opzione iniziale si adatta, dovrebbe essere sufficiente. Come una volta selezionata un'opzione, anche se leggermente troncata probabilmente ricorderanno di cosa si trattava. Ma sì, più di un problema se dice "Per favore scegli un Co ..."
martinedwards

Questa risposta funziona e sembra offrire il metodo meno invadente. Grazie!
DeBraid

6

Sono un po 'in ritardo per la festa, ma ho trovato una soluzione alternativa piuttosto ordinata che risolve questo problema solo con la manipolazione CSS. Nel mio caso non ho potuto modificare la dimensione del carattere per motivi di progettazione e non ho potuto disabilitare lo zoom.

Poiché l'iPhone ingrandirà leggermente i campi del modulo se il testo è impostato su meno di 16 pixel, possiamo indurre l'iPhone a pensare che la dimensione del carattere sia 16px e quindi trasformarla nella nostra dimensione.

Ad esempio, prendiamo l'esempio quando il nostro testo è 14px, quindi ingrandisce perché è più piccolo di 16px. Quindi possiamo trasformare la scala, secondo 0,875.

Nell'esempio seguente ho aggiunto il riempimento per mostrare come convertire di conseguenza altre proprietà.

.no-zoom {
    font-size: 16px;
    transform-origin: top left;
    transform: scale(0.875);            //  14px / 16px
    padding: 4.57px;                    // 4px / 0.875
}

Spero possa essere d'aiuto!


È un trucco brutto ma anche intelligente e non mi piacciono gli hack ... ma in questo caso è la migliore risposta su questa pagina e non c'è alternativa se devi fermare lo zoom e vuoi comunque mantenere il design così com'è . Molte grazie! :)
roNn23

2

Prova questo:

function DisablePinchZoom() 
{
    $('meta[name=viewport]').attr("content", "");
    $('meta[name=viewport]').attr("content", "width=yourwidth, user-scalable=no");
}

function myFunction() 
{
    $('meta[name=viewport]').attr("content", "width=1047, user-scalable=yes");
}


<select id="cmbYo" onchange="javascript: myFunction();" onclick="javascript: DisablePinchZoom();">
</select>

DisablePinchZoom verrà attivato prima di onchange, quindi lo zoom sarà disabilitato nel momento in cui viene attivato onchange. Sulla funzione onchange, al termine, è possibile ripristinare la situazione iniziale.

Testato su un iPhone 5S


2

iOS ingrandisce la pagina per mostrare un campo di input più grande se la dimensione del carattere è inferiore a 16 px.

solo al clic di qualsiasi campo, esegue lo zoom della pagina. quindi, al clic, lo stiamo impostando come 16px e poi cambiato al valore predefinito

sotto lo snippet funziona bene per me e mirato ai dispositivi mobili,

@media screen and (max-width: 767px) {
 select:active, input:active,textarea:active{
        font-size: 16px;
 }
}


1

Imposta la dimensione del carattere "seleziona" su 16 px

seleziona {font-size: 16px; }


0

Non credo che tu possa fare nulla riguardo al comportamento da solo.

Una cosa che puoi provare è impedire del tutto lo zoom della pagina. Questo va bene se la tua pagina è progettata per il telefono.

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

Un'altra cosa che potresti provare è usare un costrutto JavaScript invece dell'istruzione generica "select". Crea un div nascosto per mostrare il tuo menu, elabora i clic in javascript.

In bocca al lupo!


0

Come risposto qui: Disabilita lo zoom automatico nel tag "Testo" di input - Safari su iPhone

Puoi impedire a Safari di ingrandire automaticamente i campi di testo durante l'input dell'utente senza disabilitare la capacità dell'utente di pizzicare lo zoom. Basta aggiungere maximum-scale=1ma tralasciare l'attributo di scala utente suggerito in altre risposte.

È un'opzione utile se hai un modulo in un livello che "fluttua" se ingrandito, il che può causare lo spostamento di elementi importanti dell'interfaccia utente fuori dallo schermo.

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">


0

Prova ad aggiungere questo CSS per disabilitare lo stile predefinito di Ios:

-webkit-appearance: none;

Questo funzionerà anche su altri elementi che ottengono uno stile speciale, come input [type = search].


0

Ho letto per alcune ore su questo e la soluzione migliore è questo jquery qui. Questo aiuta anche con l'opzione "scheda successiva" in Safari iOS. Ho anche degli input qui, ma sentiti libero di rimuoverli o aggiungerli come preferisci. Fondamentalmente il mousedown si attiva prima dell'evento focus e induce il browser a pensare ai suoi 16px. Inoltre, il focusout si attiverà nella funzione "scheda successiva" e ripeterà il processo.

$(function(){
    $('input, select').on("mousedown focusout", function(){
        $('input, select').css('font-size','16px');
    });
    $('input, select').on("focus", function(){
        $('input, select').css('font-size','');
    });
})
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.