How can you get the CSS pixel / device pixel ratio?

前端 未结 4 1832
臣服心动
臣服心动 2020-12-04 16:36

I want to find the ratio between CSS pixels and device pixels.

Edit: I should have realized that this is just zoom level. I\'ve added an answer to t

相关标签:
4条回答
  • 2020-12-04 16:59

    How to get device Pixel Ratio

    This example uses window.devicePixelRatio as a starting point AND also window.matchMedia() Web API as a fallback calculation.

    The browser support for both those features is pretty good, so this should work great for most of use cases.

    Here is a function that retrieves this information, originally written by PatrickJS and published as a GitHub Gist:

    function getDevicePixelRatio() {
        var mediaQuery;
        var is_firefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
    
        if (window.devicePixelRatio !== undefined && !is_firefox) {
            return window.devicePixelRatio;
        } else if (window.matchMedia) {
            mediaQuery = "(-webkit-min-device-pixel-ratio: 1.5),\
              (min--moz-device-pixel-ratio: 1.5),\
              (-o-min-device-pixel-ratio: 3/2),\
              (min-resolution: 1.5dppx)";
            if (window.matchMedia(mediaQuery).matches) {
                return 1.5;
            }
            mediaQuery = "(-webkit-min-device-pixel-ratio: 2),\
              (min--moz-device-pixel-ratio: 2),\
              (-o-min-device-pixel-ratio: 2/1),\
              (min-resolution: 2dppx)";
            if (window.matchMedia(mediaQuery).matches) {
                return 2;
            }
            mediaQuery = "(-webkit-min-device-pixel-ratio: 0.75),\
              (min--moz-device-pixel-ratio: 0.75),\
              (-o-min-device-pixel-ratio: 3/4),\
              (min-resolution: 0.75dppx)";
            if (window.matchMedia(mediaQuery).matches) {
                return 0.7;
            }
        } else {
            return 1;
        }
    }
    

    CanIUse: window.devicePixelRatio, Window.matchMedia()

    Useful links: MDN - window.devicePixelRatio, MDN - Window.matchMedia()

    0 讨论(0)
  • 2020-12-04 17:09

    There is a much better CSS/JS solution:

    /** sample media query for pixel-ratio=2" **/
    @media  
    (-webkit-min-device-pixel-ratio: 2), 
    (min-resolution: 192dpi) { 
      .pixel-ratio-holder:before {
       content: "2";
      }
    }
    
    
    function jsPixelRatio(){
       return window.getComputedStyle(document.querySelector('.pixel-ratio-holder'), 'before').getPropertyValue('content').replace(/[^a-z]/g,'') * 1;
    }
    
    0 讨论(0)
  • 2020-12-04 17:12

    You can use window.devicePixelRatio in Webkit based browsers to get the device pixel ratio directly in JavaScript. I have used this on Google Chrome, Android browsers (2.2+) and Mobile Safari. I have no idea about other browsers though.

    0 讨论(0)
  • 2020-12-04 17:22

    You can always use the following method and it would work in all the browsers

    window.getDevicePixelRatio = function () {
        var ratio = 1;
        // To account for zoom, change to use deviceXDPI instead of systemXDPI
        if (window.screen.systemXDPI !== undefined && window.screen.logicalXDPI       !== undefined && window.screen.systemXDPI > window.screen.logicalXDPI) {
            // Only allow for values > 1
            ratio = window.screen.systemXDPI / window.screen.logicalXDPI;
        }
        else if (window.devicePixelRatio !== undefined) {
            ratio = window.devicePixelRatio;
        }
        return ratio;
    };
    
    0 讨论(0)
提交回复
热议问题