В Mobile Safari и Android приведен точный способ измерения масштаба страницы.
Попробуйте здесь: http://jsbin.com/cobucu/3 - измените масштаб, затем нажмите мера.
Техника заключается в добавлении div верхнего уровня:
<body>
<div id=measurer style="position:absolute;width:100%"></div>
и используйте расчет:
function getZoom(){
return document.getElementById('measurer').offsetWidth / window.innerWidth;
}
Единственная проблема заключается в нахождении аккуратного способа определить, что пользователь изменил масштаб (увеличение, двойное нажатие и т. Д.). Опции:
- webkitRequestAnimationFrame: очень надежный, но может вызвать шаткость при использовании анимации (из-за снижения производительности)
- setInterval: надежный, но очень уродливый
- события касания: ищите два пальца или
двойное нажатие: уродливо и, возможно, трудно сделать 100% надежным
- window.onresize + window.onorientationchange + window.onscroll: просто, но совершенно ненадежно (Edit: и onscroll могут вызвать проблемы с производительностью в WKWebView или Mobile Safari 8 или более поздней версии).
PS: Windows Phone нужно другое решение (масштабирование с пинч-эффектом не меняет область просмотра - масштабирование на Windows имеет собственный отдельный видовой экран, который невидим для javascript).
Редактировать: Android Visual Viewport изменения размера и прокрутки события могут помочь? См https://developer.mozilla.org/en-US/docs/Web/API/VisualViewport#Events