Wie kann ich die Seitenzoomstufe in allen modernen Browsern erkennen? Während dieser Thread erklärt , wie es in IE7 und IE8 geht, kann ich keine gute browserübergreifende Lösung finden.
Firefox speichert die Seitenzoomstufe für den zukünftigen Zugriff. Kann ich beim Laden der ersten Seite die Zoomstufe ermitteln? Irgendwo habe ich gelesen, dass es funktioniert, wenn nach dem Laden der Seite eine Zoomänderung auftritt .
Gibt es eine Möglichkeit, das
'zoom'
Ereignis abzufangen?
Ich brauche dies, weil einige meiner Berechnungen pixelbasiert sind und beim Zoomen schwanken können.
Modifiziertes Beispiel von @tfl
Diese Seite warnt beim Zoomen unterschiedliche Höhenwerte. [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
Understack
quelle
quelle
Antworten:
Jetzt ist es ein noch größeres Durcheinander als damals, als diese Frage zum ersten Mal gestellt wurde. Nach dem Lesen aller Antworten und Blog-Beiträge, die ich finden konnte, finden Sie hier eine Zusammenfassung. Ich habe diese Seite auch eingerichtet , um all diese Methoden zum Messen der Zoomstufe zu testen .
Bearbeiten (12.12.2011): Ich habe ein Projekt hinzugefügt, das geklont werden kann: https://github.com/tombigel/detect-zoom
screen.deviceXDPI / screen.logicalXDPI
(oder für die Zoomstufe relativ zum Standardzoomscreen.systemXDPI / screen.logicalXDPI
)var body = document.body,r = body.getBoundingClientRect(); return (r.left-r.right)/body.offsetWidth;
(dank dieses Beispiels oder dieser Antwort )screen.width
/ Bildschirmbreite für Medienabfragen (siehe unten) (nutzt die Tatsache, dass Gerätepixelscreen.width
verwendet werden, während die MQ-Breite CSS-Pixel verwendet - dank Quirksmode-Breiten )-webkit-text-size-adjust:none
.document.width / jQuery(document).width()
(danke an Dirk van Oosterbosch oben ). Um das Verhältnis in Bezug auf Gerätepixel (anstelle des Standardzooms) zu erhalten, multiplizieren Sie mitwindow.devicePixelRatio
.parseInt(getComputedStyle(document.documentElement,null).width) / document.documentElement.clientWidth
(aus dieser Antwort )document.documentElement.offsetWidth
/ Breite einesposition:fixed; width:100%
Div. von hier ( Quirksmodes Breitentabelle sagt, dass es ein Fehler ist; innerWidth sollte CSS px sein). Wir verwenden das Element position: fixed, um die Breite des Ansichtsfensters einschließlich des Bereichs zu ermitteln, in dem sich die Bildlaufleisten befinden . document.documentElement.clientWidth schließt diese Breite aus. Dies ist seit irgendwann im Jahr 2011 gebrochen; Ich kenne keine Möglichkeit mehr, die Zoomstufe in Opera zu erreichen.Hier ist eine binäre Suche nach Firefox 4, da ich keine Variable kenne, in der es verfügbar gemacht wird:
quelle
zoom: screen.deviceXDPI / screen.logicalXDPI,
statt seinzoom: screen.systemXDPI / screen.logicalXDPI,
matchMedia
. Paul Irish hat auch eine ähnliche matchMedia-Polyfüllung geschrieben , die Teil von Modernizr ist .Du kannst es versuchen
Auf diese Weise erhalten Sie eine prozentuale Browser-Zoomstufe für Nicht-Retina-Displays. Bei Displays mit hoher DPI / Retina ergeben sich unterschiedliche Werte (z. B. 200 für Chrome und Safari, 140 für Firefox).
Zum Abfangen von Zoomereignissen können Sie verwenden
quelle
devicePixelRatio
. Dies hat mir auch sehr geholfen, einfixed
Element auf einabsolute
genau positioniertes Element umzuschalten, wenn das Zoomereignis auftritt oder wenn sich der Anfangswert vondevicePixelRatio
Änderungen ändert. Perfekt! Danke dir!!Math.round(window.devicePixelRatio * 100)
funktioniert unter Chrome, IE, Edge und Firefox. Safari auf iMac gibt immer 200 zurück.Für mich hat Chrome / Webkit
document.width / jQuery(document).width()
nicht funktioniert. Als ich mein Fenster klein machte und meine Site so vergrößerte, dass horizontale Bildlaufleistendocument.width / jQuery(document).width()
angezeigt wurden, war sie beim Standardzoom nicht gleich 1. Dies liegt daran, dassdocument.width
ein Teil des Dokuments außerhalb des Ansichtsfensters enthalten ist.Verwenden
window.innerWidth
undwindow.outerWidth
gearbeitet. Aus irgendeinem Grund wird in Chrome die äußere Breite in Bildschirmpixeln und die innere Breite in CSS-Pixeln gemessen.quelle
isZoomed = (screenCssPixelRatio < .98 || screenCssPixelRatio > 1.02)
switch
Aussage kann besser sein als viele wenn sonst Aussagen.Mein Kollege und ich haben das Skript von https://github.com/tombigel/detect-zoom verwendet . Darüber hinaus haben wir dynamisch ein svg-Element erstellt und dessen currentScale-Eigenschaft überprüft. Es funktioniert hervorragend in Chrome und wahrscheinlich auch in den meisten Browsern. Bei FF muss die Funktion "Nur Text zoomen" jedoch deaktiviert sein. SVG wird in den meisten Browsern unterstützt. Zum Zeitpunkt dieses Schreibens auf IE10, FF19 und Chrome28 getestet.
quelle
Ich fand diesen Artikel enorm hilfreich. Vielen Dank an Yonran. Ich wollte einige zusätzliche Erkenntnisse weitergeben, die ich bei der Implementierung einiger der von ihm bereitgestellten Techniken gefunden hatte. In FF6 und Chrome 9 wurde die Unterstützung für Medienabfragen von JS hinzugefügt, wodurch der Ansatz zur Medienabfrage, der zum Bestimmen des Zooms in FF erforderlich ist, erheblich vereinfacht werden kann. Siehe die Dokumente bei MDN hier . Für meine Zwecke musste ich nur feststellen, ob der Browser vergrößert oder verkleinert wurde. Ich brauchte den tatsächlichen Zoomfaktor nicht. Ich konnte meine Antwort mit einer Zeile JavaScript erhalten:
In Kombination mit den IE8 + - und Webkit-Lösungen, bei denen es sich ebenfalls um einzelne Zeilen handelte, konnte ich bei den meisten Browsern, die unsere App mit nur wenigen Codezeilen erreichen, einen Zoom feststellen.
quelle
devicePixelRatio
: Dabei wird die Skalierung der Anzeige berücksichtigt.Das ist alles was du brauchst.
quelle
10
vonouterWidth
?Ab Januar 2016 habe ich eine Lösung dafür. Getestet in Chrome-, Firefox- und MS Edge-Browsern.
Das Prinzip ist wie folgt. Sammle 2 weit voneinander entfernte MouseEvent-Punkte. Jedes Mausereignis enthält Bildschirm- und Dokumentkoordinaten. Messen Sie den Abstand zwischen den beiden Punkten in beiden Koordinatensystemen. Obwohl es aufgrund der Browsermöbel variable feste Offsets zwischen den Koordinatensystemen gibt, ist der Abstand zwischen den Punkten identisch sein, wenn die Seite nicht gezoomt wird. Der Grund für die Angabe von "weit auseinander" (ich habe dies als 12 Pixel angegeben) ist, dass kleine Zoomänderungen (z. B. 90% oder 110%) erkennbar sind.
Referenz: https://developer.mozilla.org/en/docs/Web/Events/mousemove
Schritte:
Fügen Sie einen Mausbewegungs-Listener hinzu
Erfassen Sie 4 Messungen von Mausereignissen:
Messen Sie den Abstand d_c zwischen den beiden Punkten im Client-System
Messen Sie den Abstand d_s zwischen den beiden Punkten im Bildschirmsystem
Wenn d_c! = D_s ist, wird der Zoom angewendet. Der Unterschied zwischen den beiden gibt den Zoombetrag an.
Hinweis: Entfernungsberechnungen werden nur selten durchgeführt, z. B. wenn Sie ein neues Mausereignis abtasten können, das weit vom vorherigen entfernt ist.
Einschränkungen: Angenommen, der Benutzer bewegt die Maus mindestens ein wenig und der Zoom ist bis zu diesem Zeitpunkt nicht erkennbar.
quelle
Sie können die Visual Viewport-API verwenden :
Es ist Standard und funktioniert sowohl auf dem Desktop als auch auf dem Handy: Browser-Unterstützung .
quelle
In Internet Explorer 7, 8 und 9 funktioniert dies:
"+0.9" wird hinzugefügt, um Rundungsfehler zu vermeiden (andernfalls würden Sie 104% und 109% erhalten, wenn der Browser-Zoom auf 105% bzw. 110% eingestellt ist).
In IE6 ist der Zoom nicht vorhanden, daher ist es nicht erforderlich, den Zoom zu überprüfen.
quelle
Was ich mir ausgedacht habe ist:
1) Machen Sie ein
position:fixed
<div>
mitwidth:100%
( id = zoomdiv )2) wenn die Seite geladen wird:
Und es hat bei mir funktioniert
ctrl+
undctrl-
zoomt.oder ich kann die Linie zu einem
$(window).onresize()
Ereignis hinzufügen , um die aktive Zoomstufe zu erhaltenCode:
PS: Dies ist mein erster Beitrag, entschuldigen Sie etwaige Fehler
quelle
screen.availWidth
die Breite des Bildschirms in Bildschirmpixeln an, nicht das Browserfenster).Dies hat in Webkit-basierten Browsern (Chrome, Safari) hervorragend funktioniert:
Scheint in Firefox allerdings nicht zu funktionieren.
Dies funktioniert auch in WebKit:
quelle
document.width
kehrt undefiniert zurückGrundsätzlich haben wir:
window.devicePixelRatio
Dies berücksichtigt sowohl den Zoom * auf Browserebene als auch den Systemzoom / die Pixeldichte.* - Bei Mac / Safari wird die Zoomstufe nicht berücksichtigt
vw
/vh
CSS-Einheitenresize
Ein Ereignis, das beim Ändern der Zoomstufe ausgelöst wird, bewirkt eine effektive Größe der Fensteränderungendas sollte für normales UX ausreichen . Wenn Sie die Zoomstufe erkennen müssen, kann dies ein Zeichen für ein schlechtes UI-Design sein.
Pitch-Zoom ist schwieriger zu verfolgen und wird derzeit nicht berücksichtigt.
quelle
Auf Mobilgeräten (mit Chrome für Android oder Opera Mobile) können Sie den Zoom anhand von window.visualViewport.scale erkennen . https://developer.mozilla.org/en-US/docs/Web/API/Visual_Viewport_API
Auf Safari erkennen: document.documentElement.clientWidth / window.innerWidth (1 zurückgeben, wenn das Gerät nicht gezoomt wird).
quelle
Ihre Berechnungen basieren immer noch auf einer Reihe von CSS-Pixeln. Sie haben jetzt nur eine andere Größe auf dem Bildschirm. Das ist der Punkt des Ganzseiten-Zooms.
Was möchten Sie in einem Browser auf einem 192-dpi-Gerät tun, das daher normalerweise vier Gerätepixel für jedes Pixel in einem Bild anzeigt? Bei 50% Zoom zeigt dieses Gerät jetzt ein Bildpixel in einem Gerätepixel an.
quelle
Auf Chrome
quelle
Habe dies nicht für IE getestet, aber wenn du ein Element
elem
mit machstdann
gibt Ihnen die Zoomstufe Ihres Browsers (einschließlich des
document.body.style.zoom
Faktors).quelle
Dies ist für Chrome im Anschluss an die Antwort von user800583 ...
Ich habe ein paar Stunden mit diesem Problem verbracht und keinen besseren Ansatz gefunden, aber:
window.outerWidth/window.innerWidth
, ist das Verhältnis , und wenn dies nicht(window.outerWidth-16)/window.innerWidth
der Fall ist, scheint das Verhältnis zu sein , jedoch kann der erste Fall vom zweiten angegangen werden.Also bin ich zu folgendem gekommen ...
Dieser Ansatz weist jedoch Einschränkungen auf: Wenn Sie beispielsweise das Akkordeon mit dem Anwendungsfenster spielen (schnell vergrößern und verkleinern), werden Lücken zwischen den Zoomstufen angezeigt, obwohl sich der Zoom nicht geändert hat (möglicherweise ist die äußere Breite und die innere Breite nicht) genau zur gleichen Zeit aktualisiert).
Und wenn Sie den Faktor wollen:
quelle
Ich habe diese Lösung nur für Handys (getestet mit Android):
Wenn Sie die Zoomstufe direkt nach dem Einklemmen wünschen, müssen Sie wahrscheinlich wegen der Renderverzögerung eine kleine Zeitüberschreitung einstellen (aber ich bin mir nicht sicher, weil ich sie nicht getestet habe).
quelle
Diese Antwort basiert auf Kommentaren zu devicePixelRatio, die in der Antwort von user1080381 falsch wiedergegeben werden.
Ich habe festgestellt, dass dieser Befehl in einigen Fällen auch bei der Arbeit mit einem Desktop, Surface Pro 3 und Surface Pro 4 falsch zurückgegeben wurde.
Was ich fand, war, dass es auf meinem Desktop funktionierte, aber SP3 und SP4 gaben unterschiedliche Nummern voneinander und vom Desktop an.
Ich bemerkte jedoch, dass der SP3 das Eineinhalbfache der erwarteten Zoomstufe zurückbrachte. Als ich mir die Anzeigeeinstellungen ansah, war der SP3 tatsächlich auf 150% anstatt auf 100% eingestellt, die ich auf meinem Desktop hatte.
Die Lösung für die Kommentare sollte daher darin bestehen, die zurückgegebene Zoomstufe durch die Skalierung des Geräts zu teilen, auf dem Sie sich gerade befinden.
Ich konnte die Skalierung in den Windows-Einstellungen wie folgt abrufen:
Bei meinem SP3 sieht dieser Code also wie folgt aus: 100% Zoom:
Wenn Sie die ursprüngliche Antwort von user1080381 mit 100 multiplizieren, erhalten Sie einen Zoom von 100 (%).
quelle
Habe es aktuell funktioniert muss sich aber noch nach Browser trennen. Erfolgreich auf Chrome (75) und Safari (11.1) getestet (noch keinen Weg für FF gefunden). Außerdem wird der Zoomwert auf der Retina-Anzeige korrekt angezeigt und Berechnungen werden beim Größenänderungsereignis ausgelöst.
quelle
hier ändert es sich nicht!:
Erstellen Sie eine einfache HTML-Datei, klicken Sie auf die Schaltfläche. unabhängig von der Zoomstufe: Es zeigt Ihnen die Breite von 400px (zumindest mit Firefox und IE8)
quelle
Dies kann niemandem helfen oder auch nicht, aber ich hatte eine Seite, die ich nicht richtig zentrieren konnte, egal welche CSS-Tricks ich ausprobiert habe, also schrieb ich eine JQuery-Datei mit dem Aufruf Center-Seite:
Das Problem trat bei der Zoomstufe des Browsers auf. Die Seite wurde verschoben, je nachdem, ob Sie 100%, 125%, 150% usw. waren.
Der folgende Code befindet sich in einer JQuery-Datei mit dem Namen centerpage.js.
Von meiner Seite musste ich auf JQuery und diese Datei verlinken, damit es funktioniert, obwohl meine Masterseite bereits einen Link zu JQuery hatte.
centerpage.js
::Auch wenn Sie ein Panel zentrieren möchten:
quelle
Diese Frage wurde wie vor langer Zeit gestellt, aber heute, als ich nach der gleichen Antwort "Wie man ein Vergrößern und Verkleinern erkennt" suchte, konnte ich keine Antwort finden, die für alle Browser geeignet wäre.
Wie jetzt: Bei Firefox / Chrome / IE8 und IE9 löst das Vergrößern und Verkleinern ein window.resize-Ereignis aus. Dies kann erfasst werden mit:
quelle
Eine Problemumgehung für FireFox 16+, um DPPX (Zoomstufe) ausschließlich mit JavaScript zu finden:
quelle
quelle
Das Problem liegt in den verwendeten Monitortypen, einem 4k-Monitor im Vergleich zum Standardmonitor. Chrome ist bei weitem am klügsten, wenn es darum geht, die Zoomstufe nur mithilfe von zu ermitteln
window.devicePixelRatio
Anscheinend kann es die Pixeldichte erkennen und meldet dieselbe Zahl zurück, um was auch immer zu tun.Andere Browser, nicht so sehr. IE und Edge sind wahrscheinlich die schlechtesten, da sie die Zoomstufen sehr unterschiedlich handhaben. Um auf einem 4k-Monitor den gleichen Text zu erhalten, müssen Sie 200% anstelle von 100% auf einem Standardmonitor auswählen.
Ab Mai 2018 muss ich die Zoomstufen für einige der beliebtesten Browser, Chrome, Firefox und IE11, ermitteln. Ich habe es mir sagen lassen, wie hoch der Zoom-Prozentsatz ist. Für IE werden 100% gemeldet, selbst für 4k-Monitore, die tatsächlich bei 200% liegen, aber die Textgröße ist wirklich dieselbe.
Hier ist eine Geige: https://jsfiddle.net/ae1hdogr/
Wenn jemand andere Browser ausprobieren und die Geige aktualisieren möchte, tun Sie dies bitte. Mein Hauptziel war es, diese 3 Browser abzudecken, um festzustellen, ob Benutzer einen Zoomfaktor von mehr als 100% für die Verwendung meiner Webanwendung verwendeten, und einen Hinweis anzuzeigen, der einen Zoomfaktor für den Vermieter vorschlägt.
quelle