懒加载也叫延迟加载,按需加载,指在长网页中延时加载图片数据,是一种比较好的网页性能优化的方式。在比较长的网页或应用中,如果图片加载很多,所有图片都加载出来,而用户只能看到可是窗口的那一部分图片,这样就浪费性能。
图片的加载是由src引起的,当对src赋值时,浏览器会请求图片资源,根据这个原理,我们使用HTML5 的data-xxx属性来存储图片路径,在需要加载图片的时候,会将data-xxx中的图片路径赋值给src,这样就实现了图片的按需加载,即懒加载
(1)回流(也叫重排)
当渲染树中部分或者全部元素的尺寸,结构或者属性发生变化时,浏览器会重新渲染部分或者全部文档过程称为回流
下面这些操作会导致回流:
在触发回流(重排)的时候,由于浏览器渲染页面是基于流式布局的,所以当触发回流时会导致周围的DOM元素重新排列,它的影响范围有两种:
(2)重绘
当页面中某个元素的样式发生变化,但是不会影响其在文档流中的位置时,浏览器会对元素进行重新绘制,这个过程就叫重绘
下面的操作会导致重绘
注意:当触发回流时,一定会触发重绘,但是重绘不一定引发回流
table布局,一个小的改动可能会使整个table进行重新布局documentFragment,在它上面应用所有DOM操作,最后把它添加到文档中防抖函数的应用场景
节流函数的应用场景
防抖函数的实现
function debounce(fn, wait) {
// 首先定义一个定时器
let timer = null;
// 返回一个函数
// 使用闭包能保存变量的值
return function () {
// 获取参数
const args = arguments
console.log(timer)
// 如果再次触发,先判断定时器状态
timer && clearTimeout(timer)
// 定时器
timer = setTimeout(() => {
// this 表示调用debounce()的对象
fn.apply(this, args)
timer = null
}, wait)
}
}
使用方法一
document.getElementById("click").addEventListener("click", debounce(callback, 1000))
使用方法二
const debounceFn = debounce(callback, 1000)
document.getElementById("click").addEventListener("click", function(e) {
debounceFn(e)
})
注意: 不能把 debounce防抖函数放在 监听事件的回调函数里面 否则每次会生成多个防抖函数,不能实现防抖功能
// 注意:这是错误的调用
document.getElementById("click").addEventListener("click", function(e) {
debounce(callback, 1000)(e)
})
节流函数的实现
function throttle(fn, wait) {
// 获取当前时间戳
let currentTime = Date.now()
// 使用闭包
return function () {
// 获取参数
const args = arguments
// 获取调用时的时间戳
let nowTime = Date.now()
// 判断条件
if(nowTime - currentTime >= wait) {
// 执行回调函数
fn.apply(this, args)
currentTime = Date.now()
}
}
}
使用方法
window.addEventListener('resize', throttle(resize, 1000))