96 votes

Désactiver le zoom sur le focus de la saisie dans une page web Android

Voici le dilemme : j'ai une page Web (uniquement pour les appareils Android) et dans cette page, j'ai une zone de saisie (une zone de texte en particulier) et lorsqu'elle reçoit le focus, le navigateur effectue un zoom avant. Je ne veux pas qu'il fasse un zoom avant - cela semble facile, non ?

C'est là que ça devient amusant : Je dois être capable de zoomer en général, donc ne dites pas

<meta name='viewport' content='user-scalable=0'>

Ça ne marchera pas pour moi.

En outre, la zone de saisie ne reçoit pas d'événements de clic. Elle apparaît lorsqu'un autre bouton est cliqué et reçoit le focus de manière programmatique.

Voici ce que j'ai essayé et qui a échoué jusqu'à présent :

jQuery('head meta[name=viewport]').remove();
jQuery('head').prepend('<meta name="viewport" content="width=720px;intial-scale=1.0;maximum-scale=1.0;user-scalable=no" />');
jQuery("#locationLock input").focus();
jQuery('head meta[name=viewport]').remove();
jQuery('head').prepend('<meta name="viewport" content="width=720px;intial-scale=1.0;maximum-scale=1.0;user-scalable=yes" />');

Cela a également échoué :

<input type='text' onfocus="return false">

Et ceci :

jQuery("#locationLock input").focus(function(e){e.preventDefault();});

Des idées ?

0 votes

Le navigateur Chrome ne zoome que lorsqu'il y a déjà du contenu dans le champ de saisie. Vous pourriez donc essayer de perfectionner la suppression du contenu, de définir un délai d'attente, puis de rajouter le contenu plus tard, vers (150ms). Il y a encore quelques problèmes avec la première pression longue sur un champ de saisie. Si vous voulez faire cela, gardez le délai court, ajoutez un petit effet de chargement jQuery pour des raisons d'ergonomie et revenez à une taille de police de 18px pour la saisie. Le zoom est là pour que l'utilisateur puisse plus facilement changer la position du curseur, pensez-y aussi.

1 votes

1 votes

Note du modérateur : Au fil du temps, cette question a accumulé plus de 30 réponses. Avant d'ajouter une nouvelle réponse, soyez bien sûr que votre solution n'a pas déjà été fournie.

47voto

rebpp Points 61

Ce qui suit a fonctionné pour moi (Android Galaxy S2) :

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

3 votes

Ce devrait être la réponse correcte actuelle !

3 votes

Cela fonctionne. Cependant, vous devriez utiliser , au lieu de ; Je pense également que le commentaire sur la convivialité peut être ignoré, car nous sommes probablement tous ici à cause d'une mauvaise expérience de convivialité dans un certain cas, où nous voulons explicitement empêcher ce comportement.

0 votes

Fonctionne sur l'iPhone X. Ceci devrait être la bonne réponse.

32voto

Coomie Points 1946

Pas possible !

J'ai de mauvaises nouvelles pour vous tous. Cela fait maintenant 6 mois et personne n'a répondu correctement à la question.

J'ai aussi fini de travailler sur ce projet et cet employeur.

J'ai peur de le dire, mais ce que j'ai demandé est impossible. Désolé. Mais je vais laisser la question ouverte pour que les gens puissent voir les autres options.

7 votes

Une solution un an plus tard ?

1 votes

Ajoutez une étoile au rapport de problème de Chromium ici pour que cela soit remarqué par Google : code.google.com/p/chromium/issues/detail?id=181560

1 votes

Il existe de nombreuses solutions, la meilleure étant de veiller à ce que le corps de votre document ne soit pas plus large que la taille native de l'écran.

19voto

Les problèmes d'échelle provoquent un zoom sur l'entrée

Il est très difficile de dimensionner le contenu pour différentes résolutions et tailles d'écran, ce qui est finalement la cause de ce problème de zoom.

La plupart des navigateurs mobiles ont un déclencheur sur le focus de l'entrée (que vous ne pouvez pas contourner sans difficulté) :

if (zoom-level < 1)
   zoom to 1.5
   center focused input relative to screen

*Oui, c'était bien trop simplifié.

Le mythe de l'échelle des métabalises est corrigé.

<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"> Tous ces paramètres d'affichage ne sera pas empêcher le zoom de l'input-focus si vous êtes en zoom arrière. Elles ne remplaceront pas non plus tout autre formatage html, body ou élément qui pousserait la fenêtre à une largeur supérieure à celle de l'écran.

Cause principale

Utilisation d'une fenêtre ou d'un corps plus grand que les dimensions de l'écran de l'appareil.

Considérez la taille d'écran standard de la plupart des smartphones Android de la gamme Galaxy : 360 x 650. Si le corps de votre document, ou fenêtre, est défini pour être plus grand que cela (disons 1024 de large pour que ce soit évident), plusieurs choses peuvent se produire :

  1. Le navigateur peut effectuer un zoom automatique pour adapter la largeur à l'écran.
    1. L'utilisateur peut faire ce qui précède.
    2. Vous avez peut-être fait ce qui précède.
  2. Le navigateur rétablira le niveau de zoom lors des visites ultérieures de la page.
  3. Vous visualisez maintenant le contenu avec un zoom de 0,35x.

