Open riskers opened 9 years ago
有人在segmentfault问
html5标签属性实现的响应式与css实现的有什么不同点?
上面说过:
比如当前窗口800px,那么sizes会匹配到
(min-width:800px) calc(75vw - 137px)
,则这个<img>
对应的宽度就是800px*0.75-137px=463px
。这个宽度的设定相当于
<img src="..." width="463" />
而CSS的width只是"显示"的表示,就像上面的 463px 的图片,可以用css设置width为1000px,也可以设置成100px。
但是响应式图片的width是指的是在html标签中设置的width。 利用sizes可以"动态"地响应变换这个 width ,这才是精髓 。
举个例子说吧,比如网页上有一个占据窗口100%宽度的banner图片,是960 * 480的。
用CSS控制很简单,width:100%就行了,这样不管在什么设备上都"看起来"ok。但是让手机加载一张这么大的图是很慢的,不可能因为"看起来"只有320px(比如iPhone4)就会把图片的sizes(这里的sizes指的不是宽/高,是指kb)降低。
响应式图片就不同了,它在HTML加载的时候就可以根据sizes判断出它应该渲染出来的宽度,根据srcset判断加载的图片,这样在手机上就真的可以加载出 宽度320px的图片。
很详细,保持关注!
@0326 那就请订阅一下吧 :smile:
学习! :)
剖析responsive image
最近对
responsive image
有一些感悟然后赶紧记下来免得忘了。下面就是我的感悟:尺寸固定,不同屏幕密度
如果你是用像素来固定图片尺寸,又想在不同屏幕密度屏幕上实现响应式图片,可以这样:
它可以正常运行在所有现代浏览器上,而且在不支持
srcset
的浏览器也可以降级到src
。有一些规则是上面图片所没有提到的:
srcset
里的每一项都是<url> <density>x
结构 ,就像cat-2x.jpg 2x
srcset
里项目的顺序并不重要width
/height
,浏览器会按照屏幕密度展示它本身原始的width
/height
。 比如2x
资源被匹配到了,它会被渲染成本身的 50%width
和 50%height
3x
设备像素比的设备上浏览器渲染的是1x
的图片,可能是因为糟糕的网络环境案例
尺寸和屏幕密度都不同
不同宽度的图片在响应式站点里是很常见的。在这篇博客里,图片内容都是占据了文章100%的宽度,但是文章的宽度并不总是窗口宽度的100%。
为了让浏览器匹配到正确的图片,我们需要知道:
<img>
的宽度最后一点是特别困难的,因为图片开始下载是在CSS解析之前的,所以
<img>
的宽度不能从页面布局那得到。通过
srcset
属性,浏览器知道了哪些图片可用以及这些图片的宽度。 通过sizes
属性,浏览器知道了<img>
相对于一个已知宽度窗口的宽度。 这样,浏览器就可以匹配最佳资源加载了。你不再需要说明屏幕密度,浏览器自己会辨别。如果浏览器窗口宽度是
1066px
甚至更大,<img>
会被定为689px
。在1x
设备浏览器上会下载panda-689.jpg
,但是在2x
设备浏览器上将会下载panda-1378.jpg
。一些规则是上面没有提到的:
srcset
里的每一项是<url> <width-descriptor>w
,比如panda-689.jpg 689w
srcset
里每一项的顺序没有影响srcset
包含了一个宽度描述符(w
),则src
会被那些支持srcset
的浏览器忽略掉sizes
里的每一项是<媒体查询> <图片宽度>
形式,除了最后一个仅仅是<图片宽度>
sizes
里的宽度单位都是px
sizes
里的第一个匹配到的媒体查询,所以sizes
里的顺序是很重要的如果你没有指明
<img>
的宽度,浏览器也会正常解析。对sizes
精确设置,但是一个不是很确切的宽度也很好。比如挑选哪些图片资源放在
srcset
里是很困难的,我也没有完全掌握技巧。在上面的例子里,我设置了一个最小尺寸(注:原文中是最大)(689px
),然后给2x
设备设置刚才的两倍尺寸(1378px
)。另外两个设置是在这两个值中间任意取的。我没有设置更小的宽度比如320px
,因为在这一情况下的屏幕密度是2x
或者更高。srcset
+sizes
在 Chrome、Firefox和Opera中都兼容。至于其他浏览器,也会很安全地回退到src
属性。不用等待很久,WebKit nightly
和 下一个稳定版本的Edge
就会很好地支持它。案例
不同宽度、分辨率和艺术指导
和之前的例子类似除了框架的不同宽度的变化。它允许你集中精力对付更小的宽度。
<source>
<img>
<source>
元素上总是被服从的<img>
的<source>
会被使用,所以顺序很重要<source>
,则<img>
被调用<img>
必须出现在<source>
后面<source>
不支持src
,但是支持srcset
一旦
<source>
或者<img>
被选中,srcset
和sizes
属性就像之前的例子一样解析。<picture>
元素在Chrome、Firefox和Opera中兼容良好,在其他浏览器可以回退到<img>
。而下一代的Edge也可能会支持。--
案例
不同类型
这个方法可以让你有更优化的方式去提供给支持它们的浏览器。
type
属性是mime
类型type
和media
、srcset
甚至是sizes
取创建一些惊奇的东西它在Chrome、Firefox和Opera上兼容良好,其他浏览器还可以回退到
<img>
。案例
我的总结
x
方式,但是这种方法有缺点:1x
、2x
、3x
屏幕,这样 iPhone 可能加载一张2x
的图片,甚至以后还会加载出3x
、4x
的图片!w
方式就没有上面的问题了,一切都交给浏览器自动判断自动加载w
方式多了一层维度,可以更加精准地加载图片扩展阅读
希望上面的文章能够对各种用例起到参考作用,你可以继续看看下面的文章:
译者推荐文章
与本文结构类似的文章:
Google Developers
dev.opera
结构十分清晰补充文章: