特别声明:此篇文章根据Stéphanie Walter 的英文文章《The Mobile Web: CSS Image Replacement for Retina Display Devices 》进行翻译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。

有很多设备的“devicePixelRatio”都大于1.5或者等于2(window.devicePixelRatio = 物理像素/dips)。我的三星项目就是个最新的iPhone和iPad版本设置了“devicePixeRatio”等于“2”。Retian似乎是屏幕显示的一种趋势,这也是Web设计师面对的一个新挑战。

移动应用程序的设计师们已经学会了如何为Retina屏幕设备显示更好质量的图片,用来提高用户的体验。他们为普通显屏和Retina屏幕提供两套图片,以及为Android设备创建了四套不同尺寸大小的图片。

iPhone5和New iPad已经开始采用了Retina屏幕显示技术。在本文中,你将看到如何使用CSS3技巧在Web应用中为Retina屏幕替换更高质量的图片。

代码背后的故事

这一切都始于为iPhone创建一个jQuery Mobile的应用程序。当时的想法是想使用一个完整的“HTML5 jQuery Mobile”应用程序,并使用“Phonegap”将其嵌入到“Native Shell”中。

对于这个应用程序,我在在底部创建了一个标签栏,在顶部放置了一个logo,以及模仿了一个ios的标签栏。"header"和“footer”部分都采用了图片替换文本的技术,在顶部显示了logo图标,在底部显示了对应的工具标签icon。

故事就这样发生了,当我在iPhone 4s的设备上进行测试时,我看见顶部的logo和底部的icon图标都被放大,并且看起来模糊,视觉效果非常的差。

DEMO

为了更好说明问题,我在本机上创建了一个类似于iOS的应用程序,这样你就能搞清楚是怎么一回事。不管你有没有Retina设备,如果你要测试都可以用你的手机点击,同进你也可以点击下载源码。(如果你想模仿做一个简单的手机移动页面,这也是一个例子哟)。

正如我所说的,如果你在一个非视网膜装置上加载页面,看起来是一个不错的效果,但是你在一个Retina装置上加载页面,那么页面上的图片将会栅格化,看起来比较模糊。

由于像素比例(devicePixeRatio)是2,这个时候图片也将放大两倍,此时就造成了图片在设置中显示时被拉伸,呈现出来的时候就模糊不清。下面从iPad3中,iPhone4和”三星“设备中截取的一些被栅格化的图像截图。

三星(Galaxy Nexus)下的效果

iPhone4下的效果

iPad 3下的效果

图片替换的技术

在这个案例中,为Retina替换图片,采用不同的技巧将会有不同的效果。

我们需要替换的第一张图片是顶部的logo。在此处确保只设置高度不设置宽度。

HTML 结构

复制代码代码如下:

My logo

CSS代码

复制代码代码如下:

.ui-header h1{

color:#fff;

display: block;

outline: 0 none !important;

overflow: hidden;

margin:0;

text-align: center;

text-overflow: ellipsis;

white-space: nowrap;

text-indent:-9999px;

background:url(img/logo.png) no-repeat center center;

height:33px;

}

请注意:在这里只设置高度不要设置宽度

第二个就是给删除按钮添加图片。我们保留了文本,只是使用“:before”伪类为按钮添加一个“icon”。

HTML 结构

复制代码代码如下:

Delete item

CSS代码

复制代码代码如下:

.delete:before{

content: " ";

display:block;

width:20px;

height:20px;

position:absolute;

left:6px;

background:url(img/delete.png) no-repeat;

}

此处,给元素同时设置了宽度和高度,但是没有设置内距。

接下来是给下载按钮添加图标。

HTML结构

复制代码代码如下:

Download

CSS 代码

复制代码代码如下:

.download {

background:rgb(222, 227, 232) url(img/nuage.png) no-repeat 8px 6px;

border:1px solid rgb(199, 206, 212);

padding: 25px 0 25px 120px;

font-size:20px;

color:rgb(144, 160, 176);

text-shadow: 0 1px 1px rgb(239, 242, 245);

}

这是调用图片的第三种方法,在这种方法里只设置了内距,并没有设置任何宽度和高度。

不过制作footer上的icon,我们还是设置了高度和宽度,而且还有内距。

HTML结构

复制代码代码如下:

bubble

CSS代码复制代码代码如下:

.ui-footer .button{

background-color:rgba(187, 185, 185, 0.2);

border:1px solid rgb(22, 22, 22);

box-shadow: 0px 1px 2px rgba(22, 22, 22, 0.5) inset ;

text-indent:-9999px;

padding:10px 15px;

width:40px;

height:40px;

background-position: center center;

background-repeat:no-repeat;

margin: 0 5px;

}

.bubble{

background-image:url(img/bubble.png);

}在非视网膜下,我们还有别的不同方案来制作图片替换的效果。

