向Retina显示屏提供高分辨率图像

12

如何以跨浏览器兼容的方式检测访问网页的设备的像素密度,以便可以为任何设备提供标准或高分辨率图像而不强制使用双倍图像?

是否有任何自动化此过程的JavaScript库?

3个回答

18

为什么需要设置Retina

iPhone 4s、iPhone 5、iPad3、iPad4、Macbook 15英寸、Macbook 13英寸均使用Retina显示屏。

Android也支持高分辨率显示,Windows 8(Lumia 920)也支持,就像@JamWaffles提到的那样。

增加高分辨率支持有利于用户体验,但对开发者的负担和移动带宽会产生影响。有些人不建议这样做。(Peter-Paul Koch,请参见底部的“进一步阅读”)

简要说明

有两种方法可以实现此功能。一种是Javascript,另一种是CSS。所有当前的解决方案都是针对Retina的,但很容易扩展到Android高分辨率。

CSS解决方案涉及媒体查询和-webkit-min-device-pixel-ratio-webkit-device-pixel-ratio

  • 使用简单。
  • 适用于所有浏览器。
  • 缺点:适用于背景,对于<img>标签更难使用。

Javascript解决方案涉及window.devicePixelRatio属性。

  • 优点:Javascript可以操作图像源。因此,如果您要提供直接的图像而不是背景,最好使用Javascript
  • 不能适用于所有浏览器,但当前的支持已经足够好了。请参见下面的列表。
  • 需要更多的设置。

CSS解决方案

对于普通图像,比如一个图标

.sample-icon {
    background-image: url("../images/sample-icon.png");
    background-size: 36px 36px;
}

对于Retina屏幕,请添加以下内容

@media only screen and (-webkit-min-device-pixel-ratio: 2), /* Webkit */
    (min-resolution: 192dpi) /* Everyone else */ {
    .sample-icon {
        background-image: url("../images/sample-icon-highres.png");
        background-size: 18px 18px;
}

如果你不想记忆数字,你可以使用min-resolution: 2dppx来替换min-resolution: 192dpi

请注意以下差异:

  1. 两个不同的图标,一个普通尺寸,一个高清晰度。高清晰度图标比普通图标大一倍。
  2. 背景大小不同。后者是前者的一半。但你需要在实际使用中进行测试。

资源: + http://www.w3.org/blog/CSS/2012/06/14/unprefix-webkit-device-pixel-ratio/ + http://view.jquerymobile.com/master/demos/widgets/buttons/#CustomIcons

Javascript解决方案

使用window.devicePixelRatio属性检测分辨率。

if (window.devicePixelRatio >= 2) {
  alert("This is a Retina screen");
  //Do something to manipulate image url attribute
  //for example add `@2x-` before all image urls
}
浏览器支持

Safari、Android WebKit、Chrome 22+和Android上的Chrome、Opera Mobile、BlackBerry WebKit、QQ、Palm WebKit, 参考资料:http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html

对于Android

Android设备使用1.5作为高分辨率而不是Retina的2。 http://developer.android.com/guide/webapps/targeting.html --#Targeting Device Density with CSS,#Targeting Device Density with JavaScript

更多好文阅读

http://www.quirksmode.org/blog/archives/2012/07/more_about_devi.html “我不喜欢提供特殊的retina图片,因为它会使网站变得过重-特别是在移动连接上。尽管如此,人们仍将这样做。”——Peter-Paul Koch。

更新2013-04-18 更新jQuery移动链接


谢谢,我倾向于接受答案,但是苹果真的是唯一生产高分辨率显示器的制造商吗?-webkit-min-device-pixel-ratio是否限制了浏览器使用仅局限于Safari和Chrome?例如,如果我在Macbook Retina上使用Firefox怎么办? - pistacchio
@pistacchio,对于你的第一个问题,除了苹果之外,安卓也支持高分辨率但是只有1.5倍。对于第二个问题,CSS解决方案可以适用于所有浏览器,我在代码中为非webkit浏览器添加了一行。请查看更新版本以获取详细答案。 - Billy Chan
Windows Phone 8支持高分辨率;Lumia 920 _et al_所有的720p显示屏像素密度实际上比Retina显示屏还要高。 - Bojangles
对于视网膜屏幕,你说背景大小为18像素,但我认为你的意思是32像素(与以前相同,只是强制),只是图像实际上是64像素,对吗? - Kevin
@Kevin,不好意思,我还是指的18px。想象一下iPhone 3和iPhone 5,它们的屏幕尺寸相似。那么在你的网站中,某个图标需要保持相同的大小-对于这两个设备来说都是18px。然而,iPhone 5支持Retina屏幕,因此你可以为它使用一个高分辨率的36x36图标。你只需强制将这个36x的图标显示为实际大小18px即可。虽然所有的大小都是18x,但在iPhone 5上,它看起来会更美丽,因为现在它的分辨率更高了。 - Billy Chan
你在顶部的“orig icon”是36x36,一个简单的解决方案是对于支持CSS3的浏览器(所有视网膜屏幕都支持),也可以使用background-size:cover,除非你正在使用雪碧图。 - Kevin

1

0

你需要了解网络能力、响应式图片和资源加载。

到目前为止,JavaScript 的解决方案还不够完美,因为它们通常需要在图像交换之前下载两个资源(图像)。

除非你选择使用全面的解决方案,比如这个:http://adaptive-images.com,否则最好使用背景 CSS 媒体查询。

这里有详细的说明:https://vimeo.com/38947881


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接