使用JavaScript检测设备上视网膜支持的最佳方法是什么?

时间:2013-10-30 17:22:34

标签: javascript jquery retina-display

现在我正在使用它:

function is_retina_device() {
    return window.devicePixelRatio > 1;
}

但它的简单性让我害怕。是否有更彻底的检查?

4 个答案:

答案 0 :(得分:40)

根据我最近阅读的所有内容,浏览器似乎正在转向resolution媒体查询表达式。这不是在当前接受的答案中使用的device-pixel-ratiodevice-pixel-ratio仅应用作回退的原因是因为它不是标准的媒体查询。

根据w3.org:

  

曾几何时,Webkit决定需要对屏幕分辨率进行媒体查询。但他们发明了-webkit-device-pixel-ratio,而不是使用已经标准化的分辨率媒体查询。

View Full Article

Resolution Media Query Documentation

由于resolution是标准化的,因此未来让我们首先在检测中使用它来进行未来验证。另外,因为我不确定您是否只想检测高dppx设备或 视网膜(仅限Apple)设备,我已经添加了其中一个。最后,作为一个注释,Apple检测只是用户代理嗅探,因此无法依赖。注意:对于isRetina函数,我使用的是dppx为2而不是1.3,因为所有视网膜苹果设备都有2dppx。

注意似乎MS Edge has some issues with non integer values

function isHighDensity(){
    return ((window.matchMedia && (window.matchMedia('only screen and (min-resolution: 124dpi), only screen and (min-resolution: 1.3dppx), only screen and (min-resolution: 48.8dpcm)').matches || window.matchMedia('only screen and (-webkit-min-device-pixel-ratio: 1.3), only screen and (-o-min-device-pixel-ratio: 2.6/2), only screen and (min--moz-device-pixel-ratio: 1.3), only screen and (min-device-pixel-ratio: 1.3)').matches)) || (window.devicePixelRatio && window.devicePixelRatio > 1.3));
}


function isRetina(){
    return ((window.matchMedia && (window.matchMedia('only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx), only screen and (min-resolution: 75.6dpcm)').matches || window.matchMedia('only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2)').matches)) || (window.devicePixelRatio && window.devicePixelRatio >= 2)) && /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
}

答案 1 :(得分:32)

如果您想要图像,可以使用retinajs,或者此代码是检测它的常见响应:

function isRetinaDisplay() {
        if (window.matchMedia) {
            var mq = window.matchMedia("only screen and (min--moz-device-pixel-ratio: 1.3), only screen and (-o-min-device-pixel-ratio: 2.6/2), only screen and (-webkit-min-device-pixel-ratio: 1.3), only screen  and (min-device-pixel-ratio: 1.3), only screen and (min-resolution: 1.3dppx)");
            return (mq && mq.matches || (window.devicePixelRatio > 1)); 
        }
    }

答案 2 :(得分:11)

实际上,如果您只关心现代浏览器,那么您在问题中使用的代码就完全正确了。 (见:http://caniuse.com/#feat=devicepixelratio

所有现代浏览器都实现了它,而旧版浏览器只会提供较低分辨率的图像。我不希望IE10-出现在视网膜/高分辨率设备上。另外,在JavaScript中使用CSS检查并不比使用本机窗口属性更奇怪吗?

哎呀,devicePixelRatio浏览器支持甚至比分辨率规范更好。 (见:http://caniuse.com/#feat=css-media-resolution

我说它实际上非常安全,我们在每月访问量超过1000万的生产网站中使用它。按预期工作。

我唯一要改变的是功能名称,因为加载高分辨率图像的需要在技术上并不意味着屏幕是视网膜。实际上,您甚至不需要进行数字检查,因为undefined > 1会导致false

function is_high_resolution_screen() {
  return window.devicePixelRatio > 1;
}

答案 3 :(得分:0)

devicePixelRatio根本不可靠。当您放大到200%时,window.devicePixelRatio将返回2,但您不在视网膜显示屏上。