Steve TENZA
Web développeur
Facebook Me contacter Cookie
Télécharger
Noter:
Ajouté/Modifié le 2024-12-27
Visionné 1022 fois

Comment bloquer le zoom sur les appareils tactiles (JavaScript)

Description

En tant que développeurs d'applications WEB, nous faisons face à divers défis pour offrir une expérience utilisateur, qu'elle soit la meilleure possible. L'un de ces défis est la gestion des gestes de dézoom (pinch-out) et de zoom (pinch-in) sur les écrans tactiles, notamment lorsque nous souhaitons restreindre ces fonctionnalités pour des raisons spécifiques. Je vous partage un script JavaScript qui rendra inactif le zoom sur mobile et tablette (les appareils tactiles).

La balise <meta viewport> n'est plus la solution

Avant de plonger dans le script, il est important de souligner que la balise <meta viewport> avec la propriété user-scalable n'a plus l'effet escompté sur certains navigateurs modernes, merci... Cette évolution m'a conduit à rechercher une solution alternative pour bloquer le zoom/dézoom, en particulier lors de la création de l'application WEB Party2Night où je devais bloquer ces actions tactiles par nécessité.

L'accessibilité des malvoyants, en 3 mots

Utilisez votre ordinateur.

Désolé, je comprends le besoin des personnes malvoyantes qui est d'augmenter la taille du site pour mieux voir, je répondrais qu'il peuvent aussi utiliser leur ordinateur de bureau afin de l'agrandir. Je précise que le script JS suivant n'a aucun effet sur les PC de bureau, un coup de CTRL + roulette (ou +/-) continuera d'augmenter/zoomer le navigateur. Cette action est facile et sans faille avec la roulette pour revenir en arrière, dans mon cas, l'utilisateur sur mobile n'avait aucune possibilité de dézoomer, allez savoir si c'était un bug avec la map qui elle bloque ces actions par défaut, du coup il partait ("fonctionne pas ce site !")...

J'ai donc demandé à Firefox d'implémenter un bouton "retour" lorsque l'utilisateur zoom, en guise de "porte de secours" lorsque l'utilisateur zoom. Ils ont bien pris en compte la demande et développé un nouveau menu dans leur appli mobile pour bloquer le zoom sur tous les sites, mais pas de bouton qui s'affiche à l'écran. Un jour peut-être...

Aller, passons au script !

Ce script empêche le zoom sur du tactile, bien qu'assez efficace, il peut arriver qu'on puisse encore zoomer, je travail actuellement à savoir pourquoi, la difficulté étant que sur les supports tactiles, ya pas de console pour voir en détail ce qui pourrait causer ce problème, à suivre...

Lisez les commentaires qui vous aideront à comprendre ce qui est fait, voyez plutôt :

Tester le script (sur mobile seulement)

//variable qui calculera la distance parcourus par les doigts, sur l'écran
var initialDistance1 = initialDistance2 = 0;

//si on touche l'écran avec plus d'un doigts, cette variable passe à true
//nous permet d'arrêter le zoom si ya plus d'un doigt posé
var isPinching = false;

// on écoute l'événement touchstart (on pose un ou plusieurs doigts sur l'écran)
document.addEventListener("touchstart", function(event){

// si le nombre de doigts est plus d'un (le swipe ne sera pas pris en compte, on pourra toujours swiper)
if(event.touches.length > 1){

// si deux doigts touchent l'écran, on enregistre la distance initiale entre eux afin de savoir si ya un pincement ou un écartement
initialDistance1 = getDistance(event.touches[0], event.touches[1]);

// par sécurité nous prenons aussi un éventuel 3ème doigts
initialDistance2 = initialDistance1;
if(event.touches.length > 2){
initialDistance2 = getDistance(event.touches[0], event.touches[2])
}

isPinching = true;

}

// "passive : false" pour prendre en compte les preventDefault() (peut être enlevé ici car il ny a pas d'utilisation de preventDefault(), mais par souci de propagation potentielle à l'événement touchmove, on va le laisser)
},{passive:false});

// on écoute l'événement touchmove (quand les doigts bougent sur l'écran)
document.addEventListener("touchmove", function(event){

//si isPinching (donc 2 doigts sur l'écran, CF : touchstart event)
//on s'assure qu'il y ait plus d'un doigt posé sur l'écran
if(isPinching && event.touches.length > 1){

// si deux doigts sont toujours présents, on calcule la nouvelle distance entre eux, s'ils s'écartent ou se rejoignent, on bloquera l'action


var currentDistance1 = getDistance(event.touches[0],event.touches[1]);

//si on a plus de 2 doigts sur l'écran, bloquer aussi
var currentDistance2 = currentDistance1;
if(event.touches.length > 2){
currentDistance2 = getDistance(event.touches[0],event.touches[2])
}
// on compare la nouvelle distance avec la distance initiale pour déterminer si ya pincement ou écartement
if(currentDistance1 > initialDistance1 || currentDistance2 > initialDistance2){

event.preventDefault();

}else if(currentDistance1 < initialDistance1 || currentDistance2 < initialDistance2){

event.preventDefault();

}
}

// "passive : false" pour prendre en compte les preventDefault() et stopper le zoom ou dézoom
},{passive:false});

// on écoute l'événement touchend afin de réinitialiser les distances
document.addEventListener("touchend", function(event){
initialDistance1 = initialDistance2 = 0;
isPinching = false;
});

// fonction pour calculer la distance entre deux points dans un plan bidimensionnel (entre deux doigts sur l'écran)
// Math.sqrt calcule la racine carrée pour retourner la distance
function getDistance(touch1, touch2){
var dx = touch1.clientX - touch2.clientX;
var dy = touch1.clientY - touch2.clientY;
return Math.sqrt(dx * dx + dy * dy);
}


J'espère que ce script gratuit vous sera utile dans vos projets.
Si vous souhaitez soutenir mon travail, un simple clic sur le bouton "Donner remercier" ci-dessous ou une note serait grandement apprécié. Merci pour votre générosité !
Votre réussite en ligne commence ici

Vous cherchez à pousser encore plus loin vos idées ou à les concrétiser avec un site internet sur mesure ? Je suis là pour vous aider ! Mon expérience en développement web est à votre disposition.

Que ce soit la création de votre site web pro ou l'apport de fonctionnalités avancées à votre projet, contactez-moi pour en discuter et avoir un devis gratuit personnalisé.

Mon objectif est de vous offrir des solutions sur mesure qui répondent à vos besoins, et votre vision associée à mon expertise donnera vie à votre projet web parfait. Contactez-moi aujourd'hui, je réponds en général en moins d'une heure :

Demander un devis
Réponse rapide !

Vous recherchez un script précis ?

Dites-moi ce dont vous avez besoin, je peux développer le script demandé et vous envoyer un mail dès qu'il est dispo !

🔔 Vous pouvez laisser votre mail pour recevoir les nouveaux scripts. Pas de pub, pas de tracas. Vous êtes libre de le supprimer à tout moment.

Je prends en compte toutes les demandes. Les idées les plus populaires passent en priorité et seront publiées dès qu'elles seront prêtes. 2842 demandes reçues.

Commentaires

Ajouter un commentaire

Commenter
Pseudo/Nom
Email
Message
Captcha
memo1memo2
Commenter
Ajoutez un commentaire, soyez le premier !

Retour à la liste des scripts

Un site à créer ?
Contactez-moi