wangning0/Autumn_Ning_Blog

图片的优化策略

Opened this issue · 0 comments

常规策略

  • 能不用图片就不用图片

    透明、边框、圆角、阴影、渐变都可以用css来实现,而且svg和canvas、iconfont等再主流浏览器中的支持非常高

  • 压缩

    • 简单压缩,利用在线图片压缩网站
    • 前端构建工具:gulp、webpack等
  • CDN部署、合理的缓存设置、多尺寸的支持

    • CDN的部署要求可以支持gzip的压缩
    • 针对不同的图片类型设置不同的浏览器缓存时间
    • 针对不同的设备尺寸、采用不同尺寸的图片大小
    • 针对不同的网络情况,图片的大小不同,但也意味着很有可能失真
  • 使用base64编码

    base64的编码都是按字符串长度,以每3个8bit的字符为一组,然后针对每组,首先获取每个字符的ASCII编码,然后将ASCII编码转换成8bit的二进制,得到一组3*8=24bit的字节,然后再将这24bit划分为4个6bit的字节,并在每个6bit的字节前面都填两个高位0,得到4个8bit的字节, 然后将这4个8bit的字节转换成10进制,对照Base64编码表,得到对应编码后的字符

    但是将图片转成Base64编码的话,内嵌在css或者HTML中,存在的问题是转换为Base64编码的体积比原图体积还要大,通常我们只将小雨8KB的图片转换为Base64

  • 合并精灵图

    可以减少请求数,但是一旦加载失败,所有的图片都会展示失败

  • 接入webP图片格式,减少带宽流量、加快图片加载速度

  • 渐进增强

    • 渲染一个div,通过对容器设置宽高使其比例和大小与最终图片的大小相同,避免图片加载出来的时候导致页面的重绘
    • 使用img标签来加载一张原图画质10%-20%左右的小图,由于体积小,所以可以较快的加载并显示
    • 小图加载完成之后,用canvas绘制高斯模糊透明覆盖在小图之上,同时请求最终要加载的大图
    • 最终大图加载完毕之后隐藏canvas

    费流量,适合wifi和有线网络,实现比较复杂

  • 按需加载

    懒加载实现

  • 请求失败占位图,并且有稍候自动重试功能

  • http2.0

    多路复用,头部压缩让图片并行加载更快