Как определить уровень масштабирования страницы во всех современных браузерах? - PullRequest
290 голосов
/ 11 ноября 2009
  1. Как определить уровень масштабирования страницы во всех современных браузерах? Хотя этот поток рассказывает, как это сделать в IE7 и IE8, я не могу найти хорошее кросс-браузерное решение.

  2. Firefox сохраняет уровень масштабирования страницы для последующего доступа. Смогу ли я получить уровень масштабирования при загрузке первой страницы? Где-то я читал, что это работает, когда изменение масштаба происходит после страница загружена.

  3. Есть ли способ перехватить событие '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>

Ответы [ 25 ]

2 голосов
/ 09 июня 2018

На мобильных устройствах (с 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, если устройство не масштабируется).

2 голосов
/ 19 июля 2017

В основном имеем:

  • window.devicePixelRatio, который учитывает как масштабирование на уровне браузера *, так и системное масштабирование / плотность пикселей.
    * - на Mac / Safari уровень масштабирования не учитывается
  • медиазапросы
  • vw / vh CSS-единицы
  • resize Событие, которое вызывается при изменении уровня масштабирования, приводит к эффективному изменению размера окна

этого должно быть достаточно для обычного UX. Если вам нужно определить уровень масштабирования, это может быть признаком плохого дизайна пользовательского интерфейса.

Pitch-zoom сложнее отследить и в настоящее время не рассматривается.

1 голос
/ 05 декабря 2009

Ваши расчеты по-прежнему основаны на количестве пикселей CSS. Теперь они просто другого размера на экране. В этом смысл полного увеличения страницы.

Что бы вы хотели, чтобы происходило в браузере на устройстве с разрешением 192 точек на дюйм, которое обычно отображало четыре пикселя устройства для каждого пикселя изображения? При увеличении 50% это устройство теперь отображает один пиксель изображения в одном пикселе устройства.

0 голосов
/ 01 июня 2013

Это для Chrome , вслед за user800583 ответ ...

Я потратил несколько часов на эту проблему и не нашел лучшего подхода, но:

  • Есть 16 'zoomLevel', а не 10
  • Когда Chrome является полноэкранным / развернутым, соотношение составляет window.outerWidth/window.innerWidth, а когда это не так, соотношение представляется равным (window.outerWidth-16)/window.innerWidth, однако к 1-му случаю можно приблизиться ко 2-му.

Итак, я пришел к следующему ...

Но у этого подхода есть ограничения: например, если вы играете на аккордеоне с окном приложения (быстро увеличиваете и уменьшаете ширину окна), вы получите промежутки между уровнями масштабирования, хотя масштаб не изменился (может быть externalWidth innerWidth не точно обновляются в одно и то же время).

var snap = function (r, snaps)
{
    var i;
    for (i=0; i < 16; i++) { if ( r < snaps[i] ) return i; }
};
var w, l, r;
w = window.outerWidth, l = window.innerWidth;
return snap((w - 16) / l,
            [ 0.29, 0.42, 0.58, 0.71, 0.83, 0.95, 1.05, 1.18, 1.38, 1.63, 1.88, 2.25, 2.75, 3.5, 4.5, 100 ],
);

А если вам нужен коэффициент:

var snap = function (r, snaps, ratios)
{
    var i;
    for (i=0; i < 16; i++) { if ( r < snaps[i] ) return eval(ratios[i]); }
};
var w, l, r;
w = window.outerWidth, l = window.innerWidth;
return snap((w - 16) / l,
            [ 0.29, 0.42, 0.58, 0.71, 0.83, 0.95, 1.05, 1.18, 1.38, 1.63, 1.88, 2.25, 2.75, 3.5, 4.5, 100 ],
            [ 0.25, '1/3', 0.5, '2/3', 0.75, 0.9, 1, 1.1, 1.25, 1.5, 1.75, 2, 2.5, 3, 4, 5 ]
);
0 голосов
/ 25 мая 2018

Проблема заключается в типах используемых мониторов: монитор 4К или стандартный монитор. Chrome на сегодняшний день является самым умным в том, что он может сказать нам, что такое уровень масштабирования, просто используя window.devicePixelRatio, по-видимому, он может сказать, какова плотность пикселей, и сообщит одно и то же число в зависимости от того, что.

Других браузеров не так уж много. IE и Edge, вероятно, наихудшие, поскольку они по-разному обрабатывают уровни масштабирования. Чтобы получить такой же размер текста на мониторе 4k, вы должны выбрать 200% вместо 100% на стандартном мониторе.

По состоянию на май 2018 года, вот что мне нужно, чтобы определить уровни масштабирования для некоторых из самых популярных браузеров, Chrome, Firefox и IE11. У меня есть это сказать мне, что процент увеличения. Для IE он показывает 100% даже для 4k мониторов, которые на самом деле на 200%, но размер текста действительно одинаков.

Вот скрипка: https://jsfiddle.net/ae1hdogr/

