На Android вы можете выработать текущее масштабирование, добавив абсолютный div к телу шириной 100% и разделив его offsetWidth на window.innerWidth
.
var iPadMeasureWidthNode = window.iPadWNode;
if (!iPadMeasureWidthNode) {
iPadMeasureWidthNode = window.iPadWNode = document.createElement('div');
// .ipad-measure-w {position:absolute; width:100%; top:-1px}
iPadMeasureWidthNode.className = 'ipad-measure-w';
document.body.insertBefore(iPadMeasureWidthNode, document.body.firstChild);
}
var zoominverse = 1000/Math.round(1000 * iPadMeasureWidthNode.offsetWidth/window.innerWidth);
Вы можете оставить элемент на 1: 1 трансфокатора переворачивания (расстегивать) степень увеличения:
// Not using scale3d because is hardware zooming which is ugly unreadable blurry pixel magnification.
node.style.webkitTransform = (zoominverse > 1) ? 'scale(' + zoominverse + ')' : '';
node.style.webkitTransformOrigin = (zoominverse > 1) ? '0 0 0' : '';
Увеличить изменение детектируется window.onresize
события (хотя изменение размера событие откладывается до тех пор, после того, как изменение размера завершено ... вы можете обнаружить начало трансляции, используя событие gesturestart
на iPad, или document.touchstart
событие и обнаружить 2 пальца вниз).
Редактировать: После трех исправлений, говорящих, что это не работает, я подумал, что лучше добавить пример, показывающий, что он работает. Тестируемые работы: Android 4.1.2 обычный браузер, Android 4.1.2 Chrome, Android Opera Mobile 12.10, iPad 2 iOS4. (Не работает на Android Firefox Mobile и не будет работать в iframe, поэтому jsfiddle не будет работать).
<!DOCTYPE html>
<html>
<head>
<style>
.ipad-measure-w {
position: absolute;
width: 100%;
top: -1px;
};
</style>
</head>
<body>
<button onclick="alertWidth()">alertWidth</button>
<div style="width: 1600px; height: 100px; background-color: blue;"></div>
<script>
function alertWidth() {
var iPadMeasureWidthNode = window.iPadWNode;
if (!iPadMeasureWidthNode) {
iPadMeasureWidthNode = window.iPadWNode = document.createElement('div');
iPadMeasureWidthNode.className = 'ipad-measure-w';
document.body.insertBefore(iPadMeasureWidthNode, document.body.firstChild);
}
var zoominverse = 1000/Math.round(1000 * iPadMeasureWidthNode.offsetWidth/window.innerWidth);
alert(zoominverse);
}
</script>
</body>
</html>
Не могли бы вы привести пример для очень неточных значений? Что-то ссылка «сообщила ширина/высота: x/y, фактическая ширина/высота: a/b». – Daniel
На Droid X под управлением Android 2.2, сообщает ширину экрана = 800, фактическая ширина экрана 480. Высота отображаемого экрана = 1360, фактическая высота экрана = 854.При перезагрузке страницы сообщается высота экрана = 1220, фактическая высота экрана еще = 854 - Питер –
Спасибо, это странно. Кажется, что это не имеет никакого отношения к DPI устройства. – Daniel