Safari iPhone - Как определить масштаб и смещение?
Я ищу варианты, как отслеживать масштабирование и панорамирование пользователей на странице при просмотре в Safari на iPhone. Safari раскрывает события перемещения и жестов, поэтому теоретически я могу поддерживать текущее количество операций панорамирования и масштабирования, но это кажется излишним, поскольку браузер должен отслеживать это внутри.
Открыта ли эта информация через объектную модель документа?
Ответы
Ответ 1
Когда вы увеличиваете масштаб, window.innerWidth
настраивается, но document.documentElement.clientWidth
нет, поэтому:
var zoom = document.documentElement.clientWidth / window.innerWidth;
(Я тестировал iOS4, без viewport
<meta>
).
Однако я бы не стал полагаться на это ни на что важное. Размеры/размеры пикселей DOM в мобильных браузерах - полный беспорядок.
Ответ 2
В соответствии с Руководство по веб-контенту Safari события трансляции (двойное нажатие) не отображаются, поэтому я не уверен, как вы можете отслеживать это.
Я не верю, что эта информация открыта через DOM.
Ответ 3
На самом деле я думаю, что все могло немного измениться со времени ответа Стива, так как он посмотрел ссылку на содержание, которую он предоставил. Я вижу раздел Обработка событий Multi-Touch, а также Обработка событий жестов.
Не пробовал, но они выглядят довольно многообещающими. Я предоставлю обновление после того, как проведу их, и у вас будет доступная демонстрационная ссылка...
Ответ 4
В 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).
Ответ 5
Я измеряю масштаб таким образом (работает только на iOS):
screenOrientedWidth = screen.width;
if (window.orientation == 90) {
screenOrientedWidth = screen.height;
}
return screenOrientedWidth / window.innerWidth;
Это не зависит от того, насколько широко распространен контент.
Однако в iOS Safari window.innerWidth
неверно внутри обработчика gestureend
. Вы должны отложить такой расчет для последующего исполнения. В GWT я использую scheduleDeferred
, но я не могу сказать, как реализовать это в чистом JavaScript.