响应式开发中的图片处理

翻译自Peter LePage

一个网页中平均约60%的数据量是被图片占据的,所以在响应式开发中注重图片的优化可以很大程度上提高网页的性能,例如为低分辨率的屏幕推送低分辨率的图片可以避免流量的浪费。

图片标签

HTML中的img元素负责下载,解码并加载图片内容。做到以下几点可以帮助网页实现更好的体验:

使用相对尺寸

使用相对尺寸定义图片可以防止其超出可视范围。例如设置width: 50%可以保证图片的宽度是其父元素的50%(不是可视范围的50%也不是其实际尺寸的50%)。

因为CSS允许内容超出容器,可以使用max-with: 100%来避免图片以及其他内容超出容器范围。

利用srcset为高分辨率屏幕加载高质量图片

利用img元素的srcset属性可以很方便地在不同的屏幕加载不同的图片文件。浏览器会根据设备的特定选择最佳的图片来显示,例如在retina屏幕上加载双倍分辨率的图片,或者在网速不好的情况下加载较小的图片。

<img src="photo.png" srcset="photo@2x.png 2x" ...> 

对于不支持srcset的浏览器, img元素会加载src指向的图片。对于支持srcset的浏览器,在请求页面之前会先解析srcset的内容(图片和相应的加载条件),只有最合适的图片会被下载并显示。

理论上图片加载条件可以是像素密度(pixel density)或屏幕高宽,但是现在只有像素密度的支持性比较好。

使用picture元素

picture 元素可以根据不同的设备特性加载不同的图片版本,例如设备尺寸,分辨率,方向等等。

一个picture元素中可以包含多个source元素,分别对应在不同情况下需要加载的图片。

<picture>
  <source media="(min-width: 800px)" srcset="head.jpg, head-2x.jpg 2x">
  <source media="(min-width: 450px)" srcset="head-small.jpg, head-small-2x.jpg 2x">
  <img src="head-fb.jpg" srcset="head-fb-2x.jpg 2x" alt="a head carved out of wood">
</picture>

在这个例子中,当浏览器宽度大于800像素时会根据屏幕分辨率加载head.jpg或者head-2x.jpg。当浏览器宽度介于450像素与800像素之间时,会根据屏幕分辨率加载head-small.jpghead-small-2x.jpg。当浏览器宽度小于450像素或者浏览器不支持picture元素时,浏览器会渲染img元素,因此保证picture元素中包含有一个img元素

相对尺寸图片

在一个响应式页面中,图片尺寸可能随着浏览器的缩放而改变,因此无法预先知道图片的有效像素密度。可以通过为图片文件添加宽度描述来使浏览器自动计算像素密度从而加载最合适的图片。

<img src="lighthouse-200.jpg" sizes="50vw"
     srcset="lighthouse-100.jpg 100w, lighthouse-200.jpg 200w,
             lighthouse-400.jpg 400w, lighthouse-800.jpg 800w,
             lighthouse-1000.jpg 1000w, lighthouse-1400.jpg 1400w,
             lighthouse-1800.jpg 1800w" alt="a lighthouse">

这个例子会加载一张宽度为浏览器可视区域宽度一般的图片,并且根据浏览器宽度和设备像素比选择合适的图片加载

相对尺寸的图片

在很多情况下,图片布局也会随着浏览器尺寸的变化而改变,例如在小屏上要求图片撑满可视区域宽度,然而在大屏幕上要求图片只占可视范围的一小部分。

<img src="400.png" 
     sizes="(min-width: 600px) 25vw, (min-width: 500px) 50vw, 100vw"
     srcset="100.png 100w, 200.png 200w, 400.png 400w,
             800.png 800w, 1600.png 1600w, 2000.png 2000w" alt="an example image">

在这个例子中,当浏览器宽度大于600像素时,图片宽度是可视区域宽度的25%;当浏览器宽度在500像素到600像素之间时,图片宽度是可是宽度的50%;当浏览器宽度小于500像素时,图片撑满可视区域宽度。

CSS中的图片

CSS中的background属性可以使图片通过多种方法呈现,另外通过CSS3中的媒体查询也可以响应式地加载图片。

使用媒体查询动态加载背景图片

使用媒体查询可以虽然浏览器窗口缩放加载不同版本的图片

.example {
  height: 400px;
  background-image: url(small.png);
  background-repeat: no-repeat;
  background-size: contain;
  background-position-x: center;
}

@media (min-width: 500px) {
  body {
    background-image: url(body.png);
  }
  .example {
    background-image: url(large.png);
  }
}

使用image-set提供高分辨率图片

使用CSS的image-set()函数可以根据设备特性加载不同版本的图片,作用和<img>标签的srcset属性相似

background-image: image-set(
  url(icon1x.jpg) 1x,
  url(icon2x.jpg) 2x
);

image-set()不仅控制图片的加载,而且会根据加载的图片进行缩放缩放。浏览器默认2x的图片尺寸是1x图片的两倍,因此会缩小2x的图片使得显示出的图片大小相同。

由于image-set()只支持Chrome和Safari浏览器,所以在使用时要考虑到浏览器的兼容性,例如:

.sample {
  width: 128px;
  height: 128px;
  background-image: url(icon1x.png);
  background-image: -webkit-image-set(  
    url(icon1x.png) 1x,  
    url(icon2x.png) 2x  
  );  
  background-image: image-set(  
    url(icon1x.png) 1x,  
    url(icon2x.png) 2x  
  );
}

使用媒体查询加载高分辨率图片

媒体查询可以使用设备像素比作为规则,在高分屏幕上加载高分辨率图片,例如:

@media (min-resolution: 2dppx),
(-webkit-min-device-pixel-ratio: 2)
{
  /* 高分辨率的图片资源 */
}

这个例子中的两个判断条件其实是等价的,其中min-resolution是标准写法,但是只有Chrome, Firefox和Opera浏览器支持。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容