web 应用开发最佳实践之一:避免大型、复杂的布局和布局抖动

简介: web 应用开发最佳实践之一:避免大型、复杂的布局和布局抖动

Avoid Large, Complex Layouts and Layout Thrashing


布局是浏览器计算元素几何信息的地方:即元素在页面中的大小和位置。 每个元素都将具有基于所使用的 CSS、元素的内容或父元素的显式或隐式大小信息。 该过程在 Chrome、Opera、Safari 和 Internet Explorer 中称为布局(Layout).


在 Firefox 中,它被称为回流(reflow),但实际上过程是相同的。


与样式计算类似,布局成本的直接关注点是:


需要布局的元素数量。

这些布局的复杂性。

简而言之:


布局通常限定于整个文档。

DOM 元素的数量会影响性能; 你应该尽可能避免触发布局。

评估布局模型性能; 新的 Flexbox 通常比旧的 Flexbox 或基于浮动的布局模型更快。

避免强制同步布局和布局抖动; 读取样式值然后进行样式更改。

Avoid layout wherever possible

当您更改样式时,浏览器会检查是否有任何更改需要计算布局,以及是否需要更新渲染树。 更改“几何属性”,例如宽度、高度、左侧或顶部都需要执行布局过程。

.box {
  width: 20px;
  height: 20px;
}
/**
 * Changing width and height
 * triggers layout.
 */
.box--expanded {
  width: 200px;
  height: 350px;
}

布局几乎总是作用于整个文档。 如果您有很多元素,则需要很长时间才能弄清楚它们的位置和尺寸。


如果无法避免布局,那么关键是再次使用 Chrome DevTools 来查看需要多长时间,并确定布局是否是造成瓶颈的原因。 首先,打开 DevTools,转到 Timeline 选项卡,点击记录并与您的站点进行交互。 当您停止录制时,您会看到您的网站表现的细分:




在上例中深入研究帧时,我们看到在布局内部花费了超过 20 毫秒,当我们有 16 毫秒在动画中在屏幕上显示帧时,这太高了。 您还可以看到 DevTools 会告诉您树的大小(在本例中为 1,618 个元素),以及需要布局的节点数量。


Avoid forced synchronous layouts

将网页运送到屏幕具有以下顺序:image.png首先运行 JavaScript,然后是样式计算,然后是布局。 但是,可以使用 JavaScript 强制浏览器提前执行布局。 它被称为强制同步布局。


首先要记住的是,当 JavaScript 运行时,前一帧中的所有旧布局值都是已知的,可供您查询。 因此,例如,如果您想在帧的开头写出元素的高度(让我们称其为“框”),您可以编写如下代码:


image.pngimage.pngimage.png

// Schedule our function to run at the start of the frame.
requestAnimationFrame(logBoxHeight);
function logBoxHeight() {
  // Gets the height of the box in pixels and logs it out.
  console.log(box.offsetHeight);
}

如果你在询问高度之前改变了盒子的样式,事情就会变得有问题:

function logBoxHeight() {
  box.classList.add('super-big');
  // Gets the height of the box in pixels
  // and logs it out.
  console.log(box.offsetHeight);
}

此代码遍历一组段落并设置每个段落的宽度以匹配名为“box”的元素的宽度。 它看起来无害,但问题是循环的每次迭代都会读取一个样式值(box.offsetWidth),然后立即使用它来更新段落的宽度(paragraphs[i].style.width)。 在循环的下一次迭代中,浏览器必须考虑自上次请求 offsetWidth(在前一次迭代中)以来样式已更改的事实,因此它必须应用样式更改并运行布局。 这将在每次迭代中发生!。

// Read.
var width = box.offsetWidth;
function resizeAllParagraphsToMatchBlockWidth() {
  for (var i = 0; i < paragraphs.length; i++) {
    // Now write.
    paragraphs[i].style.width = width + 'px';
  }
}
相关文章
|
8月前
|
编解码 前端开发 UED
响应式设计:构建适应多平台的现代网站
在当今数字时代,用户在各种设备上访问网站,包括桌面电脑、平板电脑和智能手机。为了提供一致的用户体验,响应式设计已经成为现代网站开发的重要组成部分。本博客将深入探讨响应式设计的核心概念、最佳实践以及如何创建适应多平台的网站。
39 0
|
14天前
|
编解码 前端开发 JavaScript
【Web 前端】移动端适配方案有哪些?
【4月更文挑战第22天】【Web 前端】移动端适配方案有哪些?
|
2月前
|
监控 前端开发 JavaScript
构建高性能Web应用:前端性能优化的关键策略与实践
本文将深入探讨前端性能优化的关键策略与实践,从资源加载、渲染优化、代码压缩等多个方面提供实用的优化建议。通过对前端性能优化的深入剖析,帮助开发者全面提升Web应用的用户体验和性能表现。
|
2月前
|
编解码 前端开发 UED
前端需要完完全全掌握的这些布局方案
前端需要完完全全掌握的这些布局方案
|
3月前
|
前端开发 JavaScript Java
从前端到后端:构建现代化Web应用的技术演进
本文将讨论在构建现代化Web应用时涉及的技术演进,并重点关注前端和后端领域的发展。我们将探索各种编程语言(如Java、Python和C),数据库技术以及前沿的前端和后端框架,帮助读者了解如何利用这些工具和技术来构建高效、可扩展和用户友好的Web应用。
|
4月前
|
存储 前端开发 JavaScript
从前端到后端:构建现代化Web应用的技术全景
本文将深入探讨前端和后端技术在构建现代化Web应用中的重要性和关联性。从前端开发的基础概念,如HTML、CSS和JavaScript,到后端技术的关键组成部分,如Java、Python、C和数据库,我们将一步步揭示如何整合这些技术,创建出高效、安全且功能强大的Web应用。
102 0
|
4月前
|
Web App开发 前端开发 BI
谈谈企业级 Web 应用的前端消息展示的定制化问题
谈谈企业级 Web 应用的前端消息展示的定制化问题
29 0
|
12月前
|
存储 SQL 机器人
「RPA技术」UiPath的部署架构
「RPA技术」UiPath的部署架构
|
监控 前端开发 JavaScript
Web 现代应用程序架构下的性能优化,渐进式的极致艺术。
前言 本文是 Rendering on the Web: Performance Implications of Application Architecture (Google I/O ’19)[1] 这篇谷歌工程师带来的现代应用架构体系下的优化相关演讲的总结,演讲介绍了以下优化手段: • 预渲染 • 同构渲染 • 流式渲染 • 渐进式注水(非常精彩)
|
Serverless
Serverless 带给 web 开发的改变——现代化Web 站点构建介绍
Serverless 带给 web 开发的改变——现代化Web 站点构建介绍自制脑图, 介绍了建站演示和端云调试
427 0
Serverless 带给 web 开发的改变——现代化Web 站点构建介绍