Если кто-то захочет попробовать другие браузеры и обновить скрипку, сделайте это. Моей главной целью было накрыть эти 3 браузера, чтобы определить, используют ли люди коэффициент масштабирования более 100% для использования моего веб-приложения, и отобразить уведомление, предлагающее коэффициент увеличения арендодателя.

0 голосов
/ 26 октября 2017

Этот ответ основан на комментариях о том, что devicePixelRatio неверно возвращается на ответ пользователя 1080381.

Я обнаружил, что в некоторых случаях эта команда возвращалась некорректно при работе с рабочим столом, Surface Pro 3 и Surface Pro 4.

Что я обнаружил, так это то, что он работал на моем рабочем столе, но SP3 и SP4 давали разные номера друг другу и рабочему столу.

Однако я заметил, что SP3 возвращался в полтора раза выше ожидаемого уровня масштабирования. Когда я взглянул на настройки дисплея, SP3 фактически был установлен на 150% вместо 100%, которые были у меня на рабочем столе.

Таким образом, решение для комментариев должно заключаться в том, чтобы разделить возвращаемый уровень масштабирования на масштаб машины, на которой вы сейчас находитесь.

Мне удалось получить масштаб в настройках Windows, выполнив следующие действия:

ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_DesktopMonitor");
double deviceScale = Convert.ToDouble(searcher.Get().OfType<ManagementObject>().FirstOrDefault()["PixelsPerXLogicalInch"]);
int standardPixelPerInch = 96;
return deviceScale / standardPixelPerInch;

Итак, в случае с моим SP3 этот код выглядит при 100% увеличении:

devicePixelRatio = 1.5
deviceScale = 144
deviceScale / standardPixelPerInch = 1.5
devicePixelRatio / (deviceScale / standardPixelPerInch) = 1

Умножение на 100 в исходном ответе user1080381 даст вам увеличение 100 (%).

0 голосов
/ 09 ноября 2010

Не проверял это для IE, но если вы делаете элемент elem с

min-width: 100%

тогда

window.document.width / elem.clientWidth

даст вам уровень масштабирования вашего браузера (включая коэффициент document.body.style.zoom).

0 голосов
/ 16 февраля 2012

Это может кому-то помочь, а может и не помочь, но у меня была страница, которую я не мог правильно расположить по центру, независимо от того, какие уловки Css я пробовал, поэтому я написал файл Call Center Page:

Возникла проблема с уровнем масштабирования браузера, если страница была бы смещена, если бы вы были на уровне 100%, 125%, 150% и т. Д.

Код ниже находится в файле JQuery с именем centerpage.js.

Со своей страницы мне пришлось сделать ссылку на JQuery и этот файл, чтобы он заработал, хотя на моей главной странице уже была ссылка на JQuery.

<title>Home Page.</title>
<script src="Scripts/jquery-1.7.1.min.js"></script>
<script src="Scripts/centerpage.js"></script>

centerpage.js:

// centering page element
function centerPage() {
    // get body element
    var body = document.body;

    // if the body element exists
    if (body != null) {
        // get the clientWidth
        var clientWidth = body.clientWidth;

        // request data for centering
        var windowWidth = document.documentElement.clientWidth;
        var left = (windowWidth - bodyWidth) / 2;

        // this is a hack, but it works for me a better method is to determine the 
        // scale but for now it works for my needs
        if (left > 84) {
            // the zoom level is most likely around 150 or higher
            $('#MainBody').removeClass('body').addClass('body150');
        } else if (left < 100) {
            // the zoom level is most likely around 110 - 140
            $('#MainBody').removeClass('body').addClass('body125');
        }
    }
}


// CONTROLLING EVENTS IN jQuery
$(document).ready(function() {
    // center the page
    centerPage();
});

Также, если вы хотите центрировать панель:

// centering panel
function centerPanel($panelControl) {
    // if the panel control exists
    if ($panelControl && $panelControl.length) {
        // request data for centering
        var windowWidth = document.documentElement.clientWidth;
        var windowHeight = document.documentElement.clientHeight;
        var panelHeight = $panelControl.height();
        var panelWidth = $panelControl.width();

        // centering
        $panelControl.css({
            'position': 'absolute',
            'top': (windowHeight - panelHeight) / 2,
            'left': (windowWidth - panelWidth) / 2
        });

        // only need force for IE6
        $('#backgroundPanel').css('height', windowHeight);
    }
}
0 голосов
/ 06 декабря 2012

Этот вопрос был опубликован, как давным-давно, но сегодня, когда я искал тот же ответ «Как определить увеличение и уменьшение масштаба», я не смог найти один ответ, который бы подходил всем браузерам.

Как сейчас: для Firefox / Chrome / IE8 и IE9 увеличение и уменьшение масштаба вызывает событие window.resize.Это может быть зафиксировано с помощью:

$(window).resize(function() {
//YOUR CODE.
});
0 голосов
/ 23 сентября 2015
function supportFullCss3()
{
    var div = document.createElement("div");
    div.style.display = 'flex';
    var s1 = div.style.display == 'flex';
    var s2 = 'perspective' in div.style;

    return (s1 && s2);
};

