当前位置: 首页 > news >正文

前端性能优化之优化图片 优化显示图片

  前端图片优化一直以来都是热门话题,从需求上来看,很多站点往往是图片体积大于代码体积, 图片请求多余代码文件请求, 给前端的性能带来了很大的困扰,那么应该如何解决呢? 

 

零、 认识图片

  我们通常使用的图片就是gif、png和jpg了。 

  其中,gif格式是比较老的图片格式,它的色彩效果最低(就是不清楚!!!),如果想要使用gif保存鲜艳图片会让你的网站看上去非常可怕。 但是gif有着不可忽视的优点体积小、有着极好的压缩效果,支持动画,并且支持透明效果,虽然这个透明没有PNG格式图片支持的强大。。。 动画选择gif没有错,如果你的图片只有单调的色彩, 没有渐变色,例如只有红蓝两色,那么选择gif就再好不过了。 

  另外,PNG图片可以说是最适合网络的图片了,优点就是 无损压缩,压缩比率很高, 可渐变透明, 几乎具备所有GIF的优点, 缺点是不如JPG格式的颜色色彩丰富, 同样的图片体积也比JPG略大,但是PNG图片应该是网站设计上最为推广的,比如Google就是一个很好的例子,它的所有站点中几乎都是使用的PNG格式, 而且8位的PNG完全可以替代掉GIF。 

  各方面比较:

大小比较:通常地,PNG ≈ JPG > GIF
透明性:PNG > GIF > JPG
色彩丰富程度:JPG > PNG >GIF
 
兼容程度:GIF ≈ JPG > PNG
 
 

 

一、雪碧图

  即css sprites, 就是把很多小图片制作成一个大图,然后作为背景图片使用,定位即可。

  优点: 很明显: 减少了大量的http请求。

  缺点: 背景定位较为麻烦,其实不算缺点。

 

二、图片压缩

  图片压缩是很简单的,就是无损压缩了。 

  1. 优先使用png而不是GIF
  2. 压缩png
  3. 去掉jpg的metadata
  4. 压缩gif动画
  5. 尝试使用png8
  6. 避免使用AlphaImageLoader
  7. 压缩动态生成的图像
  8. 使 favicon 更小,可缓存
  9. 使用css sprites 

 

三、base64

  base64编码的大小比原图大小更大一些,但是可以减少http请求。

 

 

四、响应式图片

  一般我们对于图片的设定方法都是设置图片为width: 100%, 但是如果加载的图片的实际尺寸很大,而我们所需要的很小,那么不可避免的就会造成浪费, 所以这时就可以使用响应式图片。 

  主要用到的属性就是 srcset 和 sizes 属性。 

 

  

 

五、延迟加载

假设我的网页很长很长,图片很多很多(比如多图慎点那种),但是我可能看了一下就没兴趣了,那是不是完全没有必要加载后面的图片了,这个时候就要有一个延迟加载的思想。

图片延迟加载也称懒加载,通常应用于图片比较多的网页,如果一个页面图片比较多,且页面高度或宽度有好几屏,页面初次加载时,只显示可视区域的图片(非可视区域图片使用1*1的图片占位,图片大小css控制),当页面滚动的时候,图片进入了可视区域再进行加载(修改src),这样可以显著的提高页面的加载速度,更少的图片并发请求数也可以减轻服务器的压力。如果用户仅仅在首屏停留,还可以节省流量。具体的实现方法可以看一个插件,就叫lazeload。

 

 

六、 图标字体

用过bootstrap的同学肯定对方便的fontawesome图标字体印象深刻,可以无损放大缩小,可以修改颜色,只要加个类名就可以使用图标,感觉是不是很爽?。优势呢。。。矢量&方便好用,不过图标没有一定的量可能不大需要,而且矢量图可能美工压力也比较大,我们只要知道怎么用就行啦,有的时候用现成的图标减轻一下美工同学的工作量也是极好的。可以看一下一个专门用来做图标字体的网站。

 

 

七、 SVG

 

