목차
啥是 Reflow 和 Repaint
Repaint
Reflow
Reflow 和 Repaint 都是浏览器慢的元凶
什么时候 Reflow 会触发
一些常用的提高性能的原则
布局
简写 CSS
优化 DOM
慎改 class
避免复杂动画
善用 display:none
批量更新元素
DEMO
避免大量 DOM 互相影响
性能永远比酷炫重要
웹 프론트엔드 HTML 튜토리얼 应该知道的前端性能二三事:Reflow 和 Repaint_html/css_WEB-ITnose

应该知道的前端性能二三事:Reflow 和 Repaint_html/css_WEB-ITnose

Jun 24, 2016 am 11:15 AM

移动 Web 前端开发,目前是火的不能再火了。到处都在招什么 H5 工程师、Hybrid App 开发工程师,主要负责的其实就是一些移动 Web 前端开发的工作。稍微有过一些前端经验的人都知道,手机上的开销比 PC 上要大的多,你在 PC 的模拟器上调试的很顺畅,等到手机上时,就会卡,这是为什么呢?其实这就是性能问题,有其他的开销占用了你的计算资源啦,那么是哪些开销占用了呢?抛开后端接口慢啊、网络状态差啊什么的不说,咱们今天聊聊浏览器本身的细节,Reflow 和 Repaint。尤其是在添加一些 CSS3 动画或者批量操作多个 DOM 元素的时候,Reflow 和 Repaint 的影响就会更加大。

啥是 Reflow 和 Repaint

Repaint

Repaint 就是「重绘」,它会在你改变 DOM 元素的视觉效果时进行,改变布局时不会触发。比如, opacity , background-color , visibility 和 outline 等都会触发,「重绘」的开销还是比较昂贵的,因为浏览器会在某一个 DOM 元素的视觉效果改变后去 check 这个 DOM 元素内的所有节点。

Reflow

Reflow 就是「回流」,它的影响更大。它会在某一个 DOM 元素的位置发生改变后触发,而且它会重新计算所有元素的位置和在页面中的占有的面积,这样的话将会引起页面某一个部分甚至整个页面的重新渲染。改变某一个元素会影响它所有的子节点 (children)、祖先节点 (ancestors) 及兄弟节点(siblings)。

Reflow 和 Repaint 都是浏览器慢的元凶

用户和Web页面都不能在 Reflow 和 Repaint 执行时做任何操作和响应,而且在极端的情况下,CSS 会拖慢 JS 的执行速度,这就是浏览器有的时候就是在操作之后没反应的原因之一。

什么时候 Reflow 会触发

Reflow 的开销更加昂贵,那么具体哪些时候会触发 Reflow?

  • 添加、删除或者改变 DOM 元素的可见性时:使用 JS 去改变 DOM 元素时会触发 Reflow。

  • 添加、删除或者改变 CSS 样式:直接改变 CSS Style 或者元素的 class 可能会影响布局,还有改变一个元素的宽度能够影响它所在的 DOM 节点中的所有元素,以及它周围的那些元素。

  • CSS3 动画(animation)和过渡(transition): 动画的每一 frame 都会触发 Reflow。

  • 使用 offsetWidth 和 offsetHeight:这一点很特别,你读一个 DOM 的 offsetWidth 和 offsetHeight 属性同样会触发一下 Reflow,因为这两个属性需要依赖一些元素去计算。

  • 用户交互:用户可以通过 hover 一下 a 链接,在 input 里面输入文字,拖动浏览器的大小,改变字体大小,更换样式表或者字体等都会触发 reflow。

一些常用的提高性能的原则

布局

不要用 inline style 或 table 布局, flexbox 布局也会给性能带来一些小困扰。 inline style 会在 html 下载完后进行一次额外的 Reflow,table布局的开销远比其他 DOM 元素的布局开销要大。 flexbox 的 item 会在 HTML 下载完成后改变尺寸。

简写 CSS