function getZoomLevel()
{
    var screenPixelRatio = 0, zoomLevel = 0;

    if(window.devicePixelRatio && supportFullCss3())
        screenPixelRatio = window.devicePixelRatio;
    else if(window.screenX == '0')
        screenPixelRatio = (window.outerWidth - 8) / window.innerWidth;
    else
    {
        var scr = window.frames.screen;
        screenPixelRatio = scr.deviceXDPI / scr.systemXDPI;
    }

    //---------------------------------------
    if (screenPixelRatio <= .11){ //screenPixelRatio >= .01 &&
      zoomLevel = "-7";
    } else if (screenPixelRatio <= .25) {
      zoomLevel = "-6";
    }else if (screenPixelRatio <= .33) {
      zoomLevel = "-5.5";
    } else if (screenPixelRatio <= .40) {
      zoomLevel = "-5";
    } else if (screenPixelRatio <= .50) {
      zoomLevel = "-4";
    } else if (screenPixelRatio <= .67) {
      zoomLevel = "-3";
    } else if (screenPixelRatio <= .75) {
      zoomLevel = "-2";
    } else if (screenPixelRatio <= .85) {
      zoomLevel = "-1.5";
    } else if (screenPixelRatio <= .98) {
      zoomLevel = "-1";
    } else if (screenPixelRatio <= 1.03) {
      zoomLevel = "0";
    } else if (screenPixelRatio <= 1.12) {
      zoomLevel = "1";
    } else if (screenPixelRatio <= 1.2) {
      zoomLevel = "1.5";
    } else if (screenPixelRatio <= 1.3) {
      zoomLevel = "2";
    } else if (screenPixelRatio <= 1.4) {
      zoomLevel = "2.5";
    } else if (screenPixelRatio <= 1.5) {
      zoomLevel = "3";
    } else if (screenPixelRatio <= 1.6) {
      zoomLevel = "3.3";
    } else if (screenPixelRatio <= 1.7) {
      zoomLevel = "3.7";
    } else if (screenPixelRatio <= 1.8) {
      zoomLevel = "4";
    } else if (screenPixelRatio <= 1.9) {
      zoomLevel = "4.5";
    } else if (screenPixelRatio <= 2) {
      zoomLevel = "5";
    } else if (screenPixelRatio <= 2.1) {
      zoomLevel = "5.2";
    } else if (screenPixelRatio <= 2.2) {
      zoomLevel = "5.4";
    } else if (screenPixelRatio <= 2.3) {
      zoomLevel = "5.6";
    } else if (screenPixelRatio <= 2.4) {
      zoomLevel = "5.8";
    } else if (screenPixelRatio <= 2.5) {
      zoomLevel = "6";
    } else if (screenPixelRatio <= 2.6) {
      zoomLevel = "6.2";
    } else if (screenPixelRatio <= 2.7) {
      zoomLevel = "6.4";
    } else if (screenPixelRatio <= 2.8) {
      zoomLevel = "6.6";
    } else if (screenPixelRatio <= 2.9) {
      zoomLevel = "6.8";
    } else if (screenPixelRatio <= 3) {
      zoomLevel = "7";
    } else if (screenPixelRatio <= 3.1) {
      zoomLevel = "7.1";
    } else if (screenPixelRatio <= 3.2) {
      zoomLevel = "7.2";
    } else if (screenPixelRatio <= 3.3) {
      zoomLevel = "7.3";
    } else if (screenPixelRatio <= 3.4) {
      zoomLevel = "7.4";
    } else if (screenPixelRatio <= 3.5) {
      zoomLevel = "7.5";
    } else if (screenPixelRatio <= 3.6) {
      zoomLevel = "7.6";
    } else if (screenPixelRatio <= 3.7) {
      zoomLevel = "7.7";
    } else if (screenPixelRatio <= 3.8) {
      zoomLevel = "7.8";
    } else if (screenPixelRatio <= 3.9) {
      zoomLevel = "7.9";
    } else if (screenPixelRatio <= 4) {
      zoomLevel = "8";
    } else if (screenPixelRatio <= 4.1) {
      zoomLevel = "8.1";
    } else if (screenPixelRatio <= 4.2) {
      zoomLevel = "8.2";
    } else if (screenPixelRatio <= 4.3) {
      zoomLevel = "8.3";
    } else if (screenPixelRatio <= 4.4) {
      zoomLevel = "8.4";
    } else if (screenPixelRatio <= 4.5) {
      zoomLevel = "8.5";
    } else if (screenPixelRatio <= 4.6) {
      zoomLevel = "8.6";
    } else if (screenPixelRatio <= 4.7) {
      zoomLevel = "8.7";
    } else if (screenPixelRatio <= 4.8) {
      zoomLevel = "8.8";
    } else if (screenPixelRatio <= 4.9) {
      zoomLevel = "8.9";
    } else if (screenPixelRatio <= 5) {
      zoomLevel = "9";
    }else {
      zoomLevel = "unknown";
    }

    return zoomLevel;
};
...