État initial 1x

Lorsqu'elle est chargée, la page ne tient pas. Certains navigateurs peuvent effectuer un zoom arrière pour s'adapter à la fenêtre, mais c'est certainement le cas de l'utilisateur. En outre, si vous avez déjà effectué un zoom arrière sur cette page, le navigateur mémorisera le niveau de zoom.

Zoom arrière pour adapter 0,35x

Une fois dézoomée, la largeur s'adapte bien, et une page avec plus de surface verticale remplit bien l'écran... mais...

Remarquez que le navigateur se trouve maintenant dans un état où le texte et les entrées (dimensionnés pour un zoom normal de 1x) seraient bien trop petits pour être lus, ce qui déclenche un comportement de convivialité consistant à zoomer sur les champs d'entrée lorsqu'ils reçoivent le focus.

Zoom sur l'Input-Focus 1.5x

Le comportement typique dans le cas ci-dessus est de zoomer à 1,5x, pour assurer la visibilité de la saisie. Le résultat (si vous avez tout stylé pour que l'apparence soit meilleure en cas de zoom arrière, ou pour un écran plus grand) est moins que souhaitable.

Solution 1

Utilisez une combinaison de règles css media, de détection d'appareils, ou ce qui convient le mieux à votre situation. Définissez la fenêtre et le corps à une taille qui remplit l'espace de l'écran, sans le dépasser.

  • C'est pourquoi beaucoup de gens réussissent à forcer la taille du texte d'entrée à 16px ;
    • Une fois que vous avez fait ça, il est clair que vous avez fait un gros zoom arrière.
    • Elle présente également l'avantage de tromper le navigateur en permettant à des fenêtres légèrement dézoomées de ne pas déclencher le focus-zoom.

Solution 2

Utilisez le méta viewport, mais faites ensuite attention aux largeurs css.

<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
  • Lorsque vous utilisez cette méthode, vous devez effectuer l'une des opérations suivantes :
    • N'utilisez que des pourcentages pour les largeurs.
    • Définissez une largeur em, et utilisez uniquement em et % pour les largeurs.
    • voir la solution 1 pour l'utilisation des largeurs en px.

Solution 3

jQuery.mobile $.mobile.zoom.disable();

Assurez-vous simplement que vous commencez à vous développer avec elle dès le début, et non au milieu.

13voto

joras Points 415

Je ne sais pas si c'est le meilleur moyen, mais cela fonctionne pour moi sur Android et iphone.

input:focus { font-size: 16px!important}

Vous pouvez utiliser des requêtes média pour cibler uniquement les appareils mobiles.

0 votes

...de plus, cela est généralement dû à une fenêtre/un corps de taille inadéquate.

0 votes

Vous ne pouvez pas utiliser les requêtes média pour cibler les appareils mobiles uniquement sur leur largeur ou leur hauteur. De nombreux appareils tactiles sont aussi grands que les appareils de bureau. La détection des appareils tactiles ou non tactiles se fait par script ou côté serveur.

0 votes

Je ne pense pas que ce soit une réponse correcte, même de loin. Le problème avec le zoom automatique n'est pas seulement en termes de "petite police", mais aussi une illusion d'éléments mal positionnés. Dans mon cas, par exemple, l'entrée est zoomée et n'est pas centrée sur l'écran, et on m'a signalé une "mauvaise position du dialogue" alors que l'utilisateur n'était pas au courant de ce "zoom automatique".

4voto

Beermad Points 46

Je me suis penché sur ce problème car c'est quelque chose qui m'irrite dans mon application Android HTML5. Je peux offrir une demi réponse. C'est à dire, comment arrêter la mise à l'échelle de la page quand un champ de texte est focalisé.

Nécessite Jquery Mobile :

$('#textfield').textinput({preventFocusZoom:true});

fait exactement cela.

Mais, comme je l'ai dit, cela ne résout que la moitié du problème. L'autre moitié consiste à permettre à l'utilisateur de zoomer à nouveau sur la page par la suite. La documentation que j'ai trouvée semble suggérer que

    $('#textfield').textinput({preventFocusZoom:false});

ou

$('#textfield').textinput('option','preventFocusZoom',false);

devrait le désactiver, mais je n'ai pas réussi à faire fonctionner ces deux options. Ce n'est pas un problème si vous emmenez l'utilisateur sur une autre page par la suite, mais c'est d'une utilité limitée si, comme moi, vous chargez le contenu par AJAX.

EDIT : Bien que destiné à IOS,

$.mobile.zoom.disable();

Il arrête aussi le zoom. D'une manière plus générique. Mais malheureusement

$.mobile.zoom.enable();

Ne parvient pas à restaurer la fonctionnalité comme l'ancien code.

0 votes

PreventFocusZoom cause des ravages dans le navigateur natif d'Android. Chaque fois qu'une entrée de formulaire est focalisée, la page défile vers le haut, l'entrée n'est pas focalisée et le clavier n'est pas affiché jusqu'à ce que vous essayiez de focaliser l'entrée une deuxième fois. Signalé comme un bogue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X