css sprite、background-size、Retina屏幕详解

前面我写过如何优化Retina屏幕下的图像

如何优化Retina屏幕下的图像一文中从CSS3的background-size切入,介绍了background-size的属性使用方法,然后转入正题,介绍了Retina屏幕下的图像优化。如果你对background-size属性不太了解,建议你先了解一下。不管是上一篇还是今天要介绍的这篇文章,background-size都是非常重要的一个属性。或者说,Retina屏幕下对图像的显示处理,background-size起着很重要的作用。

大漠

如何优化Retina屏幕下的图像一文中,Josh Byers介绍了一个实例,在这个实例中,Josh Byers说:“你可以通过CSS3 Media Queries为Retina屏幕设备提供一个高分辨率的图像”。

虽然这种方法通过多张图像来显示,增加了工作量,但我相信,为最终用户服务这是最好的选择。因为只有给Retian屏幕设备用户提供一个高质量的图像。

为了做到这一点,我们需要一种新的技术支持,这种新的技术就是CSS3的background-size属性。我没有详细介绍这个属性的来龙去脉,只是通过一些练习简单介绍了一下。

作为奖励,这篇文章我向大家介绍如何使用background-size让高分辨率的图片精灵(sprites)在Retina屏幕下完美显示。

什么是background-size属性?

background-size属性是CSS3新增加一个背景属性,正如他的名称一样,你可以通过这个属性来控制背景图片的尺寸大小。

background-size有几个属性值,可以设置背景图片的尺寸大小:

你可以使用像素(px)值,第一个值设置背景图像的宽度,第二个值设置背景图像的高度,如果你只设置了一个值,那么另个值默认为“auto”值。

div {
  background: url(logo.png) no-repeat;
  background-size: 150px 150px;
  height: 200px;
  width: 400px;
}

你也可以使用百分比值(%),当你使用百分比值时,background的尺寸是相对于容器的宽度计算。如下面的例子所示,我们容器的宽度是“400px”,当我们设置“background-size”的值为“25%”时,背景图像的宽度就变成了“100px”。

div {
  background: url(logo.png) no-repeat;
  background-size: 25% auto;
  height: 200px;
  width: 400px;
}

"cover"值,可以让背景图像等比例放大到填满整个容器。

div {
  background: url(logo.png) no-repeat;
  background-size: cover;
  height: 200px;
  width: 400px;
}

"contain"值可以让你的背景图像缩放到最大宽度和高度,并且让整个背景图像保持在容器内。

div {
  background: url(logo.png) no-repeat;
  background-size: contain;
  height: 200px;
  width: 400px;
}

background-size取值为“contain”理解起来有点歧义,他让背景图像能进行缩放,那是根据容器的大小进来进行缩放的,此时会有两种情形,当背景图像放到最大宽度时,背景图像达到容器宽度,但未达到容器高度时,会以容器的宽度为相对物,其高度不会在继续放大;另一种情形就是当背景图像放大到最大宽度时,背景图像的高度与容器高度相同时,那么会以容器的高度为相对物,其宽度不会在继续放大。

有关于CSS3的background-size属性的详细使用,大家可以点击这里

大漠

Retina屏幕下使用background-size属性

正如我所说的,苹果推出Retina屏幕显示技术,他们不希望让普通显屏下的相同物理尺寸在Retina屏幕下显示更小。在iPhone4屏幕下显示的icon尺寸要和3G S下的相同。

为了完成这种效果,在Retina屏幕下图像的尺寸都会翻倍。这样一来,如果图像的像素不翻倍,那么图像在Retina屏幕设备下就会变得模糊不清。

为了抵消这个现像,我们需要制作图像的像素大小也翻倍,然后通过background-size属性来控制他的大小,让其在Retina屏幕显示达到一致的效果。

例如我想创建一个LOGO,填充在一个“100px x 100px”的容器中,那么我就需要制作并上传一个至少翻两倍的像素的图像。

在我们的实例中,LOGO的实际大小是“500px x 500px”。如果我将logo图像做为背景填充在一个容器中,并且没使用“background-size”来设置背景图像的尺寸大小,此时容器就会对背景图像进行裁剪。

div {
  background: url(logo.png) no-repeat;
  height: 100px;
  width: 100px;
}

很显然,我们可以使用“Media Queries”查询设备的“pixel rotio”是不是“2”,把这张背景图像只使用在Retina屏幕设备下。