尽量简写 CSS,避免使用复杂的 CSS 选择器,使用 Unused CSS (https://unused-css.com/), uCSS (https://github.com/oyvindeh/ucss), gulp-uncss (https://github.com/ben-eb/gulp-uncss)可以有效的减少样式的定义和文件的大小。

优化 DOM

减少 DOM 的层级,减少 DOM 的数量,如果不需适配老浏览器,删掉一些无用的 wrapper 性质的 DOM 元素,总之越少越好。

慎改 class

在一个 DOM 树中,尽可能改那些没有特别多子元素 DOM 的 class,子元素少的可以改,多的不推荐。

避免复杂动画

删掉复杂的动画,运用动画的元素尽量是 position:absolute 或 position:fixed 的,这样会让他们脱离文档流,不去影响其他的元素。

善用 display:none

display:none 的元素不会引发 Reflow 和 Repaint,可以在让这些元素在 display 之前进行一些诸如颜色、尺寸什么的改变。

批量更新元素

比如下面这个例子会触发3次 reflow:

可以用这种方式来优化上面的代码:

此外,还可以在生成新 DOM 时可以使用 DOM fragment,然后先在内存中构建 DOM:

DEMO

再给大家看一个例子,下面有两个性能比较图,第一张是批量在页面插入1000个div,仅仅是div噢,第二张是一个个在页面插入1000个 div。这两种的性能差距在最新版 chrome 下居然都长达 1秒 之多,1秒啊亲们,还是最新版 chrome 啊,所以咱们在写 JS 的时候,不要再排脑袋了,我展示的这个还仅仅是纯 div,没有任何复杂嵌套,如果在正式的场景中,这种性能问题会放大数倍不止,一旦出现对你的产品简直是要命的事儿,不说了,乃们感受下吧。

批量更新,耗时 34ms,从图中可以看出,reflow 和 paint 各执行一次

分别更新,耗时 1118ms,从图中可以看出,一个叫 Parse HTML 的东西累积起来,使得总时间直接比批量上升了1000倍,这个 Parse HTML 实际上就是 Paint 和 Reflow 的结合体, Parse HTML 是 chrome 中的一个算法的名称。

避免大量 DOM 互相影响

比如 Tabs 这种场景,如果你点击一个 Tab 会显示它控制的区块,显示的那个区块会影响其他的区块,这样可能会引起 Reflow,因为它们的高度不一样,可以通过定个高度来优化这种场景。

性能永远比酷炫重要

记住一个原则,你网页的动画再牛逼,性能还是第一位的,如果每一帧移动1个像素会造成你的页面卡顿,那宁愿每一帧移动10像素让动画的帧变得迟钝一些,也不要让页面的性能降下来。

长按上图,关注猿猿相抱

本篇作者:常鸣

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

공식 계정 웹 페이지의 캐싱 업데이트에 어려움 : 버전 업데이트 후 사용자 경험에 영향을 미치는 이전 캐시를 피하는 방법은 무엇입니까? 공식 계정 웹 페이지의 캐싱 업데이트에 어려움 : 버전 업데이트 후 사용자 경험에 영향을 미치는 이전 캐시를 피하는 방법은 무엇입니까? Mar 04, 2025 pm 12:32 PM

공식 계정 웹 페이지 업데이트 캐시, 이것은 간단하고 간단하며 냄비를 마시기에 충분히 복잡합니다. 공식 계정 기사를 업데이트하기 위해 열심히 노력했지만 사용자는 여전히 기존 버전을 열었습니까? 이 기사에서는이 뒤에있는 비틀기와 회전을 살펴 보고이 문제를 우아하게 해결하는 방법을 살펴 보겠습니다. 읽은 후에는 다양한 캐싱 문제를 쉽게 처리 할 수있어 사용자가 항상 가장 신선한 콘텐츠를 경험할 수 있습니다. 기본 사항에 대해 먼저 이야기 해 봅시다. 액세스 속도를 향상시키기 위해 브라우저 또는 서버는 일부 정적 리소스 (예 : 그림, CSS, JS) 또는 페이지 컨텐츠를 저장합니다. 다음에 액세스 할 때 다시 다운로드하지 않고도 캐시에서 직접 검색 할 수 있으며 자연스럽게 빠릅니다. 그러나 이것은 또한 양날의 검입니다. 새 버전은 온라인입니다.

HTML5 양식 유효성 검사 속성을 사용하여 사용자 입력을 유효성있게하려면 어떻게합니까? HTML5 양식 유효성 검사 속성을 사용하여 사용자 입력을 유효성있게하려면 어떻게합니까? Mar 17, 2025 pm 12:27 PM

이 기사에서는 브라우저에서 직접 사용자 입력을 검증하기 위해 필요한, Pattern, Min, Max 및 Length 한계와 같은 HTML5 양식 검증 속성을 사용하는 것에 대해 설명합니다.

웹 페이지의 PNG 이미지에 뇌졸중 효과를 효율적으로 추가하는 방법은 무엇입니까? 웹 페이지의 PNG 이미지에 뇌졸중 효과를 효율적으로 추가하는 방법은 무엇입니까? Mar 04, 2025 pm 02:39 PM

이 기사는 CSS를 사용한 웹 페이지에 효율적인 PNG 테두리 추가를 보여줍니다. CSS는 JavaScript 또는 라이브러리에 비해 우수한 성능을 제공하며, 미묘하거나 눈에 띄는 효과를 위해 테두리 너비, 스타일 및 색상 조정 방법을 자세히 설명합니다.

HTML5의 크로스 브라우저 호환성에 대한 모범 사례는 무엇입니까? HTML5의 크로스 브라우저 호환성에 대한 모범 사례는 무엇입니까? Mar 17, 2025 pm 12:20 PM

기사는 HTML5 크로스 브라우저 호환성을 보장하기위한 모범 사례에 대해 논의하고 기능 감지, 점진적 향상 및 테스트 방법에 중점을 둡니다.

& lt; datalist & gt의 목적은 무엇입니까? 요소? & lt; datalist & gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:33 PM

이 기사는 HTML & LT; Datalist & GT에 대해 논의합니다. 자동 완성 제안을 제공하고, 사용자 경험을 향상시키고, 오류를 줄임으로써 양식을 향상시키는 요소. 문자 수 : 159

& lt; Progress & Gt의 목적은 무엇입니까? 요소? & lt; Progress & Gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:34 PM

이 기사는 HTML & lt; Progress & Gt에 대해 설명합니다. 요소, 그 목적, 스타일 및 & lt; meter & gt의 차이; 요소. 주요 초점은 & lt; progress & gt; 작업 완료 및 & lt; meter & gt; Stati의 경우

html5 & lt; time & gt; 의미 적으로 날짜와 시간을 나타내는 요소? html5 & lt; time & gt; 의미 적으로 날짜와 시간을 나타내는 요소? Mar 12, 2025 pm 04:05 PM

이 기사는 html5 & lt; time & gt; 시맨틱 날짜/시간 표현 요소. 인간이 읽을 수있는 텍스트와 함께 기계 가독성 (ISO 8601 형식)에 대한 DateTime 속성의 중요성을 강조하여 Accessibilit를 향상시킵니다.

& lt; meter & gt의 목적은 무엇입니까? 요소? & lt; meter & gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:35 PM

이 기사는 HTML & lt; meter & gt에 대해 설명합니다. 범위 내에 스칼라 또는 분수 값을 표시하는 데 사용되는 요소 및 웹 개발의 일반적인 응용 프로그램. & lt; meter & gt; & lt; Progress & Gt; 그리고 Ex

See all articles