关于如何进行图片优化 - 适合的才是最好的

531 阅读2分钟

本文已参与「 新人创作礼 」活动,一起开启掘金创作之路

图片瘦身 ( 效果最好 )

  • webp 方案 ( webkit内核支持 )

  • 无损webp相比png减少26%大小

  • JD 采用自研 DPG

  • 参考文献  juejin.im/post/5dddf0…

  • ps : 建议采用WEBP方案, 支持webp图像的,都采用webp的方式加载,否则使用jpg或者其他。使用webp的后果,服务端需要对图片进行多备份。

  • 目前 taobao tmall JD 唯品会 都采用了 webp方案。

  • 去年6月份的图浏览器支持度

图片SEO ( 只针对SSR页面 )

  • alt、title 标签使用得当

渐进式图片显示优化  ( 图片来源互联网 )

  • 普通

  • 这种图片采用逐行扫描的方式,当图片较大或者网络下载速度较慢,那么就会看到图片被一行行加载的效果

  • 渐进式

  • 渐进式图片打开的过程中,会先显示整个图片的模糊轮廓,随着扫描次数的增加,图片变得越来越清晰

  • node npm 处理有

  • is-progressive-cli、imagemagick、graphicsmagick、gm

图片回流问题

  • 给图片设定一直的高度,以至于图片加载过程导致图片回流 ,指定图片骨架宽高、不回流。
  • 参考文献  juejin.im/post/5cfe1b… 回流的影响,图片大小改变会影响回流。

密度问题体验优化

  • 高密度屏幕上看起来会略微模糊,具有DPR 2的屏幕上加载2x尺寸的图像,在具有DPR 3的屏幕上加载3x图像并且在其他设备上加载普通图像1x尺寸的图像。

    <img class="img" src="imgbg-320.jpg" srcset="imgbg-320.jpg 320w, imgbg-360.jpg 360w, imgbg-480px.jpg 480w" sizes="(max-width: 480px) 480px, 320px" /> <picture> <source srcset="3.jpg" media="(min-width: 320px)"> <source srcset="2.jpg" media="(min-width: 480px)"> <img srcset="1.jpg"> </picture>

  • HTTP Client Hints

  • window.devicePixelRatio 获取DPR

  • 移动端DPR方案

  • flexible.js flexible会自动添加data-dpr属性在html里

参考文献 juejin.im/post/5b346e…

  • mixin.scss

    @mixin fixImage($path,$img) { [data-dpr="1"] & { background-image: url("#{$path}/x1/#{$img}"); background-repeat: no-repeat; } [data-dpr="2"] & { background-image: url("#{$path}/x2/#{$img}"); background-repeat: no-repeat; } [data-dpr="3"] & { background-image: url("#{$path}/x3/#{$img}"); background-repeat: no-repeat; } }

    @import '../../scss/mixin.scss'; .test { @include fixImage('../../assets','image.png'); }

懒加载方案

`<img v-img="`path`/img/a.(webp|jpeg)" />`
  • lazyload.js 懒加载方案

参考文献  juejin.cn/post/684490…

图片缓存&请求合并

  • pwa - sw ( service worker ) 仅https支持

  • CDN Prefetch

参考文献  www.jianshu.com/p/61298b51a…

  • 雪碧图 、icon-font、css

  • 雪碧图 ( 建议单个合成总大小200k之内 )

  • www.iconfont.cn/ iconfont 开源平台

  • css和css3制作简单的图标和动画(代替gif图片)

  • 随着技术的发展,css3可以实现的效果越来越多,比如箭头图标,三角形,梯形等图标,或者一些阴影效果,渐变的效果,所以可以用css制作一些简单的图标,而且具有多变性