¿Cómo puedo detectar el nivel de zoom de la página en todos los navegadores modernos? Si bien este hilo dice cómo hacerlo en IE7 e IE8, no puedo encontrar una buena solución para varios navegadores.
Firefox almacena el nivel de zoom de la página para acceso futuro. En la primera carga de la página, ¿podría obtener el nivel de zoom? En algún lugar que leí funciona cuando ocurre un cambio de zoom después de cargar la página.
¿Hay alguna manera de atrapar el
'zoom'
evento?
Necesito esto porque algunos de mis cálculos están basados en píxeles y pueden fluctuar al hacer zoom.
Muestra modificada dada por @tfl
Esta página alerta diferentes valores de altura cuando se hace 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
falta de comprensión
fuente
fuente
Respuestas:
Ahora es un desastre aún mayor que cuando se hizo esta pregunta por primera vez. Al leer todas las respuestas y publicaciones de blog que pude encontrar, aquí hay un resumen. También configuré esta página para probar todos estos métodos de medición del nivel de zoom .
Editar (12/12/2011): agregué un proyecto que se puede clonar: https://github.com/tombigel/detect-zoom
screen.deviceXDPI / screen.logicalXDPI
(o, para el nivel de zoom relativo al zoom predeterminado,screen.systemXDPI / screen.logicalXDPI
)var body = document.body,r = body.getBoundingClientRect(); return (r.left-r.right)/body.offsetWidth;
(gracias a este ejemplo o esta respuesta )screen.width
/ ancho de pantalla de consulta de medios (ver más abajo) (aprovecha el hecho de quescreen.width
usa píxeles de dispositivo pero el ancho de MQ usa píxeles de CSS - gracias a los anchos de Quirksmode )-webkit-text-size-adjust:none
.document.width / jQuery(document).width()
(gracias a Dirk van Oosterbosch arriba ). Para obtener la proporción en términos de píxeles del dispositivo (en lugar de en relación con el zoom predeterminado), multiplique porwindow.devicePixelRatio
.parseInt(getComputedStyle(document.documentElement,null).width) / document.documentElement.clientWidth
(de esta respuesta )document.documentElement.offsetWidth
/ ancho de unposition:fixed; width:100%
div. desde aquí ( la tabla de anchos de Quirksmode dice que es un error; innerWidth debería ser CSS px). Usamos el elemento position: fixed para obtener el ancho de la ventana gráfica, incluido el espacio donde están las barras de desplazamiento ; document.documentElement.clientWidth excluye este ancho. Esto está roto desde algún momento en 2011; Ya no sé cómo obtener el nivel de zoom en Opera.Aquí hay una búsqueda binaria para Firefox 4, ya que no conozco ninguna variable donde esté expuesta:
fuente
zoom: screen.deviceXDPI / screen.logicalXDPI,
lugar dezoom: screen.systemXDPI / screen.logicalXDPI,
matchMedia
. Paul Irish también escribió un polyfill matchMedia similar que forma parte de Modernizr .Puedes probar
Esto le proporcionará un nivel de porcentaje de zoom del navegador en pantallas sin retina. Para pantallas de alta DPI / retina, produciría diferentes valores (por ejemplo, 200 para Chrome y Safari, 140 para Firefox).
Para capturar el evento de zoom, puede usar
fuente
devicePixelRatio
. Esto también me ayudó mucho a cambiar unfixed
elemento a un elementoabsolute
colocado correctamente cuando se produce el evento de zoom o cuandodevicePixelRatio
cambia el valor inicial . ¡Perfecto! ¡¡Gracias!!Math.round(window.devicePixelRatio * 100)
funciona en Chrome, IE, Edge y Firefox. Safari en iMac siempre devuelve 200.Para mí, para Chrome / Webkit,
document.width / jQuery(document).width()
no funcionó. Cuando hice que mi ventana fuera pequeña y amplié mi sitio de modo que aparecieran barras de desplazamiento horizontales,document.width / jQuery(document).width()
no era igual a 1 en el zoom predeterminado. Esto es porquedocument.width
incluye parte del documento fuera de la ventana gráfica.Utilizando
window.innerWidth
ywindow.outerWidth
trabajado. Por alguna razón en Chrome, el ancho externo se mide en píxeles de pantalla y el ancho interno se mide en píxeles CSS.fuente
isZoomed = (screenCssPixelRatio < .98 || screenCssPixelRatio > 1.02)
switch
declaración puede ser mejor que muchas declaraciones de lo contrario.Mi compañero de trabajo y yo usamos el script de https://github.com/tombigel/detect-zoom . Además, también creamos dinámicamente un elemento svg y verificamos su propiedad currentScale. Funciona muy bien en Chrome y probablemente también en la mayoría de los navegadores. Sin embargo, en FF la función "solo texto de zoom" tiene que estar desactivada. SVG es compatible con la mayoría de los navegadores. Al momento de escribir esto, probado en IE10, FF19 y Chrome28.
fuente
Encontré este artículo enormemente útil. Muchas gracias a yonran. Quería transmitir algo de aprendizaje adicional que encontré mientras implementaba algunas de las técnicas que proporcionó. En FF6 y Chrome 9, se agregó soporte para consultas de medios de JS, lo que puede simplificar en gran medida el enfoque de consulta de medios necesario para determinar el zoom en FF. Vea los documentos en MDN aquí . Para mis propósitos, solo necesitaba detectar si el navegador estaba ampliado o reducido, no necesitaba el factor de zoom real. Pude obtener mi respuesta con una línea de JavaScript:
Combinando esto con las soluciones IE8 + y Webkit, que también eran líneas simples, pude detectar el zoom en la gran mayoría de los navegadores que golpean nuestra aplicación con solo unas pocas líneas de código.
fuente
devicePixelRatio
: tiene en cuenta la escala de visualización.Eso es todo lo que necesitas.
fuente
10
deouterWidth
?Tengo una solución para esto a partir de enero de 2016. Probado trabajando en los navegadores Chrome, Firefox y MS Edge.
El principio es el siguiente. Recoge 2 puntos MouseEvent que están muy separados. Cada evento del mouse viene con coordenadas de pantalla y documento. Mida la distancia entre los 2 puntos en ambos sistemas de coordenadas. Aunque existen desplazamientos fijos variables entre los sistemas de coordenadas debido al mobiliario del navegador, la distancia entre los puntos debe ser idéntica si la página no se amplía. La razón para especificar "muy separados" (pongo esto como 12 píxeles) es para que se puedan detectar pequeños cambios de zoom (por ejemplo, 90% o 110%).
Referencia: https://developer.mozilla.org/en/docs/Web/Events/mousemove
Pasos:
Agregar un oyente de movimiento del mouse
Capture 4 mediciones de eventos del mouse:
Mida la distancia d_c entre los 2 puntos en el sistema cliente
Mida la distancia d_s entre los 2 puntos en el sistema de pantalla
Si d_c! = D_s, se aplica el zoom. La diferencia entre los dos te dice la cantidad de zoom.
Nota: rara vez solo hace los cálculos de distancia, por ejemplo, cuando puede probar un nuevo evento de mouse que está lejos del anterior.
Limitaciones: Asume que el usuario moverá el mouse al menos un poco, y el zoom es incognoscible hasta este momento.
fuente
Puede usar la API de Visual Viewport :
Es estándar y funciona tanto en computadoras de escritorio como en dispositivos móviles: soporte de navegador .
fuente
En Internet Explorer 7, 8 y 9, esto funciona:
Se agrega "+0.9" para evitar errores de redondeo (de lo contrario, obtendría 104% y 109% cuando el zoom del navegador esté configurado en 105% y 110% respectivamente).
En IE6 el zoom no existe, por lo que no es necesario verificar el zoom.
fuente
Lo que se me ocurrió es:
1) Hacer un
position:fixed
<div>
conwidth:100%
( id = zoomdiv )2) cuando se carga la página:
Y funcionó para mí
ctrl+
yctrl-
zooms.o puedo agregar la línea a un
$(window).onresize()
evento para obtener el nivel de zoom activoCódigo:
PD: esta es mi primera publicación, perdón por cualquier error
fuente
screen.availWidth
informa el ancho de la pantalla en píxeles de la pantalla, no la ventana del navegador).Esto me ha funcionado muy bien en navegadores basados en webkit (Chrome, Safari):
Sin embargo, no parece funcionar en Firefox.
Esto también funciona en WebKit:
fuente
document.width
vuelve indefinidoBásicamente tenemos:
window.devicePixelRatio
que tiene en cuenta tanto el zoom a nivel del navegador * como el zoom del sistema / densidad de píxeles.* - en Mac / Safari el nivel de zoom no se tiene en cuenta
vw
/vh
Unidades CSSresize
evento, que se activa al cambiar el nivel de zoom, causa cambios efectivos en el tamaño de la ventanaeso debería ser suficiente para UX normal . Si necesita detectar el nivel de zoom, eso podría ser un signo de un mal diseño de la interfaz de usuario.
Pitch-zoom es más difícil de rastrear y no se considera actualmente.
fuente
En dispositivos móviles (con Chrome para Android u Opera Mobile) puede detectar el zoom por window.visualViewport.scale . https://developer.mozilla.org/en-US/docs/Web/API/Visual_Viewport_API
Detectar en Safari: document.documentElement.clientWidth / window.innerWidth (devuelve 1 si no se hace zoom en el dispositivo).
fuente
Sus cálculos aún se basan en una cantidad de píxeles CSS. Son solo un tamaño diferente en la pantalla ahora. Ese es el punto del zoom de página completa.
¿Qué le gustaría que suceda en un navegador en un dispositivo de 192 ppp que, por lo tanto, normalmente muestra cuatro píxeles de dispositivo por cada píxel en una imagen? Con un zoom del 50%, este dispositivo ahora muestra un píxel de imagen en un píxel del dispositivo.
fuente
En Chrome
fuente
No probé esto para IE, pero si crea un elemento
elem
conluego
le dará el nivel de zoom de su navegador (incluido el
document.body.style.zoom
factor).fuente
Esto es para Chrome , a raíz de la respuesta del usuario 800583 ...
Pasé unas horas en este problema y no he encontrado un mejor enfoque, pero:
window.outerWidth/window.innerWidth
, y cuando no lo es, la relación parece ser(window.outerWidth-16)/window.innerWidth
, sin embargo, el primer caso puede ser abordado por el segundo.Entonces llegué a lo siguiente ...
Pero este enfoque tiene limitaciones: por ejemplo, si toca el acordeón con la ventana de la aplicación (amplía y reduce rápidamente el ancho de la ventana), obtendrá brechas entre los niveles de zoom, aunque el zoom no ha cambiado (puede ser exteriorWidth y innerWidth no exactamente actualizado al mismo tiempo).
Y si quieres el factor:
fuente
Tengo esta solución solo para dispositivos móviles (probado con Android):
Si desea el nivel de zoom justo después del movimiento de pellizco, probablemente tendrá que establecer un poco de tiempo de espera debido al retraso de renderizado (pero no estoy seguro porque no lo probé).
fuente
Esta respuesta se basa en comentarios acerca de que DevicePixelRatio regresa incorrectamente en la respuesta del usuario 1080381.
Descubrí que este comando también regresaba incorrectamente en algunos casos al trabajar con un escritorio, Surface Pro 3 y Surface Pro 4.
Lo que encontré es que funcionaba en mi escritorio, pero el SP3 y el SP4 estaban dando números diferentes entre sí y el escritorio.
Sin embargo, noté que el SP3 regresaba como 1 y media veces el nivel de zoom que esperaba. Cuando eché un vistazo a la configuración de pantalla, el SP3 estaba configurado en 150% en lugar del 100% que tenía en mi escritorio.
Entonces, la solución a los comentarios debería ser dividir el nivel de zoom devuelto por la escala de la máquina en la que se encuentra actualmente.
Pude obtener la escala en la configuración de Windows haciendo lo siguiente:
Entonces, en el caso de mi SP3, así es como se ve este código al 100% de zoom:
Multiplicar por 100 en la respuesta original de user1080381 le daría un zoom de 100 (%).
fuente
Tenerlo funcionando actualmente, sin embargo, aún debe separarse por navegador. Probado con éxito en Chrome (75) y Safari (11.1) (todavía no he encontrado el camino para FF). También obtiene el valor de zoom correcto en la pantalla de retina y los cálculos se activan en el evento de cambio de tamaño.
fuente
¡aquí no cambia !:
cree un archivo html simple, haga clic en el botón. independientemente de qué nivel de zoom: le mostrará el ancho de 400 px (al menos con Firefox y ie8)
fuente
Esto puede o no ayudar a nadie, pero tenía una página que no pude centrar correctamente sin importar los trucos de Css que intenté, así que escribí una página del Centro de llamadas de archivos JQuery:
El problema ocurrió con el nivel de zoom del navegador, la página cambiaría en función de si usted fuera 100%, 125%, 150%, etc.
El siguiente código está en un archivo JQuery llamado centerpage.js.
Desde mi página tuve que vincular a JQuery y este archivo para que funcionara, a pesar de que mi página maestra ya tenía un enlace a JQuery.
centerpage.js
:Además, si desea centrar un panel:
fuente
Esta es una pregunta publicada hace mucho tiempo, pero hoy cuando estaba buscando la misma respuesta "Cómo detectar el evento de acercamiento y alejamiento", no pude encontrar una respuesta que se ajustara a todos los navegadores.
Como ahora: para Firefox / Chrome / IE8 e IE9, el acercamiento y alejamiento dispara un evento window.resize. Esto se puede capturar usando:
fuente
Una solución alternativa para FireFox 16+ para encontrar DPPX (nivel de zoom) únicamente con JavaScript:
fuente
fuente
El problema radica en los tipos de monitor utilizados, un monitor 4k frente a un monitor estándar. Chrome es, con mucho, el más inteligente al poder decirnos cuál es el nivel de zoom con solo usar
window.devicePixelRatio
, aparentemente puede decir cuál es la densidad de píxeles e informa el mismo número para importar qué.Otros navegadores, no tanto. IE y Edge son probablemente los peores, ya que manejan los niveles de zoom de manera muy diferente. Para obtener el mismo tamaño de texto en un monitor 4k, debe seleccionar 200%, en lugar de 100% en un monitor estándar.
A partir de mayo de 2018, esto es lo que tengo para detectar los niveles de zoom para algunos de los navegadores más populares, Chrome, Firefox e IE11. Tengo que decirme cuál es el porcentaje de zoom. Para IE, informa 100% incluso para monitores 4k que en realidad están al 200%, pero el tamaño del texto es realmente el mismo.
Aquí hay un violín: https://jsfiddle.net/ae1hdogr/
Si alguien quisiera apuñalar a otros navegadores y actualizar el violín, entonces hágalo. Mi objetivo principal era cubrir estos 3 navegadores para detectar si las personas usaban un factor de zoom superior al 100% para usar mi aplicación web y mostrar un aviso que sugiriera un factor de zoom menor.
fuente