J'ai créé une page HTML avec une <input>
balise type="text"
. Lorsque je clique dessus en utilisant Safari sur iPhone, la page s'agrandit (zoom automatique). Quelqu'un sait-il comment désactiver cela?
html
iphone
zoom
mobile-safari
html-input
Eduardo Monténégro
la source
la source
Réponses:
Le navigateur zoomera si la taille de police est inférieure à
16px
et la taille de police par défaut pour les éléments de formulaire est11px
(au moins dans Chrome et Safari).De plus, l'
select
élément doit avoir lafocus
pseudo-classe attachée.Il est pas nécessaire d'utiliser tout ce qui précède, vous pouvez simplement le style des éléments dont vous avez besoin, par exemple: il suffit
text
,number
ettextarea
:Solution alternative pour que les éléments d'entrée héritent d'un style parent:
la source
select, textarea, input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"] { font-size: 16px; }
select:focus
. Avait aussi le même problème.Vous pouvez empêcher Safari de zoomer automatiquement sur les champs de texte lors de la saisie par l'utilisateur sans désactiver la possibilité pour l'utilisateur de pincer le zoom. Ajoutez simplement
maximum-scale=1
mais omettez l'attribut à l'échelle de l'utilisateur suggéré dans d'autres réponses.C'est une option intéressante si vous avez un formulaire dans une couche qui "flotte" autour si vous zoomez, ce qui peut entraîner le déplacement d'éléments importants de l'interface utilisateur hors de l'écran.
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
la source
Nouveau: IOS zoomera toujours, sauf si vous utilisez 16px sur l'entrée sans la mise au point.
J'ai ajouté un arrière-plan car IOS n'ajoute aucun arrière-plan à la sélection.
la source
@media screen and (-webkit-min-device-pixel-ratio:0) and (max-device-width:1024px)
pour limiter l'effet à l'iPhone, mais ne modifiez pas les sites Web lorsqu'ils sont affichés dans Chrome.@supports (-webkit-overflow-scrolling: touch)
, car cette fonctionnalité CSS n'existe que sur iOSSi votre site Web est correctement conçu pour un appareil mobile, vous pouvez décider de ne pas autoriser la mise à l'échelle.
Cela résout le problème autour duquel votre page ou formulaire mobile va «flotter».
la source
En résumé, la réponse est: définissez la taille de la police des éléments du formulaire sur au moins 16 pixels
la source
font-size: 100%
valeur et saisit les 16 pixels nécessaires.la source
1em
, ou100%
). Si vous définissez une taille de police personnalisée, vous pouvez définir lefont-size
dans votre extrait de code16px
pour éviter le zoom automatique.1em
ni l' autre1rem
n'est une solution appropriée car les deux peuvent être inférieurs à16px
et Safari nécessite au moins16px
de ne pas zoomer.Le moyen approprié de résoudre ce problème consiste à remplacer la fenêtre d'affichage des métadonnées par:
la source
Il n'y a aucun moyen propre que je pourrais trouver, mais voici un hack ...
1) J'ai remarqué que l'événement survol survient avant le zoom, mais le zoom se produit avant les événements de mousedown ou focus.
2) Vous pouvez modifier dynamiquement la balise de la fenêtre META en utilisant javascript (voir Activer / désactiver le zoom sur Safari iPhone avec Javascript? )
Donc, essayez ceci (indiqué dans jquery pour la compacité):
C'est certainement un hack ... il peut y avoir des situations où le survol / le bas n'attrape pas toujours les entrées / sorties, mais cela a bien fonctionné dans mes tests et c'est un bon début.
la source
Ajouter une échelle utilisateur = 0 pour afficher la méta comme suit
A travaillé pour moi :)
la source
J'ai récemment (aujourd'hui: D) dû intégrer ce comportement. Afin de ne pas impacter les champs de conception d'origine, y compris le combo, j'ai choisi d'appliquer la transformation au centre du champ:
la source
Comme de nombreuses autres réponses l'ont déjà souligné, cela peut être obtenu en ajoutant
maximum-scale
à laviewport
balise META. Cependant, cela a pour conséquence négative de désactiver le zoom utilisateur sur les appareils Android . ( Il ne désactive pas le zoom utilisateur sur les appareils iOS depuis la v10 .)Nous pouvons utiliser JavaScript pour ajouter dynamiquement
maximum-scale
à la métaviewport
lorsque l'appareil est iOS. Cela permet d'obtenir le meilleur des deux mondes: nous permettons à l'utilisateur de zoomer et d' empêcher iOS de zoomer sur les champs de texte sur le focus.Code:
la source
addMaximumScaleToMetaViewport
? Est-ce uniquement pour des raisons sémantiques?Le hack Javascript qui fonctionne sur iOS 7. Il est basé sur la réponse de @dlo mais les événements mouseover et mouseout sont remplacés par les événements touchstart et touchend. Fondamentalement, ce script ajoute un délai d'attente d'une demi-seconde avant que le zoom ne soit à nouveau activé pour empêcher le zoom.
la source
Cela a fonctionné pour moi:
la source
J'ai utilisé la solution de Christina ci-dessus, mais avec une petite modification pour le bootstrap et une autre règle à appliquer aux ordinateurs de bureau. La taille de police par défaut de Bootstrap est 14px, ce qui provoque le zoom. Ce qui suit le change en 16px pour les "contrôles de formulaire" dans Bootstrap, empêchant le zoom.
Et revenons à 14px pour les navigateurs non mobiles.
J'ai essayé d'utiliser .form-control: focus, qui l'a laissé à 14px, sauf sur la mise au point qui l'a changé en 16px et cela n'a pas résolu le problème du zoom avec iOS8. Au moins sur mon iPhone utilisant iOS8, la taille de la police doit être de 16 pixels avant de se concentrer pour que l'iPhone ne zoome pas sur la page.
la source
Je l'ai fait, également avec jQuery:
Bien sûr, certains autres éléments de l'interface peuvent devoir être adaptés si cette
16px
taille de police casse le design.la source
Après un certain temps, j'ai trouvé cette solution
Sur "mousedown", il définit la taille de police de l'entrée à 16 pixels. Cela empêchera le zoom. Lors de l'événement focus, la taille de police revient à sa valeur initiale.
Contrairement aux solutions publiées précédemment, cela vous permettra de définir la taille de police de l'entrée comme vous le souhaitez.
la source
Après avoir lu presque toutes les lignes ici et testé les différentes solutions, voici, grâce à tous ceux qui ont partagé leurs solutions, ce que j'ai trouvé, testé et travaillé pour moi sur iPhone 7 iOS 10.x:
Il présente cependant certains inconvénients, notablement un "saut" en raison du changement rapide de taille de police qui se produit entre les états de "survol" et de "mise au point" - et l'impact du redessin sur les performances.
la source
Inspiré par la réponse de @jirikuchta, j'ai résolu ce problème en ajoutant ce peu de CSS:
Pas de JS, et je ne remarque aucun flash ou quoi que ce soit.
Il convient de noter qu'un
viewport
avecmaximum-scale=1
fonctionne également, mais pas lorsque la page est chargée en tant que iframe, ou si vous avez un autre script modifiant leviewport
, etc.la source
Les pseudo-éléments comme
:focus
ne fonctionnent plus comme avant. Depuis iOS 11, une simple déclaration de réinitialisation peut être ajoutée avant vos styles principaux (à condition de ne pas les remplacer avec une taille de police plus petite).Il convient de mentionner que pour les bibliothèques CSS telles que Tachyons.css, il est facile de remplacer accidentellement la taille de votre police.
Par exemple, class:
f5
est équivalent à:fontSize: 1rem
ce qui est bien si vous avez conservé l'échelle de police du corps par défaut.Cependant: si vous choisissez la classe de taille de police:
f6
ce sera équivalent àfontSize: .875rem
sur un petit écran vers le haut. Dans ce cas, vous devrez être plus précis sur vos déclarations de réinitialisation:la source
Par ailleurs, si vous utilisez Bootstrap , vous pouvez simplement utiliser cette variante:
la source
J'ai dû "corriger" le problème du zoom automatique dans les contrôles de formulaire pour un site Web de l'université néerlandaise (qui utilisait 15 pixels dans les contrôles de formulaire). Je suis venu avec l'ensemble d'exigences suivantes:
Voici ce que j'ai trouvé jusqu'à présent:
Quelques notes:
la source
Au lieu de simplement définir la taille de la police sur 16 pixels, vous pouvez:
scale()
transformation CSS et les marges négatives pour réduire le champ de saisie à la taille correcte.Par exemple, supposons que votre champ de saisie soit initialement stylisé avec:
Si vous agrandissez le champ en augmentant toutes les dimensions de 16/12 = 133,33%, puis réduisez en utilisant
scale()
de 12/16 = 75%, le champ de saisie aura la bonne taille visuelle (et la taille de police), et il n'y aura pas de zoom sur concentrer.Comme cela
scale()
n'affecte que la taille visuelle, vous devrez également ajouter des marges négatives pour réduire la taille logique du champ.Avec ce CSS:
le champ de saisie aura une taille de police logique de 16 pixels tout en semblant avoir du texte 12 pixels.
J'ai un article de blog où j'entre dans un peu plus de détails, et j'ai cet exemple en HTML visible:
Pas de zoom d'entrée dans Safari sur iPhone, le moyen parfait pour les pixels
la source
Même avec ces réponses, il m'a fallu trois jours pour comprendre ce qui se passait et j'aurai peut-être besoin de la solution à l'avenir.
Ma situation était légèrement différente de celle décrite.
Dans le mien, j'avais un texte contentable dans une div sur la page. Lorsque l'utilisateur a cliqué sur une div différente, un bouton en quelque sorte, j'ai automatiquement sélectionné du texte dans la div modifiable (une plage de sélection qui avait été précédemment enregistrée et effacée), j'ai exécuté une commande execCommand de texte enrichi sur cette sélection et l'ai effacée à nouveau.
Cela m'a permis de changer invisiblement les couleurs du texte en fonction des interactions des utilisateurs avec les divisions de couleurs ailleurs sur la page, tout en gardant la sélection normalement cachée pour leur permettre de voir les couleurs dans le contexte approprié.
Eh bien, sur Safari sur iPad, cliquer sur la couleur div a entraîné l'apparition du clavier à l'écran, et rien de ce que j'ai fait ne l'a empêché.
J'ai finalement compris comment l'iPad faisait ça.
Il écoute une séquence de démarrage et de contact qui déclenche une sélection de texte modifiable.
Lorsque cette combinaison se produit, elle affiche le clavier à l'écran.
En fait, il fait un zoom dolly où il développe la page sous-jacente tout en zoomant sur le texte modifiable. Cela m'a pris un jour juste pour comprendre ce que je voyais.
Donc, la solution que j'ai utilisée était d'intercepter à la fois le démarrage et le toucher sur ces divisions de couleurs particulières. Dans les deux gestionnaires, j'arrête la propagation et le bouillonnement et renvoie false. Mais dans l'événement tactile, je déclenche le même comportement que celui déclenché par le clic.
Donc, avant, Safari déclenchait ce que je pensais être "touchstart", "mousedown", "touchend", "mouseup", "click", et à cause de mon code, une sélection de texte, dans cet ordre.
La nouvelle séquence en raison des interceptions est simplement la sélection de texte. Tout le reste est intercepté avant que Safari puisse le traiter et faire son truc de clavier. Les interceptions touchstart et touchend empêchent également les événements de la souris de se déclencher, et dans le contexte, cela est tout à fait correct.
Je ne connais pas un moyen plus simple de décrire cela, mais je pense qu'il est important de l'avoir ici parce que j'ai trouvé ce fil dans l'heure suivant la première rencontre avec le problème.
Je suis sûr à 98% que le même correctif fonctionnera avec les zones de saisie et tout le reste. Interceptez les événements tactiles et traitez-les séparément sans les laisser se propager ou bouillonner, et envisagez de faire des sélections après un petit délai juste pour vous assurer que Safari ne reconnaît pas la séquence comme déclencheur du clavier.
la source
Je vois des gens ici faire des choses étranges avec JavaScript ou la fonction de fenêtre et désactiver tous les zooms manuels sur les appareils. À mon avis, cela ne devrait pas être une solution. L'ajout de cet extrait CSS désactivera le zoom automatique dans iOS sans changer votre taille de police en un nombre fixe comme 16px.
Par défaut, j'utilise une taille de police de 93,8% (15px) dans les champs de saisie et en ajoutant mon extrait de code CSS, cela reste à 93,8%. Pas besoin de changer en 16px ou d'en faire un nombre fixe.
la source
La définition d'une taille de police (pour les champs de saisie) égale à la taille de la police du corps semble être ce qui empêche le navigateur de faire un zoom avant ou arrière. Je suggère d'utiliser
font-size: 1rem
une solution plus élégante.la source
Comme le zoom avant automatique (sans zoom arrière) est toujours ennuyeux sur iPhone, voici un JavaScript basé sur la suggestion de dlo de travailler avec le focus / flou.
Le zoom est désactivé dès qu'une entrée de texte est interrompue et réactivé lorsque l'entrée est laissée.
Remarque: Certains utilisateurs peuvent ne pas apprécier l'édition de textes dans une petite entrée de texte! Par conséquent, je préfère personnellement changer la taille du texte de l'entrée lors de l'édition (voir le code ci-dessous).
Le code suivant changera la taille du texte d'une entrée à 16 pixels (calculée, c'est-à-dire dans la taille de zoom actuelle) pendant que l'élément a le focus. L'iPhone ne zoomera donc pas automatiquement.
Remarque: Le facteur de zoom est calculé en fonction de window.innerWidth et de l'affichage de l'iPhone avec 320 pixels. Cela ne sera valable que pour l'iPhone en mode portrait.
la source
Il m'a fallu du temps pour le trouver, mais voici le meilleur code que j'ai trouvé ...... http://nerd.vasilis.nl/prevent-ios-from-zooming-onfocus/
la source
Basé sur la réponse de Stephen Walsh ... Ce code fonctionne sans changer la taille de la police des entrées sur le focus (qui semble boiteux), et il fonctionne toujours avec FastClick , que je suggère d'ajouter à tous les sites mobiles pour aider à apporter le "snappy". Ajustez votre "largeur de fenêtre" en fonction de vos besoins.
la source
Un commentaire pour la meilleure réponse sur la définition de la taille de la police à 16 pixels a demandé comment cela était une solution, et si vous vouliez une police plus grande / plus petite.
Je ne sais pas tout de vous, mais utiliser px pour les tailles de police n'est pas la meilleure solution, vous devriez les utiliser.
J'ai rencontré ce problème sur mon site réactif où mon champ de texte est supérieur à 16 pixels. J'ai eu mon conteneur de formulaires défini sur 2rem et mon champ de saisie sur 1.4em. Dans mes requêtes mobiles, je change la taille de police html en fonction de la fenêtre d'affichage. Étant donné que le code HTML par défaut est 10, mon champ de saisie est calculé à 28 pixels sur le bureau
Pour supprimer le zoom automatique, j'ai dû changer mon entrée à 1.6em. Cela a augmenté ma taille de police à 32 pixels. Juste un peu plus haut et à peine perceptible. Sur mon iPhone 4 et 5, je change ma taille de police html à 15 pixels pour le portrait et à 10 pixels pour le paysage. Il est apparu que le point idéal pour cette taille de pixel était de 48 pixels, c'est pourquoi je suis passé de 1,4em (42px) à 1,6em (48px).
La chose que vous devez faire est de trouver le point idéal sur la taille de la police, puis de la convertir en arrière dans vos tailles rem / em.
la source
Voici un hack que j'ai utilisé sur l'un de mes projets:
J'ai fini avec les styles et l'échelle initiaux que je voulais, mais pas de zoom sur la mise au point.
la source