「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战」
一、前端兼容性
问题一:IE6下margin值双倍边距问题 问题表现:IE6下元素浮动之后margin值变成双倍 解决方法:将元素转为行内属性
{
display: inline;
}
问题二:height值设置过小问题 问题表现:IE6、IE7下设置标签高度小于10px,存在超出已设置的高度的问题 解决方法:为超出高度的元素添加溢出部分隐藏
{
overflow: hidden;
}
问题三:图片元素img下默认有间距 问题表现:IE6下图片元素img出现多余空白 解决方法:图片使用float属性
问题四:opacity多浏览器透明度兼容问题 问题表现:opacity是css3里的属性,只有部分浏览器支持 解决方法:使用各个浏览器的私有属性以支持opacity
{
filter: alpha(opacity=50);/*IE*/
-moz-opacity: 0.5;/*老版Mozilla*/
-khtml-opacity: 0.5;/*老版Safari*/
opacity: 0.5;
}
#####二、前端性能优化 ==网络方面==: 1、减少http请求
- 合并js文件
- 合并css文件
- 使用雪碧图(css sprite)
合并文件可以使用webpack之类的打包工具进行打包
2、减少资源体积
- gzip压缩
- js混淆
- css压缩
- 图片压缩(png)
gzip压缩主要是针对html文件来说的,它可以将html中重复的部分进行一个打包,多次复用的过程,好处:一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间。 js的混淆可以有简单的压缩(将空白字符删除)、丑化(丑化的方法,就是将一些变量缩小)、或者可以使用php对js进行混淆加密,工具是==uglify==。 css压缩,就是进行简单的压缩。 图片的压缩,主要也是减小体积,在不影响观感的前提下,尽量压缩图片,使用png等图片格式,减少矢量图、高清图等的使用。这样子的做法不仅可以加快网页显示,也能减少流量的损耗。
3、缓冲
- DNS缓存
- CDN部署与缓存
- http缓存
DNS预解析
<link rel="dns-prefetch" href="//hm.baidu.com">CDN缓存,CDN作为静态资源文件的分发网络,本身就已经提升了,网站静态资源的获取速度,加快网站的加载速度,同时也给静态资源做好缓存工作,有效的利用已缓存的静态资源,加快获取速度。 http缓存,也是给资源设定缓存时间,防止在有效的缓存时间内对资源进行重复的下载,从而提升整体网页的加载速度。
4、移动端优化
- 使用长cache,减少重定向
- 首屏优化,保证首屏加载数据小于14kb
- 不滥用web字体
「使用长cache」,可以使得移动端的部分资源设定长期缓存,这样可以保证资源不用向服务器发送请求,来比较资源是否更新,从而避免304的情况。304重定向,在PC端或许并不会影响网页的加载速度,但是,在移动端网络不稳定的前提下,多一次请求,就多了一部分加载时间。 「首屏优化」,对于移动端来说是至关重要的。2s时间是用户的最佳体验,一旦超出这个时间,将会导致用户的流失。所以,针对移动端的网络情况,不可能在这么短时间内加载完成所有的网页资源,所以我们必须保证首屏中的内容被优先显示出来,而且基于TCP的慢启动和拥塞控制,第一个14kb的数据是非常重要的,所以需要保证首部加载数据能够小于14kb。
==渲染和DOM操作方面== 1、优化网页渲染
- css的文件放在头部,js文件放在尾部或者异步
- 尽量避免内联样式
css文件放在「头部加载」,可以保证解析DOM的同时,解析css文件。因为,CSS(外链或内联)会阻塞整个DOM的渲染,然而DOM解析会正常进行,所以将css文件放在头部进行解析,可以加快网页的构建速度。假设将其放在尾部,那时DOM树几乎构建,这时就得等到CSSOM树构建完成,才能够继续下面的步骤。 「js放在尾部」:js文件不同,将js文件放在尾部或者异步加载的原因是JS(外链或内联)会阻塞后续DOM的解析,后续DOM的渲染也将被阻塞,而且一旦js中遇到DOM元素的操作,很可能会影响。
2、DOM操作优化
- 减少DOM操作(减少回流和重绘)
- 使用classname代替内联样式修改
- 使用事件委托
- 函数防抖和函数节流
「使用事件代理」:往往对于具备冒泡性质的事件来说,使用事件代理不失为一种好的方法。举个例子:一段列表都需要设定点击事件,这时如果你给列表中的每一项设定监听,往往会导致整体的性能下降,但是如果你给整个列表设置一个事件,然后通过点击定位目标来触发相应的操作,往往性能就会得到改善。
介绍:函数防抖,当调用动作过n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间;函数节流,预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执行该动作,然后进入下一个新周期。
==数据方面== 1、图片加载处理
- 图片预加载(提前加载)
- 图片懒加载
- 首屏加载时进度条的显示
常见的图片懒加载的方式就是:在最初给图片的src设置一个比较简单的图片,然后将图片的真实地址设置给自定义的属性,做一个占位,然后给图片设置监听事件,一旦图片到达视口范围,从图片的自定义属性中获取出真是地址,然后赋值给src,让其进行加载。
2、异步请求的优化
- 使用正常的json数据格式进行交互
- 部分常用数据的缓存
- 数据埋点和统计
「JSON交互」,JSON的数据格式轻巧,结构简单,往往可以大大优化前后端的数据通信。 「常用数据的缓存」,可以将一些用户的基本信息等常用的信息做一个缓存,这样可以保证ajax请求的减少。同时,HTML5新增的storage的内容
window.localStorage,也不用怕cookie暴露,引起的信息泄漏问题。
localStorage 的使用 (增删改查)
//因为某些浏览器还不支持localStorage,所以可以先做判断
if(!window.localStorage){
alert("浏览器不支持localStorage!请使用高版本的Chrome或者Firefox");
return false;
}else{
//业务逻辑
}
//1、添加本地存储( 有三种方法,但是推荐使用 setItem() )
var storage = window.localStorage;
storage["a"] = 1; //方法一
storage.b = 2;//方法二
storage.setItem("c", 3);//方法三 推荐
// 2、获取本地存储(有三种方法,推荐使用getItem())
var storage = window.localStorage;
storage.a //1
storage["b"];//2
storage.getItem("c"); //3
//3、修改本地存储
storage.a =4;
storage.a; // 4
// 4、 删除本地存储
清除所有内容: storage.clear();
清除某个键值:storage.removeItem("a");
其他需要注意的:
我们一般会将JSON存入localStorage ,需要将JSON格式的数据转化为string类型,需使用 JSON.stringify();
读取之后要将JSON字符串转化成JSON对象,使用JSON.parse();
注:其他类型的也需要转化为string,这里就不再介绍了,下面只介绍了JSON转化为string
var storage=window.localStorage;
var data={
name:'user',
sex:'female',
age:18
};
var d=JSON.stringify(data);//将json格式转化为字符串
storage.setItem("data",d);//添加缓存
var json=storage.getItem("data");//获取缓存
var jsonObj=JSON.parse(json);//将JSON字符串转换成为JSON对象输出
console.log(typeof jsonObj);