像素(Pixel-Ratio)查询解决方案

接下来是想办法让这些设置加载质量更好的图片。我想起了“device-pixel-ratio”媒体查询像素比。我从来没有使用过,但是我决定试一试,使用这个属性,你需要加上一些浏览器厂商的前缀。

这个想法非常简单,我决定为Retina屏幕设备加载一张两倍大的图片,当我为IOS应用程序时,我选择了@2x的方式为Retina设备加载了高质量的图片。我最终是这样操作的。

复制代码代码如下:

@media only screen and (-webkit-min-device-pixel-ratio: 2),

only screen and (min--moz-device-pixel-ratio: 2),

only screen and (-o-min-device-pixel-ratio: 2/1),

only screen and (min-device-pixel-ratio: 2) {

#myelement{

background:url(myicon@2x.png) no-repeat;

}

}

你肯定会认为这样做就好了,是的,Retina设备加载了高质量的图片,但是问题是这张图片像素是普通设备加载的图片两倍大小。这样一来仍然没有解决问题。下图是三星设备上显示效果,图片不在模糊了,但还不是完美的方案。

借用background-size属性完成

现在我们加载了适合Retina设备的图片,但是我们需要解决图片显示的尺寸问题,让图片尺寸在Web中显示正确。为了实现这个效果,我们需要借用强大的background-size属性,根据需要调整背景图片的尺寸。你只需要使用“百分值”或“auto”值设置宽度。

在代码中是很简单就能实现,(注:在这里使用ID为“#retina”为这个案例设置了background-size,当然你可以根据你自己的需要进行编写代码)。

你不记得吗?我们在为头部的logo写样式时,就没有设置宽度,只设置了高度,这就是一个技巧,我们此时只需要给元素的background-size设置背景图片的高度和元素的高度一样,而其中宽度保留auto。

复制代码代码如下:

#retina .ui-header h1{

background:url(img/logo@2x.png) no-repeat center center;

background-size: auto 33px ;

}

对于删除按钮,就更容易了,我们给元素同时设置了宽度和高度,而没有设置任何内距,我们只需要给background-size设置两个值为100%;这样做的意思就是让图片百分之百的填充元素。

复制代码代码如下:

#retina .delete:before{

background:url(img/delete@2x.png) no-repeat;

background-size: 100% 100% ;

}

对于下载按钮的图片就显得有点麻烦了,没有给元素设置任何宽度和高度,这个时候只能按照非视网膜下的图片尺寸来设置background-size的值。

复制代码代码如下:

#retina .download {

background:rgb(222, 227, 232) url(img/nuage@2x.png) no-repeat 8px 6px;

background-size: 70px 68px ;

}

对于页脚的icon,虽然我们设置了元素的宽度和高度,但是我们还有一个内呀,这样一来我们不得不给background-size设置一个明确的值:

复制代码代码如下:

#retina .bubble{

background-image:url(img/bubble@2x.png);

}

#retina .loupe{

background-image:url(img/loupe@2x.png);

}

#retina .folder{

background-image:url(img/folder@2x.png);

}

#retina .ui-footer .button{

background-size: 40px auto ;

}

现在看起来就完美了

HTML中的图片标签img怎么办?

上面介绍的只是样式中处理图片的方法,但是我们在HTML结构中也会有使用图片的。因为,你需要了解一些图片响应式的技巧。不过使用retina.js 也是一种很简单的方法,只需要在同一个文件目录下加载一张“@2x”的图片,然后同过js脚本来实现。除此之外还有一个Retina Images 插件可以实现,不过这个插件需要一些其他设置。

限制与结论

通过上面的案例你也看到了,每个案例都使用了不同的方法,如果你想做得比较好,你就需要熟悉background-size属性的使用。当然你也可以hack来实现,为非视膜和视网膜设置加载不同的图片。我也不是专家,我也不清楚为不同的设备加载不同的图片有何影响。如果你有兴趣可以测试一下。

background-size是css3的一个属性,这样就受到浏览器的限制。就算不使用background-size属性,而是使用两张不同的图片,这样缺点也不少,不易于维护,而且还要有足够的空间来加载这些图片。所以你要考虑清楚使用哪种技术,就算你加载了两倍大的图片来进行缩放,你也要考虑一下性能的问题。

总之,这是解决Retina屏幕下图片清晰流畅的好办法,但具体在项目中是否使用,应该不应该使用,还需要取决于你的项目需求。所以说,这种技巧并不适合于每个人。

进一步探索

如果你想不加载两个文件,让你的图标又好看,感兴趣的话,你可以看看制作的ICON或SVG制作的图片。你可以看看这篇文章,只可惜的是这里面介绍的技术还没有得到广泛的支持。

译者手语:初次翻译前端技术博文,整个翻译依照原文线路进行,并在翻译过程略加了个人对技术的理解。如果翻译有不对之处,还烦请同行朋友指点。谢谢!