我们还将设置“background-size”的值为“100px 100px”。实际上我们在Retina屏幕设备下使用的图像是“500px x 500px”这张,但上通过css让他在浏览器显示出来却是“100px x 100px”。

@media screen and (-webkit-min-device-pixel-ratio: 2),
screen and (max--moz-device-pixel-ratio: 2) {
  div {
    background: url(logo.png) no-repeat;
    background-size: 100px 100px;
    height: 100px;
    width: 100px;
  }
}

现在,如果你的图形中有小于1px的线,你做缩小尺寸会有一些的问题。这个你需要视具体情况试验一下。

Sprites呢?

我是不是可以创建一张Sprites图,这张图既有普通分辨率图像,又有高分辨率下的图像?

你可以,但你还是要面对,你的用户在一个较慢的带宽下下载一个大图的烦恼。你也要同时面对IE9以下的浏览器不支持background-size的麻烦问题。

你最好还是分别为高分辨率和普通分辨率创建不同的两张Sprites图。这个时候又有不同的声音了,这不是增加工作量吗?但这真的不是,在我的工作流中,我会先创建一张高分辨率的Sprites图像,然后制一份,并把尺寸缩放一半。当图像需要更新时,只需要再一次处理高分辨率下的图像,然后复制,重置一半的尺寸保存。

当我的Sprites图像是300px,如何指定background-size为32px呢?其实不难,只需要一点点数学计算,这是一个很初级的过程。

在我们的实例中,我们使用媒体社交图标.我想让他们都按16px x 16px的大小显示。我们将创建一个适合Retina屏幕设备的Sprites 图像,将图像尺寸翻倍(32px x 32px),并且保存他。为了保证普通显屏设备的图像显示,在这个图像的基础上做了一半的缩小。

在最初的CSS样式中,background-position的属性值都不需要进行任何设置,因为他们的默认值都是“0”,如下所示:

#social-icons .facebook {
  background: url(images/social-sprite.png);
  background-position-x: 0px;
  background-position-y: 0px;
  height: 16px;
  width: 16px;
}

#social-icons .facebook:hover {
  background-position-y: -16px;
}

对于我们的Retina屏幕显示,我们必须声明一个Media Queries,该Media Queries专门针对Retina屏幕设备显示器。我们同时改变背景大小而不是宽度和高度。

因此,最关键的问题是,我们怎么知道background-size属性值要设置为多少?

这里有一个公式

高分辨率图像宽度 / 目标图像宽度 = X

原始Sprites图像宽度 / x = background-size的宽度值

实例说话

我们高分辨率下的图标是32px x 32px;

我们目标图像的宽度是“16px”;

我们Sprites图像的总宽度是“96px”

根据前面的公式 可以得知

32/16 = 2

96/2 = 48

最后的一件事情。我们只计算了背景图像的宽度值,为了确保背景图像缩放比例正常,我们将“height”值设置为“auto”。当然你也可以设置相的的值(设置background-sizer的宽度为auto,高度为具体值),但我发现设置宽度会比较容易。

@media screen and (-webkit-min-device-pixel-ratio: 2),
screen and (max-moz-device-pixel-ratio: 2) {
  #social-icons .facebook {
    background: url(images/social-sprite2x.png);
    background-position-x: 0px;
    background-position-y: 0px;
    background-size: 48px auto;
  }

 #social-icons .facebook:hover {
   background: url(images/social-sprite2x.png);
   background-position-x: 0px;
   background-position-y: -32px;
 }
}

当然,实现本文演示的效果有多种方法,他们各自有自己有优点和缺点。我个人认为,到目前为止,使用Media Queries和高分辨率的Sprites是最好的选择。

本文转自:http://www.w3cplus.com/css/css-background-size-graphics.html

时间: 2024-10-25 13:12:28

css sprite、background-size、Retina屏幕详解的相关文章

CSS背景background、background-position使用详解

背景(background)是css中一个重要的的部分,也是需要知道的css的基础知识之一.这篇文章将会涉及css背景(background)的基本用法,包括诸如 background-attachment 等的属性,也会介绍一些有关背景(background)的常用技巧,以及 css3 中的 背景(background)(包含4个新的背景(background)属性). css2 中的背景(background) 概述 CSS2 中有5个主要的背景(background)属性,它们是: * p

