2013-03-05 70 views
16

我发现了很多关于Retina Display的问题,但没有答案在服务器端。检测服务器端的视网膜(HD)显示

我想根据屏幕前,提供不同的图像(PHP):

if($is_retina) 
    $thumbnail = get_image($item_photo, 'thumbnail_retina') ; 
else 
    $thumbnail = get_image($item_photo, 'thumbnail') ; 

你能看到处理这个问题的方法吗?

我只能想象在JavaScript中进行测试,设置Cookie。然而这需要初始交换来设置它。任何人有更好的解决方案?

的Cookie设置代码:

(function(){ 
    if(document.cookie.indexOf('device_pixel_ratio') == -1 
     && 'devicePixelRatio' in window 
     && window.devicePixelRatio == 2){ 

    document.cookie = 'device_pixel_ratio=' + window.devicePixelRatio + ';'; 
    window.location.reload(); 
    } 
})(); 
+0

我不认为HTTP请求包含足够的信息来评估用户的屏幕分辨率或DPI。我刚刚检查过。 – 2013-03-05 21:34:15

+0

使用你的解决方案 - 不能想象一个更好的解决方案 – Philipp 2013-03-05 21:35:19

+0

评论者认为这是一个WordPress的问题,因为这个例子,我改变了示例函数。 – chriscatfr 2016-12-30 10:02:36

回答

17

好吧,因为看起来目前没有更好的方法,这里是我的解决方案,结合JS,PHP和Cookies。

我希望会有更好的答案在未来

<?php 
    if(isset($_COOKIE["device_pixel_ratio"])){ 
     $is_retina = ($_COOKIE["device_pixel_ratio"] >= 2); 

     if($is_retina) 
      $thumbnail = get_image($item_photo, 'thumbnail_retina') ; 
     else 
      $thumbnail = get_image($item_photo, 'thumbnail') ; 

    }else{ 
?> 
<script language="javascript"> 
(function(){ 
    if(document.cookie.indexOf('device_pixel_ratio') == -1 
     && 'devicePixelRatio' in window 
     && window.devicePixelRatio == 2){ 

    var date = new Date(); 
    date.setTime(date.getTime() + 3600000); 

    document.cookie = 'device_pixel_ratio=' + window.devicePixelRatio + ';' + ' expires=' + date.toUTCString() +'; path=/'; 
    //if cookies are not blocked, reload the page 
    if(document.cookie.indexOf('device_pixel_ratio') != -1) { 
     window.location.reload(); 
    } 
    } 
})(); 
</script> 
<?php } ?> 

在function.php:

add_action('init', 'CJG_retina'); 

function CJG_retina(){ 

    global $is_retina; 
    $is_retina = isset($_COOKIE["device_pixel_ratio"]) AND $_COOKIE["device_pixel_ratio"] >= 2; 
} 

然后后,我可以使用下面的GLOBAL:

global $is_retina;$GLOBALS['is_retina'];

+0

哇,这很好! – 2017-05-08 23:43:55

1

我不知道到底如何,但搞清楚了这一点的纯PHP的方式将使用get_browser返回浏览器的版本和某些功能。这可能能够告诉你一些信息,可能导致其在视网膜上运行。

http://php.net/manual/en/function.get-browser.php

此外,你可以看看$_SERVER['HTTP_USER_AGENT']它会告诉你有关设备的事情。那么你需要一个具有视网膜的设备列表,并进行比较以获得答案。

在JS中做视网膜检测可能更容易和万无一失。

6

因为你没有指定什么确切的用例,你需要这个,我真的不知道服务器的用例知道客户端需要它的图像的分辨率(我认为客户端应该决定)这里是我的建议:

使用一些东西如Retina.js或使用srcset属性<img src="low-res.jpg" srcset="medium-res.jpg 1.5x, high-res.jpg 2x">

这样您还可以利用浏览器缓存图像。如果您有两个不同图像大小的网址,则无法执行此操作。即使它的自动创建/更新的图像缓存使用最后修改或etag标题。

+0

retina.js和srcset之间的任何偏好? – rogerdpack 2017-05-06 20:37:46

+1

在2013 srcset预计或非常新。即使在新的Retina电脑上也无法使用它。现在在2017年,这是一个更好的选择。 – chriscatfr 2017-05-07 16:42:46

+0

我更喜欢srcset,因为它的工作原理没有javascript。您还可以控制哪个img标签可以在视网膜图像中使用,哪些图像不可用。但是,如果您为所有图像提供视网膜图像并希望完全兼容,像retina.js这样的javascript解决方案将为您提供更好的服务。 – smurfy 2017-05-07 19:26:57