【问题标题】:jQuery detect DPI changejQuery 检测 DPI 变化
【发布时间】:2016-08-23 16:28:29
【问题描述】:

我现在试了半天,用 jQuery 检测 DPI 变化。

场景如下:
我有一个 MacBook Pro (Retina) 和一个连接到它的普通屏幕。当我将浏览器窗口从常规窗口移动到 MacBook 时,我想检测 DPI 变化。

显然是这样的事件

$(window).resize(function() {
  if (window.devicePixelRatio && window.devicePixelRatio >= 1.3) {
    // do retina
  } else {
    // do standard
  }
}

$(document).resize(function() {
  if (window.devicePixelRatio && window.devicePixelRatio >= 1.3) {
    // do retina
  } else {
    // do standard
  }
}

不要为此工作,因为分辨率只是在物理上发生了变化。

有什么办法可以实现吗?

【问题讨论】:

标签: javascript jquery retina highdpi


【解决方案1】:

我刚刚尝试使用具有不同分辨率的第二台显示器。

当我将浏览器从第一个屏幕移动到第二个屏幕并返回时,我必须调整浏览器的大小,以便您的方法正确:

var width = screen.width;
var height = screen.height;

$(window).on('resize', function(e) {
  if (screen.width !== width || screen.height !== height) {
    width = screen.width;
    height = screen.height;
    
    console.log('resolution changed!');
  }
});

但是,如果您不想调整浏览器的高度或宽度,则永远不会触发此事件。在这种情况下,可以使用另一种方法作为解决方法: 两个功能,以便:

  • 按时测试当前浏览器与旧浏览器的分辨率
  • 停止此计时器
  • 使用事件

(function ($) {

  var width = screen.width;
  var height = screen.height;
  var idTimer = null;

  $.fn.startCheckResolution = function (interval) {
    interval = interval || 50;
    idTimer = setInterval(function () {
      if (screen.width !== width || screen.height !== height) {
        width = screen.width;
        height = screen.height;
        $(this).trigger('resolutionChanged');
      }
    }.bind(this), interval);
    return this;
  };

  $.fn.stopCheckResolution = function () {
    if (idTimer != null) {
      clearInterval(idTimer);
      idTimer = null;
    }
  };

}(jQuery));

$(window).startCheckResolution(1000).on('resolutionChanged', function(e) {
  console.log('Resolution changed!');
  // $(window).stopCheckResolution();
});
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>

【讨论】:

  • 第二个代码工作得很好。尽管我希望我不必为此使用持续检查。
【解决方案2】:

如何使用转换事件和媒体查询

CSS:

body {
  transition:font-size 1ms;
  font-size:1em;
}
@media  only screen and (min-device-pixel-ratio: 2), 
    only screen and (min-resolution: 192dpi) {
      body {
        font-size:1.1em
      }
}

JS:

$("body").bind("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd", function(){
  $(document).trigger('dpiChange', {pixelRatio: window.devicePixelRatio})
});

$(document).on('dpiChange', function (e, data) {
  if (data.pixelRatio >= 1.3) {
    // do retina
    console.log('retina')
  } else {
    // do standard
    console.log('standard')
  }
})

JSBIN:
http://jsbin.com/siramo/1/edit?html,css,js,console

Retina 特定媒体查询教程:
https://css-tricks.com/snippets/css/retina-display-media-query/

【讨论】:

  • 遗憾的是,JS 解决方案对我不起作用。*(Safari、Chrome、Firefox)本来会如此优雅。 (* - 在 Chrome 上我得到了 2 倍的 'retina' 日志,但不知道如何重现它) 我已经阅读过的 'Great Retina Specific Media Query Tutorial',它真的很棒。在我网站的大部分地方都使用它,但有些事情不能用 CSS 完成。 ://
  • 笨蛋,你用的是什么浏览器?这些事件应该为所有事件触发。我有两台监视器,正在将 JSBIN 示例从一台监视器拖到另一台监视器上,它对我有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 2011-09-21
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多