目录
【防抖】
【节流】
重绘(repaint)
回流(reflow):又叫重排(layout)
工作中要如何避免大量使用重绘与回流?
常见的会导致回流的元素
任务频繁触发的情况下,只有任务触发的间隔超过指定间隔的时候,任务才会执行。
/**
* 防抖函数
* @author vision
* @param {执行函数} fn
* @param {延迟} delay
*/
export function debounce(fn, delay) {
let timer = null;
return function() {
let context = this;
let arg = arguments;
clearTimeout(timer);
timer = setTimeout(function() {
fn.apply(context, arg);
}, delay);
};
}
/**
* 防抖函数 - 箭头函数
* @param {执行函数} fn
* @param {延迟} delay
*/
export const debounceEs6 = (fn, delay) => {
let timer = null;
return (...rest) => {
clearTimeout(timer);
timer = setTimeout(() => {
fn(rest);
}, delay);
};
};
指定时间间隔内只会执行一次任务。
function throttle(fn) {
// 通过闭包保存一个标记
let canRun = true;
return function() {
// 在函数开头判断标志是否为 true,不为 true 则中断函数
if(!canRun) {
return;
}
// 将 canRun 设置为 false,防止执行之前再被执行
canRun = false;
// 定时器
setTimeout( () => {
fn.call(this, arguments);
// 执行完事件(比如调用完接口)之后,重新将这个标志设置为 true
canRun = true;
}, 1000);
};
}
当元素样式的改变不影响布局时,浏览器将使用重绘对元素进行更新,此时由于只需要 UI 层面的重新像素绘制,因此损耗较少。
常见的重绘操作有:
当元素的尺寸、结构或者触发某些属性时,浏览器会重新渲染页面,称为回流。此时,浏览器需要重新经过计算,计算后还需要重新页面布局,因此是较重的操作。
常见的回流操作有:
重点:回流必定会触发重绘,重绘不一定会触发回流。重绘的开销较小,回流的代价较高。
以下资料来自于 https://juejin.im/post/5e096d63e51d4558381e9906#heading-29
避免方式:
#divId {
will-change: transform;
}
优点:
注意:
部分浏览器缓存了一个 flush 队列,把我们触发的回流与重绘任务都塞进去,待到队列里的任务多起来、或者达到了一定的时间间隔,或者“不得已”的时候,再将这些任务一口气出队。但是当我们访问一些即使属性时,浏览器会为了获得此时此刻的、最准确的属性值,而提前将 flush 队列的任务出队。
原文链接:https://blog.csdn.net/jiepan9178/article/details/104264816