渲染性能:读写style对渲染过程的影响

前端性能优化---样式计算 重绘-样式计算也会导致性能问题? 阅读详情

读写style对渲染过程的影响

一直都说操作DOM性能很差,那么为什么差呢?读写style会给性能造成什么影响?本文作为渲染性能的第一篇(从发布时间来看)其实不太合适,第一篇应该先和大家简单介绍浏览器对于页面的渲染过程,后面会补上,恰好今天写了一些读写style的demo,于是提前写了这篇博客。

参考:全部来源于Google最新web的开发者文档:

浏览器是如何渲染每一帧的
如何使用timeline

关于timeline的简单使用,可以参考之前的一篇文章:

前端性能优化利器:Chrome Timeline学习及实践

实验过程

实验过程非常简单:操作元素的style,然后通过timeline观测渲染过程发生了什么变化。

<!DOCTYPE html>
<html>
<head>
    <title>demo</title>
    <style type="text/css">
        .s-1 .read:nth-child(1) {
            width: 500px;
            background-color: green;
        }
        .s-1 .read:nth-child(2) {
            width: 300px;
            background-color: blue;
        }
        .s-1 .read:nth-child(3) {
            width: 100px;
            background-color: red;
        }
    </style>
</head>
<body>
    <section class="s-1">
        <div class="read">A: test to see what happen</div>
        <div class="read">B: test to see what happen</div>
        <div class="read">C: test to see what happen</div>
    </section>
    <script type="text/javascript">
        // 这里style的改变特指几何属性(width,height),位置属性(margin...)的改变,不包括(opacity,color...)
        window.onload = () => {
            // 确保在合适的时候执行(关于requestAnimationFrame会在之后再写一篇文章来介绍)
            requestAnimationFrame(()=>{
                let divs = document.querySelectorAll('section .read');
                let [a, b, c] = divs;
                // 结论一:连续读取同一个元素的高宽(多次读取也一样)只会触发一次layout,底层应该调用了getBoundingClientRect()
                // const width = a.offsetWidth;
                // const height = a.offsetHeight;
                // 等同于上面
                // a.getBoundingClientRect();   

                //结论二:连续读取不同元素的高宽,只会触发一次layout,底层在layout的时候应该算出了所有元素的位置,下次再读取(没有写入的前提下)不会触发新的layout
                // const sizeA = a.getBoundingClientRect();
                // // console.log(sizeA)
                // const sizeB = b.getBoundingClientRect();
                // // console.log(sizeB)
                // const sizeC = c.getBoundingClientRect();         
                // // console.log(sizeC)

                //结论三:读后写,导致recalculate style && layout
                //           读后写写,同理,但只要有写入都会触发recalculate style && layout
                // a.getBoundingClientRect();
                // a.style.width = "100px";
                // b.style.width = "150px";

                //结论四:写后读,会触发recalculate style && layout,因为前面有写入操作,所以需要重新计算style,再执行layout,再读取
                // 和直接读取不同在于,直接读取时不需要重新计算style的
                // 写后读读,    同理,但第二次读不需要重新计算,和上面连续读写的情况一样
                // a.style.width = "100px";
                // b.style.width = "150px";
                // a.getBoundingClientRect();   
                // b.getBoundingClientRect();               

                //结论五:写读写读写读... 会不断触发recalculate style && layout
                // a.style.width = "100px";
                // a.getBoundingClientRect();
                // b.style.width = "100px";
                // b.getBoundingClientRect();           


                //一些建议或感悟
                /*
                 *  ①充分利用Chrome的timeline
                 *  ②浏览器对于每一帧的渲染过程:执行js -> style -> layout -> paint -> composite(同样,在之后会写一篇文章来介绍,可以先看这个https://developers.google.com/web/fundamentals/performance/rendering/)
                 *  ③结论看过就忘了,自己开timeline试试吧,或者先有个概念,日后遇见了再回来试试。
                 *  
                **/ 
            })
        }
    </script>
</body>
</html>

