Ответ 1
Вы видели Как определить уровень масштабирования страницы во всех современных браузерах?
Мы можем использовать window.devicePixelRatio
или предложенный там метод двоичного поиска для определения отношения пикселей. Затем мы масштабируем window.screenX
и window.screenY
с этим коэффициентом:
var X = window.screenX * pixelratio;
var Y = window.screenY * pixelratio;
Я тестировал это в Firefox 48, и положение окна изменилось не более чем на 2 пикселя при изменении уровня масштабирования. Использование window.devicePixelRatio
или двоичный поиск дали практически те же результаты. Я думаю, что отключение 2 пикселя может быть очень раздражающим для графических приложений, но определение уровня масштабирования кажется грязным.
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<input id="button" type="button" value="Click me!"/>
<style id=binarysearch></style>
<div id=dummyElement>Dummy element to test media queries.</div>
<script>
var mediaQueryMatches = function(property, r) {
var style = document.getElementById('binarysearch');
var dummyElement = document.getElementById('dummyElement');
style.sheet.insertRule('@media (' + property + ':' + r +
') {#dummyElement ' +
'{text-decoration: underline} }', 0);
var matched = getComputedStyle(dummyElement, null).textDecoration
== 'underline';
style.sheet.deleteRule(0);
return matched;
};
var mediaQueryBinarySearch = function(
property, unit, a, b, maxIter, epsilon) {
var mid = (a + b)/2;
if (maxIter == 0 || b - a < epsilon) return mid;
if (mediaQueryMatches(property, mid + unit)) {
return mediaQueryBinarySearch(property, unit, mid, b, maxIter-1, epsilon);
} else {
return mediaQueryBinarySearch(property, unit, a, mid, maxIter-1, epsilon);
}
};
</script>
<script type="text/javascript">
var b = document.getElementById("button");
b.onclick = function() {
var pixelratio = mediaQueryBinarySearch(
'min--moz-device-pixel-ratio', '', 0, 6000, 25, .00001);
console.log("devicePixelRatio:", window.screenX * window.devicePixelRatio, window.screenY * window.devicePixelRatio);
console.log("binary search:", window.screenX * pixelratio, window.screenY * pixelratio);
console.log(Math.abs(pixelratio - window.devicePixelRatio));
}
</script>
</body>
</html>