关于image-set和srcset

关于image-set

不久前加入一个新项目组,在新项目中学习到了一个css新属性:image-set,经过多方资料查询,现将总结罗列如下:

image-set是CSS4草案中的一个属性,目的就是保证图片在屏幕上的自适应。目前image-set只能使用webkit浏览器的私有属性“-webkit”。

语法

image-set() = image-set( <image-set-option># )
<image-set-option> = [ <image> | <string> ] <resolution>

image-set() 可以根据用户设备的分辨率匹配合适的图像。为不同的设备分配合适得图像;

示例:下述示例1代码将会为普通屏幕使用 test.png,为高分屏使用 test-2x.png,如果更高的分辨率则使用 test-print.png,比如印刷。

div {
    background-image: image-set( "test.png" 1x, "test-2x.png" 2x, "test-print.png" 600dpi );
}
div {
    background-image: -webkit-image-set(url(http://mat1.gtimg.com/www/images/qq2012/qqlogo_1x.png) 1x,url(http://mat1.gtimg.com/www/images/qq2012/qqlogo_2x.png) 2x);
}

兼容性

需要注意的是,目前这些浏览器支持的语法是:image-set( <url> | <string> ),写法如同示例中的第二种写法。

image-set真的很实用,很可惜的是,他仅支持background-image属性,而不能使用在“<img>”标签中。

实际运用

一般在实际运用时,会和background一起用,如下:

selector {
  background-image: url(no-image-set.png);
  background: image-set(url(foo-lowres.png) 1x,url(foo-highres.png) 2x) center;
}

类似于不同的文本,图像也会显示成不同的:

  1. 不支持image-set:在不支持image-set的浏览器下,他会支持background-image图像,也就是说不支持image-set的浏览器下,他们解析background-image中的背景图像;
  2. 支持image-set:如果你的浏览器支持image-sete,而且是普通显屏下,此时浏览器会选择image-set中的@1x背景图像;
  3. Retina屏幕下的image-set:如果你的浏览器支持image-set,而且是在Retina屏幕下,此时浏览器会选择image-set中的@2x背景图像。

关于srcset

查阅image-set时,也顺便翻看到了srcset属性,img的srcset属性方便的解决了页面图片适应不同屏幕密度的情况。目前除了IE没有兼容到,已经全部都兼容了,可以放心使用。这个属性也就弥补了image-set只能在background使用的问题。

兼容性:

srcset这个属性用于:以最合适的src去匹配不同屏幕(高分屏低分屏如Retina;大屏小屏)

示例用法如下:

<img src="mm-width-128px.jpg" srcset="mm-width-128px.jpg 1x, mm-width-256px 2x">
当然,我们也可以简写成:
<img src="mm-width-128px.jpg" srcset="mm-width-256px 2x">

新标准

按照上面的实现,不同的屏幕密度都要设置图片地址,目前的屏幕密度有1x,2x,3x,4x四种,如果每一个图片都设置4张图片的话,太麻烦了。所以就有了新的srcset标准。代码如下

<img src="source.jpg" width="100%"
  srcset="source_400.jpg 400w, source_600.jpg 600w, source_1280.jpg 1280w">

<img src="image-128.png"
  srcset="image-128.png 128w, image-256.png 256w, image-512.png 512w"
  sizes="(max-width: 360px) 340px, 128px" />

1x、2x 表示目标屏幕的像素密度;400w、600w表示目标浏览器的宽度的限度,如浏览器宽度550w时,匹配600w的src。

对于srcset里面出现了一个w单位,可以理解成图片质量。如果可视区域小于这个质量的值,就可以使用,当然,浏览器会自动选择一个最大的可用图片。

sizes语法如下:

sizes="[media query] [length], [media query] [length] ... "

上面例子中的sizes就是指默认显示128px, 如果视区宽度大于360px, 则显示340px。

注意,这里所有的值都是指宽度值,且单位任意,empxcmvw...都是可以的,甚至可以CSS3的calc计算,例如:

sizes="(max-width: 360px) calc(100vw - 20px), 128px"

表示当视区宽度不大于360像素时候,图片宽度为整个视区宽度减去20像素的大小。

时间: 2024-10-07 22:42:01

关于image-set和srcset的相关文章

img标签-srcset属性

agm抄知乎时发现,avatar的img标签有个陌生的srcset属性,如下: 1 <img class="Avatar" src="https://pic3.zhimg.com/8622a8eea_s.jpg" srcset="https://pic3.zhimg.com/8622a8eea_xs.jpg 2x" alt="测试用户1"> 翻阅得知此属性用于:以最合适的src去匹配不同屏幕(高分屏低分屏如Reti

angular参考手册拷贝

AngularJS 参考手册 AngularJS 指令 本教程用到的 AngularJS 指令 : 指令 描述 ng-app 定义应用程序的根元素. ng-bind 绑定 HTML 元素到应用程序数据 ng-bind-html 绑定 HTML 元素的 innerHTML 到应用程序数据,并移除 HTML 字符串中危险字符 ng-bind-template 规定要使用模板替换的文本内容 ng-blur 规定 blur 事件的行为 ng-change 规定在内容改变时要执行的表达式 ng-check

【Bootstrap】3.优化站点资源、完成响应式图片、让传送带支持手势

A.优化站点资源 速度很重要.用户很关心.我们的站点必须加载够快,否则用户就会走人.SEO 也很重要.我们的站点必须加载够快,否者搜索排名就会下降. 明白了这样,我们就来清点一下 [Bootstrap]2.作品展示站点 中的资源.特别的,来看一看我们能控制的.影响页面速度的重要因素 —— 文件大小,包括图片.CSS和 JavaScript 文件.只要简单几步,我们就可以给这些文件“瘦身”,缩短加载时间. A.1 优化图片 这些图片都通过 Photoshop 的 “保存为 Web 格式” 进行了一

APP适配IOS8,iPhone6和Plus截图简要说明

有幸在9月25日拿到了iP6和iP6 Plus的真机,恰好又要做适配APP的工作(从iphone5上适配到iphone6和ip6 plus上),所以在真机上研究了下苹果官方在不同分辨率下对系统APP所做的适配.同时在网上也没找到相关的真机对比截图说明什么的,又有朋友问我要IP6和PLUS的真机截图回去自己研究,既然这样,那么干嘛不利用自己已有的资源,让更多的设计师受益呢?所以那就说点什么吧,抛砖引玉,希望大家可以共同研究,少走些弯路,共同成长. 之前看过@jingdesign 的关于适配ip6的

响应式图片处理

实现方法: js或服务器端. srcset 配合sizes. <img src="img/ad001.png" class="image" srcset="img/ad001.png 480w, img/ad001-m.png 800w, img/ad001-l.png 1600w" sizes="100vw"> picture svg 推荐伯乐在线的一篇文章比较具体详细:http://web.jobbole.co

前端性能优化之优化图片

前端图片优化一直以来都是热门话题,从需求上来看,很多站点往往是图片体积大于代码体积, 图片请求多余代码文件请求, 给前端的性能带来了很大的困扰,那么应该如何解决呢? 零. 认识图片 我们通常使用的图片就是gif.png和jpg了. 其中,gif格式是比较老的图片格式,它的色彩效果最低(就是不清楚!!!),如果想要使用gif保存鲜艳图片会让你的网站看上去非常可怕. 但是gif有着不可忽视的优点:体积小.有着极好的压缩效果,支持动画,并且支持透明效果,虽然这个透明没有PNG格式图片支持的强大... 

Effective前端2:优化html标签

  借用Effective之名,开始写Effective系列,总结一些前端的心得. 有些人写页面会走向一个极端,几乎页面所有的标签都用div,究其原因,用div有很多好处,一个是div没有默认样式,不会有margin.background等初始化设置,另外可能会觉得不用div还能用啥.所以看他的页面,一展开是div,再展开还是div,展开四.五层都是div. 这样对用户来说虽然没什么区别,但是作为一名有追求的程序员,这种写法看起来是比较难受的.有些人虽然知道html5新增了很多标签,但也不怎么去

组件的详细说明和生命周期ComponentSpecs and Lifecycle

render ReactComponent render() render() 方法是必须的. 当调用的时候,会检测 this.props 和 this.state,返回一个单子级组件.该子级组件可以是虚拟的本地DOM 组件(比如 <div /> 或者 React.DOM.div()),也可以是自定义的复合组件. 你也可以返回 null 或者 false 来表明不需要渲染任何东西.实际上,React渲染一个<noscript> 标签来处理当前的差异检查逻辑.当返回 null 或者 

HTML页面优化

第一步:加载优化 减少HTTP请求. 因为手机浏览器同时响应请求为4个请求(Android支持4个,iOS 5后可支持6个),所以要尽量减少页面的请求数,首次加载同时请求数不能超过4个.a) 合并CSS.JavaScript:b) 合并小图片,使用雪碧图(CSS SPRITE):   缓存. 使用缓存可以减少向服务器的请求数,节省加载时间,所以所有静态资源都要在服务器端设置缓存,并且尽量使用长Cache(长Cache资源的更新可使用时间戳). a) 缓存一切可缓存的资源:b) 使用长Cache(