Comment puis-je détecter le niveau de zoom de la page dans tous les navigateurs modernes? Bien que ce fil explique comment le faire dans IE7 et IE8, je ne trouve pas de bonne solution multi-navigateur.
Firefox stocke le niveau de zoom de la page pour un accès futur. Lors du premier chargement de page, pourrais-je obtenir le niveau de zoom? Quelque part, j'ai lu que cela fonctionne lorsqu'un changement de zoom se produit après le chargement de la page.
Existe-t-il un moyen de piéger l'
'zoom'
événement?
J'en ai besoin car certains de mes calculs sont basés sur des pixels et peuvent fluctuer lors d'un zoom.
Échantillon modifié donné par @tfl
Cette page alerte différentes valeurs de hauteur lors d'un zoom. [jsFiddle]
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js" type="text/javascript"/></script>
</head>
<body>
<div id="xy" style="border:1px solid #f00; width:100px;">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque sollicitudin tortor in lacus tincidunt volutpat. Integer dignissim imperdiet mollis. Suspendisse quis tortor velit, placerat tempor neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent bibendum auctor lorem vitae tempor. Nullam condimentum aliquam elementum. Nullam egestas gravida elementum. Maecenas mattis molestie nisl sit amet vehicula. Donec semper tristique blandit. Vestibulum adipiscing placerat mollis.</div>
<button onclick="alert($('#xy').height());">Show</button>
</body>
</html>
javascript
browser
zoom
detection
comprendre
la source
la source
Réponses:
Maintenant, c'est un gâchis encore plus grand qu'il ne l'était lorsque cette question a été posée pour la première fois. En lisant toutes les réponses et les articles de blog que j'ai pu trouver, voici un résumé. J'ai également mis en place cette page pour tester toutes ces méthodes de mesure du niveau de zoom .
Éditer (12/12/2011): J'ai ajouté un projet qui peut être cloné: https://github.com/tombigel/detect-zoom
screen.deviceXDPI / screen.logicalXDPI
(ou, pour le niveau de zoom par rapport au zoom par défaut,screen.systemXDPI / screen.logicalXDPI
)var body = document.body,r = body.getBoundingClientRect(); return (r.left-r.right)/body.offsetWidth;
(grâce à cet exemple ou cette réponse )screen.width
largeur d'écran de la requête / media (voir ci-dessous) (tire parti du fait qu'ilscreen.width
utilise des pixels de l'appareil mais que la largeur MQ utilise des pixels CSS - grâce aux largeurs Quirksmode )-webkit-text-size-adjust:none
.document.width / jQuery(document).width()
(merci à Dirk van Oosterbosch ci-dessus ). Pour obtenir le ratio en termes de pixels de l'appareil (au lieu de par rapport au zoom par défaut), multipliez parwindow.devicePixelRatio
.parseInt(getComputedStyle(document.documentElement,null).width) / document.documentElement.clientWidth
(à partir de cette réponse )document.documentElement.offsetWidth
/ largeur d'uneposition:fixed; width:100%
div. d'ici ( le tableau des largeurs de Quirksmode indique que c'est un bogue; innerWidth devrait être CSS px). Nous utilisons l'élément position: fixed pour obtenir la largeur de la fenêtre, y compris l'espace où se trouvent les barres de défilement ; document.documentElement.clientWidth exclut cette largeur. Cela est cassé depuis quelque temps en 2011; Je ne sais plus comment obtenir le niveau de zoom dans Opera.Voici une recherche binaire pour Firefox 4, car je ne connais aucune variable où il est exposé:
la source
zoom: screen.deviceXDPI / screen.logicalXDPI,
place dezoom: screen.systemXDPI / screen.logicalXDPI,
matchMedia
. Paul Irish a également écrit un polyfill matchMedia similaire qui fait partie de Modernizr .Tu peux essayer
Cela vous donnera le niveau de pourcentage de zoom du navigateur sur les écrans non rétiniens. Pour les écrans à haute résolution / rétine, cela donnerait des valeurs différentes (par exemple, 200 pour Chrome et Safari, 140 pour Firefox).
Pour capturer un événement de zoom, vous pouvez utiliser
la source
devicePixelRatio
. Cela m'a aussi beaucoup aidé à changer unfixed
élément en élémentabsolute
positionné ly lorsque l'événement de zoom se produit ou lorsque la valeur initiale desdevicePixelRatio
changements. Parfait! Je vous remercie!!Math.round(window.devicePixelRatio * 100)
fonctionne sur Chrome, IE, Edge et Firefox. Safari sur iMac renvoie toujours 200.Pour moi, pour Chrome / Webkit, cela
document.width / jQuery(document).width()
n'a pas fonctionné. Quand j'ai fait ma petite fenêtre et zoomé sur mon site de telle sorte que des barres de défilement horizontales apparaissent,document.width / jQuery(document).width()
n'était pas égal à 1 au zoom par défaut. En effet,document.width
inclut une partie du document en dehors de la fenêtre.Utilisation
window.innerWidth
etwindow.outerWidth
travail. Pour une raison quelconque dans Chrome, la largeur extérieure est mesurée en pixels d'écran et la largeur intérieure est mesurée en pixels CSS.la source
isZoomed = (screenCssPixelRatio < .98 || screenCssPixelRatio > 1.02)
switch
peut être meilleure que beaucoup d'instructions if else.Mon collègue et moi avons utilisé le script de https://github.com/tombigel/detect-zoom . De plus, nous avons également créé dynamiquement un élément svg et vérifié sa propriété currentScale. Cela fonctionne très bien sur Chrome et probablement sur la plupart des navigateurs. Sur FF, la fonction "zoom texte uniquement" doit être désactivée. SVG est pris en charge sur la plupart des navigateurs. Au moment de la rédaction de ce document, testé sur IE10, FF19 et Chrome28.
la source
J'ai trouvé cet article extrêmement utile. Un grand merci à yonran. Je voulais transmettre un apprentissage supplémentaire que j'ai trouvé lors de la mise en œuvre de certaines des techniques qu'il a fournies. Dans FF6 et Chrome 9, la prise en charge des requêtes multimédias de JS a été ajoutée, ce qui peut grandement simplifier l'approche de requête multimédia nécessaire pour déterminer le zoom dans FF. Voir les documents sur MDN ici . Pour mes besoins, j'avais seulement besoin de détecter si le navigateur était zoomé ou dézoomé, je n'avais pas besoin du facteur de zoom réel. J'ai pu obtenir ma réponse avec une seule ligne de JavaScript:
En combinant cela avec les solutions IE8 + et Webkit, qui étaient également des lignes simples, j'ai pu détecter un zoom sur la grande majorité des navigateurs qui frappaient notre application avec seulement quelques lignes de code.
la source
devicePixelRatio
: elle prend en compte la mise à l'échelle de l'affichage.C'est tout ce dont vous avez besoin.
la source
10
deouterWidth
?J'ai une solution pour cela depuis janvier 2016. Testé fonctionnant dans les navigateurs Chrome, Firefox et MS Edge.
Le principe est le suivant. Collectez 2 points MouseEvent éloignés l'un de l'autre. Chaque événement de souris est accompagné des coordonnées de l'écran et du document. Mesurez la distance entre les 2 points dans les deux systèmes de coordonnées. Bien qu'il existe des décalages fixes variables entre les systèmes de coordonnées en raison du mobilier du navigateur, la distance entre les points doit être identique si la page n'est pas agrandie. La raison de la spécification de «éloigné» (je mets 12 pixels) est pour que de petits changements de zoom (par exemple 90% ou 110%) soient détectables.
Référence: https://developer.mozilla.org/en/docs/Web/Events/mousemove
Pas:
Ajouter un écouteur de déplacement de souris
Capturez 4 mesures d'événements de souris:
Mesurer la distance d_c entre les 2 points du système client
Mesurer la distance d_s entre les 2 points du système d'écran
Si d_c! = D_s alors le zoom est appliqué. La différence entre les deux vous indique le niveau de zoom.
NB Ne faites que rarement les calculs de distance, par exemple lorsque vous pouvez échantillonner un nouvel événement de souris loin du précédent.
Limitations: suppose que l'utilisateur déplace la souris au moins un peu et que le zoom est inconnu jusqu'à ce moment.
la source
Vous pouvez utiliser l' API Visual Viewport :
Il est standard et fonctionne à la fois sur ordinateur et sur mobile: prise en charge du navigateur .
la source
Dans Internet Explorer 7, 8 et 9, cela fonctionne:
Le "+0,9" est ajouté pour éviter les erreurs d'arrondi (sinon, vous obtiendriez 104% et 109% lorsque le zoom du navigateur est réglé sur 105% et 110% respectivement).
Dans IE6, le zoom n'existe pas, il n'est donc pas nécessaire de vérifier le zoom.
la source
Ce que j'ai trouvé c'est:
1) Faites un
position:fixed
<div>
avecwidth:100%
( id = zoomdiv )2) lorsque la page se charge:
Et cela a fonctionné pour moi
ctrl+
et lesctrl-
zooms.ou je peux ajouter la ligne à un
$(window).onresize()
événement pour obtenir le niveau de zoom actifCode:
PS: c'est mon premier post, pardonnez les erreurs
la source
screen.availWidth
indique la largeur de l'écran en pixels d'écran, pas la fenêtre du navigateur).Cela a très bien fonctionné pour moi dans les navigateurs Webkit (Chrome, Safari):
Cela ne semble cependant pas fonctionner dans Firefox.
Cela fonctionne également dans WebKit:
la source
document.width
renvoie indéfiniFondamentalement, nous avons:
window.devicePixelRatio
qui prend en compte à la fois le zoom au niveau du navigateur * ainsi que le zoom du système / la densité de pixels.* - sur Mac / Safari le niveau de zoom n'est pas pris en compte
vw
/vh
Unités CSSresize
, qui est déclenché lors d'un changement de niveau de zoom, entraîne une modification de la taille effective de la fenêtrecela devrait être suffisant pour la normale UX . Si vous devez détecter le niveau de zoom, cela pourrait être un signe de mauvaise conception de l'interface utilisateur.
Le zoom en hauteur est plus difficile à suivre et n'est pas pris en compte actuellement.
la source
Sur les appareils mobiles (avec Chrome pour Android ou Opera Mobile), vous pouvez détecter le zoom par window.visualViewport.scale . https://developer.mozilla.org/en-US/docs/Web/API/Visual_Viewport_API
Détecter sur Safari: document.documentElement.clientWidth / window.innerWidth (renvoyer 1 si aucun zoom sur l'appareil).
la source
Vos calculs sont toujours basés sur un certain nombre de pixels CSS. Ils sont juste d'une taille différente à l'écran maintenant. C'est le point du zoom pleine page.
Que voudriez-vous qu'il se passe sur un navigateur sur un périphérique 192 dpi qui affiche donc normalement quatre pixels de périphérique pour chaque pixel d'une image? Avec un zoom de 50%, cet appareil affiche désormais un pixel d'image dans un pixel d'appareil.
la source
Sur Chrome
la source
Je n'ai pas testé cela pour IE, mais si vous créez un élément
elem
avecpuis
vous donnera le niveau de zoom de votre navigateur (y compris le
document.body.style.zoom
facteur).la source
C'est pour Chrome , dans le sillage de la réponse de l'utilisateur 800583 ...
J'ai passé quelques heures sur ce problème et n'ai pas trouvé de meilleure approche, mais:
window.outerWidth/window.innerWidth
, et quand il ne l'est pas, le ratio semble être(window.outerWidth-16)/window.innerWidth
, cependant le 1er cas peut être approché par le 2ème.Je suis donc arrivé à ce qui suit ...
Mais cette approche a ses limites: par exemple, si vous jouez de l'accordéon avec la fenêtre de l'application (agrandissez et réduisez rapidement la largeur de la fenêtre), vous obtiendrez des écarts entre les niveaux de zoom bien que le zoom n'ait pas changé (peut être la largeur externe et la largeur intérieure ne sont pas exactement mis à jour en même temps).
Et si vous voulez le facteur:
la source
J'ai cette solution pour mobile uniquement (testée avec Android):
Si vous voulez le niveau de zoom juste après le mouvement de pincement, vous devrez probablement définir un petit délai en raison du retard de rendu (mais je ne suis pas sûr car je ne l'ai pas testé).
la source
Cette réponse est basée sur des commentaires sur devicePixelRatio revenant incorrectement sur la réponse de user1080381.
J'ai constaté que cette commande revenait incorrectement dans certains cas également lorsque je travaillais avec un bureau, Surface Pro 3 et Surface Pro 4.
Ce que j'ai trouvé, c'est que cela fonctionnait sur mon bureau, mais le SP3 et le SP4 donnaient des numéros différents les uns des autres et du bureau.
J'ai cependant remarqué que le SP3 revenait à 1 fois et demie le niveau de zoom que j'attendais. Quand j'ai regardé les paramètres d'affichage, le SP3 était en fait réglé à 150% au lieu des 100% que j'avais sur mon bureau.
Ainsi, la solution aux commentaires devrait être de diviser le niveau de zoom renvoyé par l'échelle de la machine sur laquelle vous vous trouvez actuellement.
J'ai pu obtenir l'échelle dans les paramètres Windows en procédant comme suit:
Donc, dans le cas de mon SP3, voici à quoi ressemble ce code à 100% de zoom:
La multiplication par 100 dans la réponse originale de user1080381 vous donnerait alors un zoom de 100 (%).
la source
Le faire fonctionner mais doit encore être séparé par navigateur. Testé avec succès sur Chrome (75) et Safari (11.1) (pas encore trouvé de chemin pour FF). Il obtient également la valeur de zoom correcte sur l'affichage de la rétine et les calculs sont déclenchés lors de l'événement de redimensionnement.
la source
ici ça ne change pas!:
créer un simple fichier html, cliquez sur le bouton. quel que soit le niveau de zoom: il vous montrera la largeur de 400px (au moins avec firefox et ie8)
la source
Cela peut ou peut ne pas aider personne, mais j'avais une page que je n'arrivais pas à centrer correctement, peu importe les astuces Css que j'ai essayées, j'ai donc écrit une page de centre d'appels de fichier JQuery:
Le problème s'est produit avec le niveau de zoom du navigateur, la page se décalerait selon que vous étiez à 100%, 125%, 150%, etc.
Le code ci-dessous se trouve dans un fichier JQuery appelé centerpage.js.
Depuis ma page, j'ai dû créer un lien vers JQuery et ce fichier pour le faire fonctionner, même si ma page maître avait déjà un lien vers JQuery.
centerpage.js
:De plus, si vous souhaitez centrer un panneau:
la source
Cette question a été publiée il y a longtemps, mais aujourd'hui, lorsque je cherchais la même réponse "Comment détecter un événement de zoom avant et arrière", je n'ai pas pu trouver une réponse qui conviendrait à tous les navigateurs.
Comme maintenant: pour Firefox / Chrome / IE8 et IE9, le zoom avant et arrière déclenche un événement window.resize. Cela peut être capturé en utilisant:
la source
Solution de contournement pour FireFox 16+ pour trouver DPPX (niveau de zoom) uniquement avec JavaScript:
la source
la source
Le problème réside dans les types de moniteur utilisés, un moniteur 4k contre un moniteur standard. Chrome est de loin le plus intelligent pour pouvoir nous dire quel est le niveau de zoom simplement en utilisant
window.devicePixelRatio
, apparemment il peut dire quelle est la densité de pixels et rapporte le même nombre pour n'importe quoi.D'autres navigateurs, pas tellement. IE et Edge sont probablement les pires, car ils gèrent les niveaux de zoom très différemment. Pour obtenir la même taille de texte sur un moniteur 4k, vous devez sélectionner 200%, au lieu de 100% sur un moniteur standard.
Depuis mai 2018, voici ce que j'ai pour détecter les niveaux de zoom pour certains des navigateurs les plus populaires, Chrome, Firefox et IE11. Je dois me dire quel est le pourcentage de zoom. Pour IE, il rapporte 100% même pour les moniteurs 4k qui sont en fait à 200%, mais la taille du texte est vraiment la même.
Voici un violon: https://jsfiddle.net/ae1hdogr/
Si quelqu'un souhaite essayer d'autres navigateurs et mettre à jour le violon, alors faites-le. Mon objectif principal était de couvrir ces 3 navigateurs pour détecter si les gens utilisaient un facteur de zoom supérieur à 100% pour utiliser mon application Web et afficher un avis suggérant un facteur de zoom du bailleur.
la source