Получить координаты центра веб-страницы на планшетных устройствах с помощью JavaScript

Я пытаюсь вычислить геометрический центр окна просмотра на веб-странице, отображаемой с помощью планшетных устройств (iOS и Android), ie на фактический центр окна просмотра (что вы видите) в соответствии с текущим перевод и ток масштаб - не хочу центр самого документа, я хочу центр экрана, что я просматриваю.

проблема в том, что этот расчет не учитывает какой-либо зум (затем) перевод.

на iOS я пробовал с некоторыми из этих ответов, на вопрос обнаружение pinch для увеличения iOS, Я смог поймать событие "OnZoom", но не получил никакого значения.

на Android я даже не могу поймать какое-либо событие, связанное с масштабированием. Я знаю о событиях touchmove и touchstart, но как я могу отличить их, чтобы получить масштаб (и значение масштабирования)

Я использую библиотеку jQuery 1.7.2.

3 ответов


Я демо-страницы что подтверждено для работы на iPhone iPad, Samsung Galaxy Tab 10. Я только прикрепил событие click на огромном div, поэтому нажмите на экран после масштабирования, чтобы обновить дисплей.

расчет очень прост, используйте screen.width/window.innerWidth чтобы получить уровень масштабирования. screen.width всегда будет в пикселях устройства и window.innerWidth всегда находится в CSS-пикселях,которые также учитывают масштабирование.

дальнейший расчет прост математика:

// round the result down to avoid "half pixels" for odd zoom levels
Math.floor(window.scrollY + window.innerHeight/2);
Math.floor(window.scrollX + window.innerWidth/2);

чтобы проверить, масштабируется ли пользователь, прикрепите прослушиватель к window.resize и window.scroll, который будет срабатывать после orientationchange скрытие адресной строки и масштабирование.

вот моя демонстрация JavaScript:

var dot = document.getElementById("dot");
document.getElementById("main").addEventListener("click", function(e) {
    var zoom = screen.width / window.innerWidth;
    alert("zoom: " + zoom + "\n" + "ScrollY: " + window.scrollY);

    dot.style.top = Math.floor(window.scrollY + window.innerHeight/2 - 5) + "px";
    dot.style.left = Math.floor(window.scrollX + window.innerWidth/2 - 5) + "px";

}, false);

настройка простой HTML-страницы, я могу получить довольно близко к центру.

С кодом ниже, я просто проверяю ширину и высоту фиксированного div, а затем комбинирую это со смещением документа и некоторыми простыми математиками, чтобы выяснить центр и поместить туда одну черную точку. Я могу получить его довольно близко, но он варьируется на моем iPhone 4S.

не пробовали на устройствах Android.

Я не думаю, что это будет работать на iOS

<style>
#fixed{
position: fixed;
left: 0; right: 0; top: 0; bottom: 0;
background: orange; opacity: 0.25;
}
.black{
  position: absolute;
  top:0;left:0;
  width: 1px; height: 1px;
  background: black;
}
</style>

<body>
<div id="fixed"></div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"></script>
<script>
jQuery(function($){
setInterval(function(){
var top = ($("#fixed").height()/2) + $("#fixed").offset().top;
var left = ($("#fixed").width()/2) + $("#fixed").offset().left;
$("body").append('<div class="black" style="top: '+top+'px; left: '+left+'px;" />');
}, 1500)

});
</script>
</body>

пару лет назад у меня был клиентский запрос на метод обнаружения масштабирования страницы в javascript.

в моем случае он хотел, чтобы он работал в приложении facebook. Через холст/видовое окно iframe.

я использовал функции Max и Min

function getDocHeight() {
    var D = document;
    return Math.max(
        Math.max(D.body.scrollHeight, D.documentElement.scrollHeight),
        Math.max(D.body.offsetHeight, D.documentElement.offsetHeight),
        Math.max(D.body.clientHeight, D.documentElement.clientHeight)
    );
}
function getDocWidth() {
    var D = document;
    return Math.max(
        Math.max(D.body.scrollWidth, D.documentElement.scrollWidth),
        Math.max(D.body.offsetWidth, D.documentElement.offsetWidth),
        Math.max(D.body.clientWidth, D.documentElement.clientWidth)
    );
}

function getMinHeight(h) {
return Math.min(viewport.currentHeight, getDocHeight(), h);
}

getMinWidth был похож, но мне пришлось применить к нему настройки браузера.

Я создал объект под названием viewport, который сохранил свойства фиксированной позиции div, в частности currentHeight и currentWidth были offsetHeight и offsetWidth элемента div.

Я закончил инициализацию окна.intervalTimer для выполнения проверок состояния этого div, comparedTo сохраненные значения в объекте viewport.

Я уверен, что прикрепление или добавление прослушивателей событий не было вариантом через iframe.

У меня все еще есть демо-код на заброшенном веб-сайте, которым я вроде как управляю.. хаха http://focalpointproperties.net/vWorker/proj_zoomcontrol.php