前端进阶版本 ,性能优化—-防抖、节流、重绘与回流

这篇具有很好参考价值的文章主要介绍了前端进阶版本 ,性能优化—-防抖、节流、重绘与回流。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

【防抖】

【节流】

重绘(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);
      };
    }

前端进阶版本 ,性能优化—-防抖、节流、重绘与回流,前端,性能优化


 

重绘(repaint)

当元素样式的改变不影响布局时,浏览器将使用重绘对元素进行更新,此时由于只需要 UI 层面的重新像素绘制,因此损耗较少。
常见的重绘操作有:

  • 改变元素颜色改变
  • 元素背景色
  • more ……

回流(reflow):又叫重排(layout)

当元素的尺寸、结构或者触发某些属性时,浏览器会重新渲染页面,称为回流。此时,浏览器需要重新经过计算,计算后还需要重新页面布局,因此是较重的操作。
常见的回流操作有:

  • 页面初次渲染
  • 浏览器窗口大小改变
  • 元素尺寸/位置/内容发生改变
  • 元素字体大小变化
  • 添加或者删除可见的 DOM 元素
  • 激活 CSS 伪类(:hover……)
  • more ……

重点:回流必定会触发重绘,重绘不一定会触发回流。重绘的开销较小,回流的代价较高。

前端进阶版本 ,性能优化—-防抖、节流、重绘与回流,前端,性能优化

工作中要如何避免大量使用重绘与回流?

  • 避免频繁操作样式,可汇总后统一一次修改
  • 尽量使用 class 进行样式修改,而不是直接操作样式
  • 减少 DOM 的操作,可使用字符串一次性插入

以下资料来自于 https://juejin.im/post/5e096d63e51d4558381e9906#heading-29

常见的会导致回流的元素

  • 常见的几何属性有 width、height、padding、margin、left、top、border 等等。
  • 最容易被忽略的操作:获取一些需要通过即时计算得到的属性,当你要用到像这样的属性:offsetTop、offsetLeft、 offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、clientTop、clientLeft、clientWidth、clientHeight 时,浏览器为了获取这些值,也会进行回流。
  • 当我们调用了 getComputedStyle 方法,或者 IE 里的 currentStyle 时,也会触发回流。原理是一样的,都为求一个“即时性”和“准确性”。

避免方式:

  • 避免逐条改变样式,使用类名去合并样式
  • 将 DOM “离线”,使用DocumentFragment
  • 提升为合成层,如使用will-change
#divId {
  will-change: transform;
}

优点:

  • 合成层的位图,会交由 GPU 合成,比 CPU 处理要快
  • 当需要 repaint 时,只需要 repaint 本身,不会影响到其他的层
  • 对于 transform 和 opacity 效果,不会触发 layout 和 paint

注意:
部分浏览器缓存了一个 flush 队列,把我们触发的回流与重绘任务都塞进去,待到队列里的任务多起来、或者达到了一定的时间间隔,或者“不得已”的时候,再将这些任务一口气出队。但是当我们访问一些即使属性时,浏览器会为了获得此时此刻的、最准确的属性值,而提前将 flush 队列的任务出队。


原文链接:https://blog.csdn.net/jiepan9178/article/details/104264816文章来源地址https://www.toymoban.com/news/detail-630385.html

到了这里,关于前端进阶版本 ,性能优化—-防抖、节流、重绘与回流的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 节流防抖:提升前端性能的秘密武器(上)

    🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入

    2024年02月04日
    浏览(39)
  • 【JS进阶】防抖与节流

    1.防抖 1.1 为什么要防抖? 在项目中,有的操作是 高频触发 的,但是其实触发一次就好了,比如我们短时间内多次缩放页面,那么我们不应该每次缩放都去执行操作,应该只做一次就好。再比如说监听输入框的输入,不应该每次都去触发监听,应该是用户完成一段输入后再进

    2024年02月09日
    浏览(41)
  • 前端刷题-防抖节流

    在实际的开发过程中,一般会使用lodash自有的debounce函数和throttle函数对所要防抖/节流的函数进行包裹。例如

    2024年02月10日
    浏览(42)
  • 【前端】防抖和节流原理+实现

    防抖(Debounce)和节流(Throttle)都是用于控制函数执行频率的机制,它们在处理高频触发的事件时非常有用。 防抖的原理是在事件被触发后,等待一段时间(例如200毫秒)来执行函数,如果在等待时间内事件被再次触发,则重新计时。这样可以避免在短时间内多次触发事件

    2024年04月16日
    浏览(36)
  • 前端解决按钮重复提交数据问题(节流和防抖)

    🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿 🍟欢迎来到前端初见的博文,本文主要讲解在工作解决按钮重复提交数据问题(节流和防抖) 👨‍🔧 个人主页 : 前端初见 🥞喜欢的朋友可以关注一下,下次更新不迷路🥞 当我们在页面进行点点点的操作时,很可能遇到点击两次的行为,

    2024年02月09日
    浏览(70)
  • 前端常见面试题之防抖、节流、xss、xsrf

    输入URL :在浏览器的地址栏中输入要访问的网站的URL(统一资源定位符)。 DNS解析 :浏览器会将URL发送给DNS服务器,DNS服务器负责将URL解析为对应的IP地址。 建立TCP连接 :浏览器会根据解析得到的IP地址,使用TCP(传输控制协议)与服务器建立连接。 发起HTTP请求 :TCP连接

    2024年01月19日
    浏览(44)
  • 了解防抖和节流:提升前端交互体验的实用策略

    本文将重点介绍前端性能优化方法之一的防抖和节流。首先解释了它们的概念和原理,然后探讨了它们在前端开发中的应用场景,如输入框搜索、滚动事件等。最后,通过简单的代码示例展示了如何实现防抖和节流函数。通过学习和应用这两种技术,我们可以有效地减少不必

    2024年02月05日
    浏览(38)
  • 前端面试题-js-new关键字-this指向-js事件流-防抖节流

    1.创建一个简单的空对象 2.原型的绑定,确定对象O的原型链 3.绑定this对象为O,传入参数;执行Person构造函数,进行属性和方法的赋值操作 4.返回结果 普通函数的this指向 函数的this指向有一个基本的原则,谁调用的函数,函数的this就指向谁,否则指向全局 箭头函数的this指向

    2024年01月25日
    浏览(48)
  • 前端性能优化进阶版

    1、使用 Web Workers 和 Service Workers 来提高并行性和离线缓存。 使用 Web Workers 和 Service Workers:可以使用 Web Workers 将计算密集型任务放到其他线程中执行,以避免卡顿和阻塞 UI 线程。Service Workers 可以用于缓存网页资源以提高加载速度和离线访问能力。 2、使用 HTTP/2 来减少请求

    2023年04月27日
    浏览(30)
  • AI绘图:Stable Diffusion ComfyUI局部重绘与智能扩图全面教程

    在数字艺术创作中,局部重绘和智能扩图是两个非常重要的功能。局部重绘允许我们在保留原有图像的基础上,对特定区域进行修改或创新。而智能扩图则能够帮助我们在图像的边缘添加新的元素,从而扩展图像的内容。本文将详细介绍如何在Stable Diffusion ComfyUI中实现这两个

    2024年04月12日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包