zoukankan      html  css  js  c++  java
  • 回流 和 重绘

    回流

    就是页面布局发生变化。

    重绘

    就是节点需要更改外观而不会影响布局。

    和 Event Loop 的关系

    1. 回流 和 重绘 发生在 Event Loop 执行完微任务后,因为浏览器是 60Hz 的刷新率,每 16.6ms 才会更新一次。

    2. 然后判断是否有 resize 或者 scroll 事件,有的话会去触发事件,所以 resize 和 scroll 事件也是至少 16ms 才会触发一次,并且自带节流功能

    3. 更新css动画并触发对应事件

    4. 判断是否触发了 media query

    5. 判断是否有全屏操作事件

    6. 执行 requestAnimationFrame 回调

    7. 执行 IntersectionObserver 回调,该方法用于判断元素是否可见,可以用于懒加载上

    8. 更新界面

    9. 如果在一帧中有空闲时间,就会去执行 requestIdleCallback 回调。

    IntersectionObserver

    例如这样写,每次滚动到可以看到这个 img 元素时候,就会触发一次回调

    let ob = new IntersectionObserver(e => {
        console.log(e)
    })
    ob.observe(document.querySelectorAll('img')[0])

    observe 可以多次,回调的 e 是一个数组,根据 observe 的顺序返回对应的信息

    RequestIdleCallback

    例如这样写,调用 a() 后,浏览器会在空闲的时候 log 1

    function a() {
        console.log(1)
        requestIdleCallback(a)
    }

    优化渲染速度

    1. 用 transform 代替 top

    2. 用 visibility: hidden 代替 display:none

    3. 不要在循环里操作dom

    4. 不要使用 table 布局, 可能很小的一个小改动会造成整个 table 的重新布局

    5. JS动画实现的速度的选择,动画速度越快,回流次数越多,也可以选择使用 requestAnimationFrame

    6. CSS 选择符从右往左匹配查找,避免节点层级过多

    7. 将频繁重绘或者回流的节点设置为图层 ( will-change属性 和 video、iframe 标签)

    如何判断渲染性能

    查看 DOMContentLoaded 时间触发的时机。这个事件触发越早,说明渲染速度越快。

  • 相关阅读:
    redis几种模式的部署(Windows下实现)
    servlet容器:jetty,Tomcat,JBoss
    redis三种模式对比
    Linux expect详解
    expect学习笔记及实例详解
    shell expect的简单实用
    【Spring Boot】内嵌容器
    java 怎么让打印信息换行?
    Java中的静态方法是什么?
    java的接口为什么不能实例化
  • 原文地址:https://www.cnblogs.com/amiezhang/p/11450822.html
Copyright © 2011-2022 走看看