整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

零基础教你学前端-91、重排和重绘

零基础教你学前端-91、重排和重绘

们来讲一下页面的重排和重绘。

重排, 顾名思义就是重新排列元素重绘, 顾名思义就是重新绘制元素也许这样解释,你还是不能理解,为了帮助我们记忆, 通过这个例子先来看一下页面展示在浏览器上的过程

在准备好的Rearrange-redraw.html文件中,定义div和p两个元素,在头部添加style标签,作为内部样式表使用。

定义选择器 div ,声明样式 width: 200px; height: 200px; background-color: orange;

定义选择器 p 声明样式 width: 300px;height: 300px;background-color: skyblue;

打开页面我们看到内容显示了。

那么我们写的 html 和 css 是如何被呈现在页面上的呢?

其实, 首先浏览器会捕获到 html 结构, 生成一个 html树结构, 这个结构内的所有标签是没有样式出现的, 只是标明了 标签和标签之间的父子关系而已

接下来, 浏览器还会拿到你写的 css 样式, 解析以后生成一个 css 树结构, 这个结构是没有和 html 结合, 只是一个 css 样式说明的树状结构

再来, 浏览器就会把拿到的 html树 和 css树 相结合, 将两个树慢慢融合在一起, 组成一个 rander树, 这里面就会把 标签和样式 结合在一起, 呈现出页面中的效果

最后, 就是由浏览器来把这个 rander树 一笔一笔的 “画” 在页面上, 我们看到的页面就出现了。

知道了页面展示在浏览器上的过程过程, 我们再来聊一下重排和重绘

当我们通过后期的操作, 让页面中的节点发生了尺寸变化, 那么会因为一个元素的改变而导致整个页面发生变化, 可能后续的元素位置都会发生改变, 那么这个时候, 就会重新排列所有元素, 也就是说会触发重排, 也就是重新用 html树 和 css树 结合,去生成新的 rander 树,来进行新一次的绘制

当我们通过后期的操作, 让页面中的节点发生一些外观上的变化, 比如改变背景颜色, 文字颜色, 边框颜色 的时候, 不会导致页面排列元素的变化, 只是当前一个节点发生变化, 对其他节点没有影响, 那么这个时候不需要重新排列元素, 只需要重新绘制当前这个节点即可, 这个行为叫做重绘

在Web开发领域,JavaScript(简称JS)作为一门强大的客户端脚本语言,其重要性不言而喻。JS赋予了网页生命,使其能够响应用户的操作,实现动态内容的加载和展示。而这一切的核心,离不开文档对象模型(DOM)的节点操作。本文旨在探索JS与DOM节点操作的奥秘,通过实践示例和理论解析,帮助你掌握这一前端开发的必备技能。

技术概述

DOM简介

DOM是一种标准,用于表示和修改HTML或XML文档的结构。它将文档解析成树状结构,每个节点代表一个元素或属性,允许JS通过编程方式访问和修改这些节点。

核心特性与优势

  • 动态性:JS可以实时修改DOM,响应用户事件,如点击、输入等。
  • 选择器:提供灵活的节点选择方式,如getElementById, getElementsByClassName, querySelector等。
  • 节点操作:添加、删除、移动和修改节点及其属性,使得页面内容的动态更新变得简单。

示例代码

// 创建一个新的列表项
const li=document.createElement('li');
li.textContent='New Item';
document.querySelector('ul').appendChild(li);

技术细节

工作原理

当JS执行DOM操作时,它会查找、创建、修改或删除DOM树中的节点。这种操作会触发浏览器重新计算页面的布局和样式,即重排(reflow)和重绘(repaint)。

难点分析

  • 性能问题:频繁的DOM操作可能导致页面性能下降,特别是在大型应用中。
  • 选择器效率:某些选择器比其他的选择器更耗时,如getElementsByTagName

实战应用

场景描述

假设我们需要一个简单的计数器组件,每当用户点击按钮时,页面上显示的计数就会增加。

代码示例

let count=0;
const counter=document.getElementById('counter');
const incrementBtn=document.getElementById('increment');

incrementBtn.addEventListener('click', ()=> {
  count++;
  counter.textContent=count;
});

优化与改进

性能瓶颈

  • 减少DOM操作:尽量减少直接的DOM操作次数,比如使用字符串拼接后一次性更新。
  • 虚拟DOM:借鉴React等框架的虚拟DOM技术,先在内存中操作,最后批量更新真实DOM。

代码示例

let fragment=document.createDocumentFragment();
for (let i=0; i < 1000; i++) {
  const div=document.createElement('div');
  div.textContent='Item ' + i;
  fragment.appendChild(div);
}
document.body.appendChild(fragment);

常见问题

  • Q: 如何高效地遍历DOM节点?
  • A: 使用NodeList.forEach或转换为数组后再使用Array.prototype.forEach

总结与展望

DOM节点操作是前端开发中不可或缺的一部分,它让JS能够直接与网页内容进行交互,实现复杂的动态功能。然而,为了保证良好的用户体验,开发者需要关注DOM操作的性能和效率,采取适当的优化策略。随着Web技术的发展,未来的DOM操作将更加高效、智能,为Web应用带来无限可能。

希望本文能够为你在前端开发旅程中提供坚实的理论基础和实用的操作技巧,让我们一起期待JS与DOM在未来的表现,继续探索和创新,推动Web开发向前发展。

每个页面都是一个独立的HTML文档,每个HTML文档的主体结构又都是相同的,而且在一个文档中这样的主体结构只能声明一次。可以简单的将HTML文档主体结构分为两部分,一部分是定义文档类型,HTML5中声明文档类型可比以前的版本简单多了,只需要15个字符就可以搞定。另一部分则是定义文档主体的结构框架标签,因为标签并不是任意排放的,需要有一定的嵌套规则。就像一颗树是从树根到树干、树枝、树叶这样的结构生长,而不能在树叶上长出树根来,HTML文档的结构也是如此,整个文档是一个整体,最外层标签只有一个,第二层标签有两个,是这样固定的结构,第三层以后可以任意嵌套,就像一颗倒立的树形结构。如图所示:

图 HTML文档的树状结构