svg作为矢量图,和iconfont对比起来优势可能就是字体可能在样式修改方面受限较多,其次字体文件一般都弄的挺大的,然后兼容性差点。svg也可以认为就是图片,使用方法也很简单。

1.直接作为图片文件引入

<img src=“gblogo.svg” onerror=“this.onerror=null; this.src=”gblogo.png“”>
//or css 
background:url(gblogo.svg)

2.将svg代码拷到html文件里

<g class=“logo” transform=“translate(0.000000,500.000000) scale(0.100000,-0.100000)” fill=“#000000” stroke=“none”>
//本质上还是一个标签,可以定义样式
.logo:hover{
    fill: #F08000;}

 

 

 

图片显示优化

  背景:最近所做的项目中,类似于饿了么这样的平台,就是相对简单一些,并且,对于每一件商品,都有一个详情页,必须要进入这个详情页,才能加载一个很大的图片来展示图片详情。

  问题:由于图片比较大, 所以下载的过程会比较慢,所以出现的情况就是,刚开始只显示一个背景层,紧接着图片开始一点一点的加载出来,而不是完全加载出来(恩,学过计算机网络的同学应该是知道原因的), 这样的用户体验并不是很好。

  改进方案: 首先,固定图片外层div的高度和宽度,然后img设置为100%(宽高都是如此),背景颜色要有,这样,即使没有显示出来,也是可以看得。重要,设置图片的 onload 事件,首先要设置图片为display: none; 然后当图片onload之后,我们再将之加载出来,并且加载时透明度可以是一个递增的过程。 代码大致如下(vue项目写的):

 <img src="picture" alt=""  style="display: none;" v-on:load="getSomething($event)" >

 

  js如下:

getSomething (e) {
        var target = e.currentTarget;
        target.style.opacity = 0;
        target.style.display = 'block'
        var timer = setInterval(function () {
          target.style.opacity = parseFloat(target.style.opacity) + 0.01;
          if (parseFloat(target.style.opacity) >= 0.98) {
            clearInterval(timer);
          }
        }, 30);
      }

 

  这样,图片的显示就是一个动态的过程, 也不会有视觉上的突变,看着会比较舒服。

 

 

 

 

 

 

  

相关文章:

  • Java中的重写
  • [BZOJ 3531][Sdoi2014]旅行(树链剖分+线段树)
  • TeamCity 2017.1.2 发布,持续集成工具
  • 微软:请叫我 Android 预装服务提供商
  • arcgis engine 获取高亮Feature、element
  • Java -- JDBC 学习--PreparedStatement
  • Vijos P1303 导弹拦截【最长上升子序列+DP】
  • Ta-Lib用法介绍 !
  • 负载均衡方案对比表
  • select标签中option内容加链接
  • kibana创建新的index patterns
  • 使用docker搭建android源码编译环境
  • 使用Android Studio运行NDK程序
  • Foreman 1.15.1 发布,数据中心生命周期管理工具
  • C学习-枚举(九)
  • SegmentFault for Android 3.0 发布
  • [笔记] php常见简单功能及函数
  • docker python 配置
  • eclipse的离线汉化
  • Electron入门介绍
  • IndexedDB
  • iOS 颜色设置看我就够了
  • Javascript设计模式学习之Observer(观察者)模式
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • mysql常用命令汇总
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • TypeScript迭代器
  • 给新手的新浪微博 SDK 集成教程【一】
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 将 Measurements 和 Units 应用到物理学
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 深入浅出Node.js
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 算法---两个栈实现一个队列
  • 我建了一个叫Hello World的项目
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​批处理文件中的errorlevel用法
  • #DBA杂记1
  • #HarmonyOS:基础语法
  • #LLM入门|Prompt#3.3_存储_Memory
  • #NOIP 2014# day.2 T2 寻找道路
  • $refs 、$nextTic、动态组件、name的使用
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (六)激光线扫描-三维重建
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)Oracle存储过程编写经验和优化措施
  • .bashrc在哪里,alias妙用
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .net CHARTING图表控件下载地址
  • .net 无限分类
  • .net程序集学习心得