CSS学习笔记(9)--详解CSS中:nth-child的用法

详解CSS中:nth-child的用法 前端的哥们想必都接触过css中一个神奇的玩意,可以轻松选取你想要的标签并给与修改添加样式,是不是很给力,它就是":nth-child". 下面我将用几个典型的实例来给大家讲解:nth-child的实际用途: Tips:还用低版本的IE浏览器的哥们请绕过! :nth-child(2)选取第几个标签,"2可以是你想要的数字" .demo01 li:nth-child(2){background:#090} :nth-child(n

CSS魔法堂:Position定位详解

一.Position各属性值详解   1.  static :默认值,元素将按照正常文档流规则排列.   2.  relative :相对定位,元素仍然处于正常文档流当中,但可以通过left.top.right和bottom的CSS规则来改变元素的位置. 注意点:[a]. 元素原来位置将保留,不被其他元素所占据; [b]. 当使用left,top改变元素位置时,元素将以原来位置的border外边框的左上角作为参考点 ; [c]. 当使用right.top时改变元素位置时,元素将以原来位置的bor

CSS系列(8) CSS后代选择器和子选择器详解

一.CSS后代选择器详解 1,  生动介绍基本概念 一个标签嵌B在另一个标签A内部,B就是A的后代. 而且,B的后代也是A的后代,这就叫“子子孙孙无穷尽也”. 比如: <div> <p>这个p标签是div的后代</p> <div> 后代选择器就是用来选择一个标签的后代的: 两个选择器中间添加一个[空格]就构成了后代选择器,空格后面的那个是后代. 例如: div p { color : red; } 它会选择一堆的p标签,只要这个p标签是嵌套在某个div标签内

css控制UL LI 的样式详解

用<ul>设置导航 <style> #menu ul {list-style:none;margin:0px;} #menu ul li {float:left;} </style> <div id="menu"> <ul> <li><a href="#">首页</a></li> <li class="menuDiv"><

CSS旋转与翻转使用示例详解

css 2.0还是没有翻转的,3.0里面有rotate属性,这个可以把元素进行任意角度旋转,灰常强大,下面有个不错的示例,大家可以参考下 一个项目中要画一个图,有横坐标和纵坐标,纵坐标需要文字转过来竖排,baidu了一圈,找到一篇文章,有用,转载过来备查 css 2.0还是没有翻转的,3.0里面有rotate属性,这个可以把元素进行任意角度旋转,灰常强大.除了这个rotate,还有一个scale,一般用法格式是 -moz-transform:scale(1,1); 括弧里面(1,1)前者表示X轴

CSS计数器(序列数字字符自动递增)详解———张鑫旭

by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=4303 一.挖坟不可耻 CSS计数器不是什么新鲜玩意了,早在10年春暖花开的时候,我写的“CSS content内容生成技术以及应用”一文就要提到(见下图),不过当时是作为其中一员介绍.就像例行的溜新同事一样,虽然黑如焦炭的我在自我介绍的时候给新同事留下了深刻印象,但由于介绍的同事茫茫多,我只是其中一员.很自然,个把月之

关于css伪类,伪元素详解总结

伪类 伪类就是一种虚构的状态或者说是一个具有特殊属性的元素可以使用CSS进行样式修饰.常见的几种伪类是: :link , :visited , :hover , :active , :first-child 以及 :nth-child. 这里还有很多,接下来我们将要逐一进行介绍.此外,伪类前面总是加一个冒号(:).之后跟着伪类的名字或者是括号里面的值,如:nth-child. 伪元素 关于伪元素,它们更像是虚拟的元素可以和HTML元素一样对待.区别在于它们并不存在于文档树或者DOM之中.这意味着

css中伪类/伪元素详解

一.伪类和伪元素 伪类和伪元素都是用来修饰不在文档树中的部分,区别在于, 伪类用于当已有元素处于的某个状态时,为其添加对应的样式,这个状态是根据用户行为而动态变化的(如:hover/:active). 而伪元素则用于创建一些不在文档树中的元素,并为其添加样式(如:before/:after). 二.常用伪类 伪类 用法 兼容 :link 未访问的链接 主流浏览器都支持 :visited 已访问的链接 主流浏览器都支持 :hover 鼠标划过链接 主流浏览器都支持 :active 已选中的链接 主