看到这个标题,你需要先自问一下,一张图片是否真的达到了预期的效果?一个好的设计就是简单,而且总能拥有最好的性能。你可以去尽量除掉图片资源,因为相对于页面上的 HTML、CSS、JavaScript 或其他资源,图片通常占据了更大的字节,所以尽量要去除掉每一个图片资源,这永远是最好的优化策略。但是,一张合适位置的图片传达的信息比千言万语都要多,所以我们需要找到它们之间的平衡点。
所以,我们要开始考虑,是否存在另一种可以更有效地达到预期结果的技术:
如果你想要把文本编码到图片本身上,请三思。好的排版对于好的设计、品牌和可读性来说是至关重要的,但是图片上的文字对于用户体验是很糟的:文本不可选择、不可搜索、不可缩放、不可访问,对高 DPI 的设备也非常不友好。虽然 web font 的使用需要走自己的一套优化流程,但是 web font 解决了上述这些所有问题,并且永远是显示文本的最好选择。
如果你确定图片是最终的正确的选择,你学要谨慎地选择正确的图片类型。
矢量图像和栅格图像每个格式都有它们自己的优缺点。矢量格式非常适合包含简单几何形状(例如徽标,文本或图标)的图像。它在每种分辨率和缩放下都能保持清晰,这使得它成为了有高分辨率屏幕和不同屏幕尺寸需求的产品的首选。
但是,遇到复杂场景时,矢量图形也有短板,例如:一张图片,它可能用了大量的SVG 标记来描述目标图形,但是看起来依然不是很“逼真”。当这种情况下,你可能就需要使用 PNG、JPEG或 WebP 格式了。
栅格图像没有像矢量图形那样的缩放无关的特性,当你对它进行缩放时,你可能会看到锯齿和模糊的图形。为了解决这个问题,你就需要给用户准备多张不同分辨率的版本,以便在不同分辨率下展示。
有两种不同的像素:CSS 像素和设备像素。一个CSS 像素可能对应了一个或多个设备像素。这么做的意义是什么呢?设备像素越多,屏幕上显示的内容细节就越丰富精细。
css像素 vs 设备像素高 DPI(HiDPI) 的屏幕能呈现更漂亮的结果,但是这也有一个明显的问题:为了更好地利用更高的设备像素,图像内容也需要添加更多细节。好消息是,矢量图形非常适合用来解决这个问题,因为它们可以在任何分辨率下得到相同清晰的结果。为了渲染更精细的细节,你也需要付出更高的性能成本,但是,你不再需要单独适配那些设备和不同分辨率。
从另一个角度说,栅格图形正面临着巨大的挑战,因为它们是安装像素对图像进行编码的,因此,像素数量越大,图像文件的越大。例如,我们思考一下在 100x100 CSS像素上图片大小的区别:
屏幕分辨率 | 总像素 | 未压缩大小 (4字节每像素) |
---|---|---|
1x | 100 x 100 = 10,000 | 40,000 bytes |
2x | 100 x 100 x 4 = 40,000 | 160,000 bytes |
3x | 100 x 100 x 9 = 90,000 | 360,000 bytes |
当我们使用两倍分辨率的屏幕时,总的像素数量增加了 4 倍:两倍数量的竖直方向像素,两倍数量的水平方向像素。因此,“2x”屏幕并非只是两倍,而是四倍像素!
那么,这在实践时有什么意义呢?高分辨率屏幕能够提供美丽的图像,这可能是一个伟大的功能。但是,高分辨率屏幕也意味着需要高分辨率图像,因此:
除了不同的有损和无损压缩算法,不同的图像格式支持不同的特性,如动画和透明度(alpha)。因此,为特定图像选择正确的格式是需要 期望的结果 和 功能需求 相结合的。
格式 | 透明 | 动画 | 浏览器支持 |
---|---|---|---|
PNG | 是 | 否 | 所有 |
JPEG | 否 | 否 | 所有 |
WebP | 是 | 是 | 所有现代浏览器.点此查询 |
这里有两个普遍支持的栅格图像格式:PNG和 JPG。此外,现代浏览器还支持更新的 WebP 格式,它提供了压缩和其他更多特性。那么,我应该选择哪个呢?
WebP 格式相较于老格式提供了更好的压缩特性,应该尽可能地使用。你可以将 WebP 和其他一种图像格式一起使用,详情参见:使用WebP图像。
对于旧格式,可以思考以下问题:
标签
文件更大。详情参考Replace animated GIFs with video。最后,如果你在使用 WebView 来呈现特定于平台的应用程序中的内容,那么你可以完全控制客户端,那么你可以直接单独使用 WebP!Facebook 和许多其他公司都已经在他们的应用程序的所有图片使用 WebP 格式,相较于节省下来的费用,这绝对是值得的。
图片占用了一个页面的绝大部分体积,所以选择正确的图片类型和格式对页面的优化是最大的,图片的优化也是性能优化中最被关注的点。这篇文章介绍的是图片优化最基础的部分,也就是选择正确类型的图片,这个优化最容易做并且效果也很直观(体积的变化)。
文章还介绍了什么是 CSS 像素和设备像素,自从苹果推出了视网膜屏后,设备像素也成为了前端必须了解的点。它也造成了另一个老生常谈的问题:如何生成 1px 线,看了这篇文章一定就理解了为什么 1px 线会出现问题。
最后普及了一下 png 和 jpg 的区别,并给出了选择建议,并推行了一下 webP 格式。如果你的项目需要适配老浏览器,那可以尝试一下兼容模式,若只需要适配现代浏览器,那你完全可以尝试一下!
关于 webfont 的推荐文章
关于 1 px 线的推荐文章