Как определить уровень масштабирования страницы во всех современных браузерах? Хотя в этой теме рассказывается, как это сделать в IE7 и IE8, я не могу найти хорошего кросс-браузерного решения.
Firefox сохраняет уровень масштабирования страницы для последующего доступа. Смогу ли я получить уровень масштабирования при загрузке первой страницы? Где-то я читал, что это работает, когда изменение масштаба происходит после загрузки страницы.
Есть ли способ отловить
'zoom'
событие?
Мне это нужно, потому что некоторые из моих расчетов основаны на пикселях и могут изменяться при увеличении.
Модифицированный образец, данный @tfl
Эта страница предупреждает о различных значениях высоты при увеличении. [jsFiddle]
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js" type="text/javascript"/></script>
</head>
<body>
<div id="xy" style="border:1px solid #f00; width:100px;">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque sollicitudin tortor in lacus tincidunt volutpat. Integer dignissim imperdiet mollis. Suspendisse quis tortor velit, placerat tempor neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent bibendum auctor lorem vitae tempor. Nullam condimentum aliquam elementum. Nullam egestas gravida elementum. Maecenas mattis molestie nisl sit amet vehicula. Donec semper tristique blandit. Vestibulum adipiscing placerat mollis.</div>
<button onclick="alert($('#xy').height());">Show</button>
</body>
</html>
javascript
browser
zoom
detection
understack
источник
источник
Ответы:
Теперь это еще больший беспорядок, чем это было, когда этот вопрос был впервые задан. Прочитав все ответы и сообщения в блоге, которые я смог найти, вот краткое изложение. Я также настроил эту страницу, чтобы протестировать все эти методы измерения уровня масштабирования .
Изменить (2011-12-12): я добавил проект, который можно клонировать: https://github.com/tombigel/detect-zoom
screen.deviceXDPI / screen.logicalXDPI
(или для уровня масштабирования относительно масштаба по умолчаниюscreen.systemXDPI / screen.logicalXDPI
)var body = document.body,r = body.getBoundingClientRect(); return (r.left-r.right)/body.offsetWidth;
(благодаря этому примеру или этому ответу )screen.width
/ ширина экрана медиа-запроса (см. Ниже) (используется тот факт, чтоscreen.width
используются пиксели устройства, но ширина MQ использует пиксели CSS - благодаря ширине Quirksmode )-webkit-text-size-adjust:none
.document.width / jQuery(document).width()
(спасибо Дирку ван Остербошу выше ). Чтобы получить соотношение в пикселях устройства (вместо относительного увеличения по умолчанию), умножьте наwindow.devicePixelRatio
.parseInt(getComputedStyle(document.documentElement,null).width) / document.documentElement.clientWidth
(из этого ответа )document.documentElement.offsetWidth
/ ширинаposition:fixed; width:100%
деления. отсюда ( таблица ширины Quirksmode говорит, что это ошибка; innerWidth должен быть CSS px). Мы используем элемент position: fixed, чтобы получить ширину области просмотра, включая пространство, где находятся полосы прокрутки ; document.documentElement.clientWidth исключает эту ширину. Это сломано с 2011 года; Я не знаю способа получить уровень масштабирования в Opera больше.Вот бинарный поиск для Firefox 4, так как я не знаю ни одной переменной, где он представлен:
источник
zoom: screen.deviceXDPI / screen.logicalXDPI,
вместоzoom: screen.systemXDPI / screen.logicalXDPI,
matchMedia
. Пол Ирриш также написал аналогичный matchMedia polyfill, который является частью Modernizr .Можешь попробовать
Это даст вам процент увеличения масштаба браузера на дисплеях без сетчатки. Для дисплеев с высоким DPI / сетчаткой он будет давать разные значения (например, 200 для Chrome и Safari, 140 для Firefox).
Чтобы поймать событие масштабирования вы можете использовать
источник
devicePixelRatio
. Это также очень помогло мне переключитьfixed
элемент на элемент сabsolute
положительным позиционированием, когда происходит событие масштабирования или когда изменяется начальное значениеdevicePixelRatio
. Отлично! Спасибо!!Math.round(window.devicePixelRatio * 100)
работает на Chrome, IE, Edge и Firefox. Safari на iMac всегда возвращает 200.Для меня, для Chrome / Webkit,
document.width / jQuery(document).width()
не сработало. Когда я уменьшил размер окна и увеличил масштаб моего сайта до появления горизонтальных полос прокрутки, онdocument.width / jQuery(document).width()
не стал равным 1 при увеличении по умолчанию. Это потому, чтоdocument.width
включает в себя часть документа за пределами области просмотра.Используя
window.innerWidth
иwindow.outerWidth
работал. По какой-то причине в Chrome externalWidth измеряется в пикселях экрана, а innerWidth измеряется в пикселях CSS.источник
isZoomed = (screenCssPixelRatio < .98 || screenCssPixelRatio > 1.02)
switch
утверждение может быть лучше, чем многие, если еще заявления.Мой коллега и я использовали скрипт из https://github.com/tombigel/detect-zoom . Кроме того, мы также динамически создали элемент svg и проверили его свойство currentScale. Он отлично работает на Chrome и, вероятно, на большинстве браузеров. На FF функция «только масштабирование текста» должна быть отключена. SVG поддерживается в большинстве браузеров. На момент написания статьи проверялось на IE10, FF19 и Chrome28.
источник
Я нашел эту статью чрезвычайно полезной. Огромное спасибо Йонрану. Я хотел пройти некоторое дополнительное обучение, которое я нашел, внедряя некоторые из методов, которые он обеспечил. В FF6 и Chrome 9 была добавлена поддержка медиазапросов из JS, что может значительно упростить подход к медиазапросам, необходимый для определения увеличения FF. Смотрите документы в MDN здесь . Для моих целей мне нужно было только определить, был ли браузер увеличен или уменьшен, мне не требовался фактический коэффициент увеличения. Я смог получить ответ с одной строкой JavaScript:
Комбинируя это с решениями IE8 + и Webkit, которые также были однострочными, я смог обнаружить увеличение в большинстве браузеров, попавших в наше приложение всего несколькими строками кода.
источник
devicePixelRatio
: он учитывает масштабирование отображения.Это все, что вам нужно.
источник
10
изouterWidth
?У меня есть решение для этого с января 2016 года. Проверено на работу в браузерах Chrome, Firefox и MS Edge.
Принцип заключается в следующем. Соберите 2 очка MouseEvent, которые находятся далеко друг от друга. Каждое событие мыши имеет экран и координаты документа. Измерьте расстояние между двумя точками в обеих системах координат. Несмотря на то, что из-за мебели браузера существуют переменные фиксированные смещения между системами координат, расстояние между точками должно быть одинаковым, если страница не масштабирована. Причиной указания «далеко друг от друга» (я назвал это 12 пикселями) является то, что небольшие изменения масштаба (например, 90% или 110%) можно обнаружить.
Ссылка: https://developer.mozilla.org/en/docs/Web/Events/mousemove
шаги:
Добавить слушателя перемещения мыши
Захват 4 измерений от событий мыши:
Измерьте расстояние d_c между двумя точками в клиентской системе
Измерьте расстояние d_s между двумя точками в системе экранов
Если d_c! = D_s, то применяется масштабирование. Разница между ними говорит о величине увеличения.
Обратите внимание, что вычисления расстояний выполняются редко, например, когда вы можете выбрать новое событие мыши, которое далеко от предыдущего.
Ограничения: Предполагается, что пользователь будет двигать мышь хотя бы немного, а масштаб до этого времени неизвестен.
источник
Вы можете использовать Visual Viewport API :
Он стандартный и работает как на настольном, так и на мобильном устройствах: поддержка браузера .
источник
В Internet Explorer 7, 8 и 9 это работает:
«+0,9» добавлено для предотвращения ошибок округления (в противном случае вы получите 104% и 109%, если масштаб браузера установлен на 105% и 110% соответственно).
В IE6 масштабирования не существует, поэтому нет необходимости проверять масштаб.
источник
Что я придумал, это:
1) Сделать
position:fixed
<div>
сwidth:100%
( id = zoomdiv )2) когда страница загружается:
И это работает для меня
ctrl+
иctrl-
увеличивает.или я могу добавить строку к
$(window).onresize()
событию, чтобы получить активный уровень масштабированияКод:
PS: это мой первый пост, простите за любые ошибки
источник
screen.availWidth
сообщает ширину экрана в пикселях экрана, а не в окне браузера).Это отлично работает для меня в браузерах на основе webkit (Chrome, Safari):
Похоже, не работает в Firefox.
Это также работает в WebKit:
источник
document.width
возвращается не определеноВ основном мы имеем:
window.devicePixelRatio
которая учитывает как масштабирование на уровне браузера *, так и системное масштабирование / плотность пикселей.* - на Mac / Safari уровень масштабирования не учитывается
vw
/vh
CSS единицыresize
событие, которое срабатывает при изменении уровня масштабирования, вызывает эффективный размер изменения окнаэтого должно быть достаточно для нормального UX. Если вам нужно определить уровень масштабирования, это может быть признаком плохого дизайна пользовательского интерфейса.
Pitch-zoom сложнее отследить и в настоящее время не рассматривается.
источник
На мобильных устройствах (с Chrome для Android или Opera Mobile) вы можете обнаружить увеличение по window.visualViewport.scale . https://developer.mozilla.org/en-US/docs/Web/API/Visual_Viewport_API
Определить в Safari: document.documentElement.clientWidth / window.innerWidth (возвращает 1, если на устройстве нет масштабирования).
источник
Ваши расчеты по-прежнему основаны на количестве пикселей CSS. Теперь они просто другого размера на экране. В этом смысл полного увеличения страницы.
Что бы вы хотели, чтобы происходило в браузере на устройстве с разрешением 192 точек на дюйм, которое обычно отображало четыре пикселя устройства для каждого пикселя изображения? При увеличении 50% это устройство теперь отображает один пиксель изображения в одном пикселе устройства.
источник
На Chrome
источник
Не проверял это для IE, но если вы сделаете элемент
elem
сзатем
даст вам уровень масштабирования вашего браузера (включая
document.body.style.zoom
фактор).источник
Это для Chrome , в ответ user800583 ответить ...
Я потратил несколько часов на эту проблему и не нашел лучшего подхода, но:
window.outerWidth/window.innerWidth
, а когда нет, соотношение, по-видимому, равно(window.outerWidth-16)/window.innerWidth
, однако 1-й случай может быть приближен ко 2-му.Итак, я пришел к следующему ...
Но у этого подхода есть ограничения: например, если вы играете на аккордеоне с окном приложения (быстро увеличиваете и уменьшаете ширину окна), вы получите промежутки между уровнями масштабирования, хотя масштаб не изменился (могут быть externalWidth и innerWidth не точно обновляется в тоже время).
И если вы хотите фактор:
источник
У меня есть это решение только для мобильных устройств (протестировано с Android):
Если вам нужен уровень масштабирования сразу после сдвига, вам, вероятно, придется установить небольшой тайм-аут из-за задержки рендеринга (но я не уверен, потому что я не тестировал его).
источник
Этот ответ основан на комментариях о неправильном возвращении devicePixelRatio на ответ пользователя 1080381.
Я обнаружил, что в некоторых случаях эта команда возвращалась некорректно при работе с рабочим столом, Surface Pro 3 и Surface Pro 4.
Я обнаружил, что он работал на моем рабочем столе, но SP3 и SP4 давали разные цифры друг от друга и на рабочем столе.
Тем не менее, я заметил, что SP3 возвращался с полуторакратным уровнем масштабирования, который я ожидал. Когда я взглянул на настройки дисплея, SP3 на самом деле был установлен на 150% вместо 100% на моем рабочем столе.
Таким образом, решением для комментариев должно быть разделение возвращенного уровня масштабирования на масштаб машины, на которой вы в данный момент находитесь.
Я смог получить масштаб в настройках Windows, выполнив следующие действия:
Так что в случае с моим SP3 этот код выглядит при 100% увеличении:
Умножение на 100 в исходном ответе user1080381 даст вам увеличение 100 (%).
источник
В настоящее время он работает, но все равно нужно разделить браузером. Успешно протестирован на Chrome (75) и Safari (11.1) (пока не нашел пути для FF). Он также получает правильное значение масштабирования на дисплее сетчатки, и вычисления запускаются при событии изменения размера.
источник
здесь это не меняется!
создать простой HTML-файл, нажмите на кнопку. независимо от того, какой уровень масштабирования: он покажет вам ширину 400 пикселей (по крайней мере, с Firefox и ie8)
источник
Это может кому-то помочь, а может и не помочь, но у меня была страница, которую я не мог правильно расположить по центру, независимо от того, какие уловки Css я пробовал, поэтому я написал файл вызова страницы JQuery Center Center:
Возникла проблема с уровнем масштабирования в браузере, при котором страница будет сдвигаться в зависимости от 100%, 125%, 150% и т. Д.
Код ниже находится в файле JQuery с именем centerpage.js.
Со своей страницы мне пришлось сделать ссылку на JQuery и этот файл, чтобы он заработал, хотя на моей главной странице уже была ссылка на JQuery.
centerpage.js
:Также, если вы хотите центрировать панель:
источник
Этот вопрос был опубликован как давным-давно, но сегодня, когда я искал один и тот же ответ «Как обнаружить событие увеличения и уменьшения», я не смог найти один ответ, который бы подходил всем браузерам.
Как и сейчас: для Firefox / Chrome / IE8 и IE9 увеличение и уменьшение масштаба вызывает событие window.resize. Это может быть зафиксировано с помощью:
источник
Обходной путь для FireFox 16+, чтобы найти DPPX (уровень масштабирования) исключительно с помощью JavaScript:
источник
источник
Проблема заключается в типах используемых мониторов: монитор 4К или стандартный монитор. Chrome на сегодняшний день является самым умным в том, что он может сказать нам, что уровень масштабирования просто использует
window.devicePixelRatio
, по-видимому, он может сказать, какова плотность пикселей, и сообщать одно и то же число в зависимости от того, что.Других браузеров не так уж и много. IE и Edge, вероятно, наихудшие, поскольку они по-разному обрабатывают уровни масштабирования. Чтобы получить такой же размер текста на мониторе 4k, вы должны выбрать 200% вместо 100% на стандартном мониторе.
По состоянию на май 2018 года, вот что мне нужно, чтобы определить уровни масштабирования для некоторых из самых популярных браузеров, Chrome, Firefox и IE11. У меня есть это сказать мне, что процент увеличения. Для IE он сообщает 100% даже для 4k мониторов, которые на самом деле на 200%, но размер текста действительно одинаков.
Вот скрипка: https://jsfiddle.net/ae1hdogr/
Если кто-то захочет попробовать другие браузеры и обновить скрипку, сделайте это. Моя главная цель состояла в том, чтобы охватить эти 3 браузера, чтобы определить, используют ли люди коэффициент масштабирования более 100% для использования моего веб-приложения, и отобразить уведомление, предлагающее меньший коэффициент увеличения.
источник