html5 css3替换图片,移动Web—CSS为Retina屏幕替换更高质量的图片相关推荐

  1. 移动Web—CSS为Retina屏幕替换更高质量的图片

    来源:互联网 作者:佚名 时间:12-24 10:37:45 [大 中 小] 点评:Retian似乎是屏幕显示的一种趋势,这也是Web设计师面对的一个新挑战;移动应用程序的设计师们已经学会了如何为Re ...

  2. 将PDF文件转换为高质量的图片:免费的在线PDF转换器

    在现代社会中,PDF文档是非常常见的一种文档格式.但是,在某些情况下,我们需要将PDF文件转换为高质量的图片,以方便分享和展示.本文将介绍几款免费的在线PDF转换器,帮助您将PDF文件快速.简单地转换 ...

  3. web——CSS精灵图(背景图、定位背景图片background-position属性)

    web--CSS精灵图(背景图.定位背景图片background-position 属性) 一.background-position属性 二.实例 一.background-position属性 例 ...

  4. web怎么将dwg转换图片_CAD转JPG图片,在线转换成高质量彩色图片

    CAD 转 JPG 图片,在线转换成高质量彩色图片 为了更好地绘制图纸,需要对 CAD 图形格式进行转换.CAD 转 JPG 是常 见的转换操作之一.有时候工作很忙,用 CAD 转换软件转换可能会很麻 ...

  5. CAD转JPG图片,在线转换成高质量彩色图片

    为了更好地绘制图纸,需要对CAD图形格式进行转换.CAD转JPG是常见的转换操作之一.有时候工作很忙,用CAD转换软件转换可能会很麻烦.事实上,CAD可以在线转换成JPG,不用任何CAD转换器都可以完 ...

  6. 高质量无损图片压缩算法

    高质量无损图片压缩算法 using System.Drawing; using System.Drawing.Imaging; using System.IO;namespace CompressIm ...

  7. CV之IG之Inception:基于TF框架利用Inception模型+GD算法的某层网络图像生成更高质量的Deep Dream幻觉梦境图片(特征可视化实现图像可解释性)案例应用

    CV之IG之Inception:基于TF框架利用Inception模型+GD算法的某层网络图像生成更高质量的Deep Dream幻觉梦境图片(特征可视化实现图像可解释性)案例应用 目录 基于TF框架利 ...

  8. 2021-7-30 Python-爬虫练手:爬取高质量美女图片

    爬取高质量美女图片 目标网站 思路分析 封面页 用bs4确定封面页图片链接 拿到图片链接和名称 保存封面 子页面(套图) 确定子页面位置 获取子页面里图片位置和图片名称 保存组图 完整代码 运行结果 ...

  9. 提高matlab图片质量,由Matlab输出高质量论文图片方法

    关于Matlab输入高质量论文图片的方法 整理制作:吴川辉 Email:km_bruce@http://www.doczj.com/doc/fa0bf4b3fd0a79563c1e72d5.html ...

最新文章

  1. 6-flutter 状态管理
  2. 特斯拉放弃SAP,仅25个人4个月就开发了整套ERP!就问你服不服?
  3. [转]html5: postMessage解决跨域和跨页面通信的问题
  4. JAVA中获取当前运行的类名,方法名,行数
  5. C#实现UTC时间与Datetime转换
  6. 并发无锁队列学习(单生产者单消费者模型)
  7. 利用tushare进行对兴业银行股价的爬取,并使用numpy进行分析
  8. Apache Flink OLAP引擎性能优化及应用
  9. Tensorflow入门--图与会话
  10. 第一、二类斯特林(Stirling)数的生成函数(母函数)及推导
  11. hadoop的ACL权限
  12. redhad6.4 安装zabbix2.4
  13. 什么是锁PHP,PHP简单分布式锁-PHP中的锁
  14. tcl如何获取键盘输入
  15. 如何在Mac上强制退出应用
  16. 如何找到最新的RFC文档
  17. numpy 处理txt的简单样例
  18. kodi linux版本,Linux下安装多媒体中心 Kodi 18.8 新版本并设置中文界面
  19. 网页 插件 html,HTML 插件
  20. FMCW雷达动作原理

热门文章

  1. Corn表达式【定时任务】
  2. 《数据结构(C语言版)》-01-绪论-相关代码分析
  3. 第14节 实例-事件响应之组合键
  4. 一朋友手头有98万,想在深圳买房,网友的回复很扎心!
  5. 2016太原UI设计师告你去公司我们涉猎哪些工作?
  6. 【系统设计】如何设计一个Pastebin.com?
  7. ubuntu安装使用Beyond Compare4
  8. protoc cpp_out 新手踩坑
  9. 2017蓝桥杯等差素数(C++B组)
  10. Java GUI-布局管理器