实验结论


  1. 连续读取同一个元素的高宽(多次读取也一样)只会触发一次layout,底层应该调用了getBoundingClientRect()
  2. 连续读取不同元素的高宽,只会触发一次layout,底层在layout的时候应该算出了所有元素的位置,下次再读取(没有写入的前提下)不会触发新的layout
  3. 读后写,导致recalculate style && layout。读后写写,同理,但只要有写入都会触发recalculate style && layout
    timeline:read-then-write
  4. 写后读,会触发recalculate style && layout,因为前面有写入操作,所以需要重新计算style,再执行layout,再读取。和直接读取不同在于,直接读取时不需要重新计算style的。 写后读读, 同理,但第二次读不需要重新计算,和上面连续读写的情况一样
    timeline:write-then-read
  5. 写读写读写读… 会不断触发recalculate style && layout
    timeline:write-then-read2

一些建议或感悟
- 充分利用Chrome的timeline
- 浏览器对于每一帧的渲染过程:执行js -> style -> layout -> paint -> composite(同样,在之后会写一篇文章来介绍,可以先看这个
- 上面是基本的理论和工具,算得上是建议的是这个:如果业务中必须要读写读写,可以将读后处理的结果存下来,然后再连续写,将读写读写变成读读写写只会触发一次recalculate style && layout(2016-11-25更新)。
- 读写innerHTML同样会触发recalculate style && layout,请小心。最好的方法就是,上线前使用timeline工具检查一遍自己写的页面。再安利一篇简单上手文章:前端性能优化利器:Chrome Timeline学习及实践
- 结论看过就忘了,自己开timeline试试吧,或者先有个概念,日后遇见了再回来试试。

else

好像很久没写blog了,最近看书学习比较多,湖泊不知江海之大也,虚心向上。

Unity URP渲染路径深度解析:前向与延迟渲染的选择策略与性能优化 在实时图形渲染领域,渲染路径决定了光照与着色的计算方式,是影响项目性能与视觉效果的核心架构决策。其基本原理在于定义了几何体如何与光源交互并最终生成屏幕像素。从技术价值看,不同的渲染路径在性能开销、功能支持及硬件兼容性上存在本质差异,直接关系到项目的可扩展性与目标平台适配性。前向渲染采用逐对象计算,对透明效果和硬件兼容性有天然优势;而延迟渲染通过几何缓冲区解耦光照计算,在处理海量动态光源时性能表现更为稳定。这两种技术方案广泛应用于游戏开发、模拟仿真及交互式应用等场景。本文聚焦于Unity URP管线,结合** 阅读详情

相关推荐

前端滚动卡顿排查与优化:从浏览器渲染原理到性能调优实践

在Web开发中,浏览器渲染流水线是理解页面性能的基础。它描述了HTML、CSS和JavaScript如何被解析、计算样式、布局、绘制并最终合成到屏幕上的过程。其核心原理在于每一帧的渲染都必须在约16.6毫秒内完成,才能保证60FPS的流畅体验。这项技术的价值在于,它为开发者提供了分析和优化页面性能的理论框架。在实际应用场景中,尤其是在处理用户交互(如滚动、动画)时,任何导致渲染流水线阻塞或延长的操作,都会引发卡顿问题。本文聚焦于前端开发中常见的滚动卡顿现象,深入探讨如何利用性能分析工具定位强制同步布局等瓶颈

weixin_30410119的博客 410

Web动画性能优化:从渲染原理到工程实践

在Web开发中,动画是提升用户体验的关键技术,但不当的实现常导致性能瓶颈。理解浏览器渲染流水线是优化的基础,其核心环节包括JavaScript执行、样式计算、布局、绘制和合成。其中,布局和绘制是开销最大的操作,而合成阶段性能最优。因此,动画性能优化的黄金法则是尽可能只触发合成,避免触发布局和绘制。这通常通过优化CSS属性实现,例如优先使用transform和opacity等仅触发合成的属性。从技术价值看,高效的动画能显著提升页面流畅度、降低功耗并改善用户体验。在实际应用场景中,无论是微交互、数据可视化还是复

weixin_34198453的博客 1800

前端性能优化:虚拟滚动与分片加载解决大规模DOM渲染卡顿

在前端开发中,DOM渲染性能优化是提升用户体验的关键技术。浏览器渲染机制决定了当JavaScript长时间占用主线程时,会导致页面卡顿,这种现象称为渲染阻塞。通过虚拟滚动技术,可以只渲染可视区域的DOM元素,保持DOM数量恒定,从而显著提升大规模数据列表的渲染性能。另一种解决方案是分片加载,将大任务拆分为小任务,利用requestAnimationFrame或requestIdleCallback给浏览器喘息机会。这些优化技术特别适用于电商商品列表、聊天记录等需要展示大量数据的应用场景,能够有效解决长任务导

weixin_33857679的博客 366

请解释下渲染出现recalculate style的过程

在前端开发中,当提及浏览器的渲染过程,(重计算样式)是其中一个关键步骤。为了深入理解它,我们先简要概述浏览器的渲染流程,然后重点解释。

王铁柱666的博客 492

Pointnet++环境配置+复现

深度学习点云经典网络Pointnet++

weixin_58663121的博客 8075

AS5600磁编码器选型与安装避坑指南:磁铁形状、间隙距离到底怎么选?(附实测数据)

本文详细解析了AS5600磁编码器的选型与安装要点,包括磁铁形状、间隙距离等关键参数的选择,并附有实测数据支持。特别针对Arduino和I2C接口的应用场景,提供了硬件选型和机械安装的实用指南,帮助开发者避免常见陷阱,提升系统精度和稳定性。

weixin_27038245的博客 287

浏览器工作原理--渲染流程:HTML,CSS和JavaScript是如何变成页面的?

一、渲染流水线 (1)由于渲染机制过于复杂,所以渲染模块在执行过程中会被划分为很多子阶段,输入的 HTML 经过这些子阶段,最后输出像素。我们把这样的一个处理流程叫做渲染流水线。 (2)按照渲染的时间顺序,流水线可分为如下几个子阶段:构建 DOM 树、样式计算、布局阶段、分层、绘制、分块、光栅化和合成。 二、构建DOM树 (1)原因:览器无法直接理解和使用 HTML,所以需要将 HTML 转换为浏览器能够理解的结构——DOM 树。 (2)DOM树的构建过程 构建 DOM 树的输入内容是.

xuan的博客 1664

大数据领域数据产品的团队激励与绩效管理

在大数据领域,数据产品的成功离不开高效协作的团队。团队激励与绩效管理的目的在于激发团队成员的工作热情和创造力,提高工作效率和质量,确保数据产品能够按时、高质量地交付。本文章的范围涵盖了大数据领域数据产品团队激励与绩效管理的各个方面,包括激励机制的设计、绩效评估的方法、团队沟通与协作等。本文将按照以下结构进行阐述:首先介绍核心概念与联系,明确相关概念的定义和相互关系;接着讲解核心算法原理和具体操作步骤,为团队激励与绩效管理提供理论支持和实践指导;然后分析数学模型和公式,帮助读者深入理解绩效评估的原理;

Java大师兄的博客 1018

前端深入学习笔记(2)浏览器渲染原理

记录浏览器渲染原理学习笔记,优化前置必看知识

qq_41901200的博客 1068

【立创EDA-PCB设计基础】1.嘉立创EDA专业版软件安装+PCB基本概念+原理图绘制

本文详解PCB基本概念以及实现MCU最小系统原理图的绘制(原理图包括MCU芯片GD32F103C8T6、外部晶振、输出端口、USB输入口、5v转3v3稳压输出、复位按键、唤醒按键、LED)及嘉立创EDA专业版软件安装。为本专栏【立创EDA-PCB设计基础】后面章节实现PCB绘制做准备。

嵌入式阿齐Archie 3万+

【YOLOv11改进 - 特征融合】DySample :超轻量级且高效的动态上采样器

【YOLOv11改进 - 特征融合】DySample :超轻量级且高效的动态上采样器

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1070

webkit浏览器渲染影响因素分析

前言:浏览器的渲染对性能影响非常大,特别是在移动端页面,在宏观上,我们可以参考雅虎那20几条军规来操作,但在微观渲染层面,实际还没有一套相对成型的理论做为依据。 本文只是抛砖引玉,带大家进入微观的优化领域,实际在渲染优化这块上,还有很多技巧及方法需要大家去挖掘。本文写的也比较凌乱,望包涵!! 先来看个chrome timeline 工具上的一个图: 在timeline上...

weixin_33806300的博客 187

一文读懂OpenClaw:核心组件与工作原理深度解析

Agent核心:负责理解意图、规划任务、协调执行消息系统:统一的消息格式,实现组件间解耦工具注册表:可扩展的工具系统,支持自定义工具模型适配层:多模型支持,统一API接口安全机制:沙箱隔离、权限确认、操作审计性能优化:并行执行、智能缓存、增量更新理解这些核心组件和工作原理,将帮助你更好地使用OpenClaw,也为后续开发自定义扩展打下坚实基础。在下一篇文章中,我们将详细介绍OpenClaw的界面操作,包括命令行与交互模式的各种技巧。

gaoxiang_120的专栏 833

浏览器渲染原理——计算属性和布局过程常考内容

浏览器渲染管线中的样式计算和布局过程解析:样式计算阶段将CSS规则应用到DOM节点,通过CSSOM构建、层叠继承和单位换算生成最终样式;布局阶段则计算每个节点的几何信息,处理不同布局模式并生成布局树。JS操作可能触发强制同步布局,需通过批量操作和requestAnimationFrame优化性能。关键优化策略包括减少重排、简化CSS选择器和使用GPU加速属性,以实现流畅的60fps渲染。

警警的博客 1566

【100分】【等和子数组最小和】

逆序排序,这样能够使得在分组时优先选取较大的元素,以便将元素分配到较小的子集中,从而使得每个子集的和相对均衡。给定一个数组nums,将元素分为若干个组,使得每组和相等,求出满足条件的所有分组中,组内元素和的最小值。分成若干个组,使得每组的和相等,并求出满足条件的所有分组中,组内元素和的最小值。在递归的过程中,我们需要注意一个优化点,即避免将相同和的桶重复计算。4 个子集(5),(1,4),(2,3),(2,3)2 个子集(5, 1, 4),(2,3, 2,3)个子集,则返回子集和的最小值,如果不能,则将。

weixin_54707168的博客 1168

第二十一:Python接口自动化-处理Json数据

【代码】第二十一:Python接口自动化-处理Json数据。

欢迎来到本博客! 111

前端性能优化(二)渲染优化

前端性能优化(二)渲染优化一.浏览器渲染流程二.布局和绘制的优化1.影响回流的操作2.什么是布局抖动、以及如何避免3.复合线程(compositor thread)与图层(layers)三.requestanimationframe 这个API 一.浏览器渲染流程 初次渲染—浏览器渲染流程 二次渲染主要是这五个步骤: JavaScript:指的是用js可以实现页面上的视觉变化,比如动画等;除此之外我们还可以用css做动画过渡等,这里只是统一代表,改变页面视觉变化的一系列操作 Style:浏览器对样式就行重

qq_25503949的博客 1512

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

渲染优化(CRP、回流重绘)

关键渲染路径 前端性能优化之关键路径渲染优化 浏览器怎么把页面渲染出来,渲染过程分很多环节,就是 关键渲染路径(CRP) CRP:Critical Rendering Path 浏览器渲染过程: JavaScript(触发视觉变化) -> Style(浏览器对样式重新进行计算) -> Layout(布局) -> Paint(绘制) -> Composite(合成) JavaScript:可以通过 JavaScript 实现一些页面上视觉上的变化,例如:添加 DOM 元素、j

雪急飞绪博客 867

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

前端滚动性能优化:从浏览器渲染原理到工程化实践

浏览器渲染流水线是前端性能优化的核心基础,它描述了从HTML、CSS解析到最终像素上屏的完整过程,包括样式计算、布局、绘制和合成等关键阶段。理解这一原理,对于诊断和解决运行时性能问题至关重要。其技术价值在于,开发者可以基于此模型,系统性地定位性能瓶颈,例如通过分析长任务、强制同步布局和过度绘制等现象,将抽象的用户感知“卡顿”转化为具体的、可度量的技术问题。在实际应用场景中,滚动卡顿是典型的复合型性能问题,它集中暴露了渲染流水线各环节的短板。本文聚焦于此,深入探讨如何利用Performance面板等工具进行深

weixin_30617695的博客 359

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Webkit架构解析与实战:从渲染原理到性能优化

浏览器渲染引擎是现代Web应用的核心技术组件,负责将HTML、CSS和JavaScript代码转换为用户可视的网页界面。其工作原理遵循从解析、构建对象模型到布局、绘制、合成的完整流水线,这一流程直接决定了页面的加载速度、交互流畅度和渲染一致性。在工程实践中,深入理解渲染引擎的内部机制,特别是布局(Reflow)与绘制(Painting)的触发条件与性能开销,对于进行有效的前端性能优化至关重要。通过开发者工具深入分析渲染过程,并结合对内存管理与图层合成机制的理解,开发者可以系统性解决常见的性能瓶颈,如布局抖动

weixin_34357928的博客 355

移动端Web性能优化实战:从网络到渲染的全链路解决方案

Web性能优化是前端开发的核心领域,它通过一系列技术手段提升网页加载速度与交互流畅度,直接影响用户体验与业务转化。其原理涉及网络传输、浏览器渲染管线、JavaScript执行引擎等多个层面。在移动互联网时代,性能优化的技术价值尤为凸显,它不仅是提升用户满意度的关键,更是应对复杂移动网络环境、多样硬件设备和有限电池续航的工程挑战。特别是在移动端Web开发中,优化策略需要针对性解决网络不稳定、渲染效率低、内存管理严格等特有难题。本文聚焦于移动端场景,深入探讨了如何通过资源压缩、缓存策略、关键渲染路径优化、Jav

weixin_34344403的博客 863

Style Dictionary 性能优化:处理大规模设计令牌的10个技巧

Style Dictionary 是一个强大的跨平台样式构建系统,能够将设计令牌转换为各种平台所需的格式。在处理大规模设计令牌时,性能优化变得至关重要。本文将分享10个实用的性能优化技巧,帮助你在面对数千个设计令牌时保持高效的构建速度。🚀 ## 为什么需要关注Style Dictionary性能? 当设计系统规模不断扩大时,设计令牌的数量可能从几十个增长到数千个。在这种情况下,构建时间可能从

gitblog_00571的博客 554

大规模DOM插入性能优化:虚拟滚动与分片渲染实战指南

DOM操作是Web开发中的基础概念,涉及浏览器对文档对象模型的增删改查。其性能瓶颈原理在于每次DOM变更都会触发重排和重绘,当操作大规模节点时,主线程会被长时间阻塞。这一技术挑战在前端工程中具有重要价值,直接影响页面响应速度和用户体验。虚拟滚动技术通过仅渲染可视区域内容,将DOM操作数量从数万级降至数十级,从根本上解决性能问题。分片渲染则将大任务分解到多个帧中执行,避免界面卡顿。这些优化方案特别适用于数据可视化、后台管理系统等需要处理海量数据的应用场景,帮助开发者实现流畅的大规模数据展示。

weixin_34221773的博客 463

HTML渲染性能优化:提升Web应用加载速度的关键技巧

HTML渲染性能是Web应用优化的基础环节,直接影响首屏加载时间和用户体验。浏览器渲染流程包括DOM构建、CSSOM生成、渲染树合并、布局计算和绘制等关键步骤,优化这些环节能显著提升页面性能。通过减少DOM节点数量、优化资源加载顺序、使用高效CSS选择器等技巧,可以有效缩短关键渲染路径。现代Web开发中,预加载关键资源、Intersection Observer懒加载等技术进一步提升了性能表现。结合Chrome DevTools等性能分析工具,开发者可以持续监控和优化FCP、LCP等核心指标,确保应用在不同

weixin_34133829的博客 336

浏览器渲染原理

计算属性是浏览器渲染过程中的关键步骤,主要完成从CSS规则到具体元素样式的映射。这一过程发生在DOM树构建完成之后,但在实际布局和绘制之前,是连接CSS样式声明和最终渲染效果的重要桥梁。具体来说,计算属性的过程包含以下几个关键环节:值得注意的是,计算属性是一个相对耗时的操作,过多的CSS规则或复杂的选择器都会影响页面渲染性能。这也是为什么现代前端框架会采用虚拟DOM等技术来最小化样式计算的范围。

Made In SQL 731

innerText与innerHTML深度解析:性能、安全与渲染机制

innerText和innerHTML是Web前端操作DOM文本与结构最基础也最关键的两个API。它们分别对应浏览器的视觉文本计算层与HTML解析执行层:innerText触发样式重算与布局,返回用户实际可见的内容;innerHTML则绕过渲染直接编译HTML字符串,兼具高效性与高风险。理解其底层机制对规避XSS漏洞、避免强制重排、保障无障碍访问及提升滚动性能至关重要。本文结合真实项目事故、跨浏览器差异与性能压测数据,系统梳理二者在纯文本展示、富文本渲染、自动化测试、SSR水合等典型场景下的选型逻辑,并提供

weixin_33991418的博客 348
上一篇: ReactJS修炼之路(五):Immutable.js的使用及setState的一个误区
下一篇: 前端开发中Cookie那些事儿
Sheldon_Law
博客等级 码龄11年 44粉丝 32原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值