JavaScript中的Repaint和Reflow用法详解

JavaScript中的Repaint和Reflow用法详解

简介

当我们操作DOM元素时,浏览器会自动在内部计算其布局和几何属性,这被称为回流(reflow)。同时,当我们对样式进行更改时,浏览器会重新渲染(repaint)发生更改的部分。这样做会提高应用程序或网站的性能,因为回流和重绘是比较昂贵的操作。

Repaint

在计算机图形中,当一个对象的视觉外观发生变化时,我们把这个过程叫做重新绘制(repaint)。repaint对于浏览器而言是一项相对轻松的操作,因为它仅仅是在已有的位置重新绘制元素内容,而不会影响页面的布局。

例如,当我们更改样式,如更改颜色时,这不会影响元素的布局,而仅仅是绘制同一元素的外观。如果仅仅需要改变元素的样式属性,应该使用Repaint而不是Reflow。

以下是使用JavaScript触发repaint的两种方法:

方法1:更改元素CSS中的伪类

这里我们使用:hover伪类来进行举例。当使用伪类来控制元素的样式时,它只会触发Repaint而不是Reflow。例如:

element:hover{
    color: red;
}

方法2:使用JS方法来改变元素的样式

修改CSS会触发Repaint。使用此方法时,使用JS来暴露和改变元素的style属性,触发Repaint。下面是一个例子:

element.style.color = "red";

Reflow

在页面渲染过程中,浏览器会根据布局计算元素的几何属性和位置,这个计算过程称之为回流(reflow)。如果元素的位置或尺寸等几何属性发生改变,浏览器必须重置这个元素的样式,包括其他元素的样式也可能会受到影响,以保证正确的渲染。

reflow是一项昂贵的操作,因为它涉及大量的运算。如果需要更改页面的几何属性,请尽可能地减少reflow的次数。

以下是用于JS触发回流的常见代码:

方法1:改变或获取元素的几何属性

当改变元素的几何属性时,浏览器需要重新计算其他元素的位置和尺寸,以及更新页面的布局。当我们使用以下代码时,会发生Reflow:

element.offsetLeft;
element.offsetTop;
element.offsetWidth;
element.offsetHeight;
element.clientWidth;
element.clientHeight;

方法2:操作节点

当一个节点的位置发生变化时,DOM要重新计算节点位置并更新布局:

element.style.height = "100px";

示例1

下面是一个可以通过节流和防抖技术(即缓解回流的方法)来执行多次代码的例子:

function handleScroll() {
  // 引导页的初始高度在样式中定义为2000px
  const GUIDE_HEIGHT = 2000;

  const scrollTop = document.documentElement.scrollTop;

  // 获取指向首页按钮的元素
  const homeButton = document.getElementById('home-button');

  // 如果垂直滚动距离大于引导页面的高度
  if (scrollTop > GUIDE_HEIGHT) {
    // 在按钮上设置新的样式
    homeButton.style.opacity = '1';
  } else {
    // 如果在引导页面内
    homeButton.style.opacity = '0';
  }
}

// 用于检测页面滚动,防止过度重绘和回流
window.onscroll = throttle(() => {
  handleScroll();
}, 50);

在这个例子中,我们设置了一个事件处理程序用来处理页面滚动的事件,同时使用防抖(throttle)技术使页面滚动事件的回流和重绘的次数降到最低。

示例2

下面是另一个使用缓解连续回流的例子:

const searchInput = document.getElementById('search-input');
const searchResult = document.getElementById('search-results');

function search() {
  // 获取搜索关键词
  const keyword = searchInput.value.toLowerCase();

  // 准备用于搜索的结果
  let results = '';

  // 在搜索结果中查找包含关键词的结果
  for (let i = 0; i < data.length; i++) {
    if (data[i].toLowerCase().includes(keyword)) {
      results += `<li>${data[i]}</li>`;
    }
  }

  // 向DOM添加新的html代码
  searchResult.innerHTML = results;
}

// 使用操作输入的防抖函数
searchInput.addEventListener('input', debounce(search, 250));

在搜索输入框中键入关键词后,页面会实时更新搜索结果,该功能易导致连续回流。这时可以采用使用防抖来控制触发搜索的频率,从而减少回流和重绘的次数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript中的Repaint和Reflow用法详解 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 微信小程序 时间格式化(util.formatTime(new Date))详解

    为了实现微信小程序的时间格式化,我们可以使用util.formatTime()函数。这个函数将一个Date对象转换为对应的字符串形式,具体格式化方式由传入的参数进行控制。 以下是“微信小程序 时间格式化(util.formatTime(new Date))详解”攻略的详细实现过程: 1. 引入util模块 在微信小程序中使用util模块需要先引入该模块,使用…

    JavaScript 2023年5月27日
    00
  • 对js eval()函数的一些见解

    下面就是“对js eval()函数的一些见解”的完整攻略。 1. eval()函数的介绍 eval() 函数是 JavaScript 中的一个内置函数,它接收一个字符串作为参数,然后将这个字符串解析为 JavaScript 代码并执行。eval() 函数可以用来动态地生成代码、动态地加载脚本以及实现其他一些动态脚本的功能。 2. eval()函数的使用 2.…

    JavaScript 2023年5月28日
    00
  • JavaScript仿百度图片浏览效果

    介绍JavaScript仿百度图片浏览效果所需要遵循的完整攻略: 步骤一:网页结构设计 要实现JavaScript仿百度图片浏览效果,需要先设计网页的结构。具体来说,需要将每个图片都包装在一个链接标签内部,然后这些链接标签再放置在一个父级div标签中。这样,每次点击一个链接标签,就会打开一个图片的浏览界面。 下面是一个示例代码: <div class=…

    JavaScript 2023年6月11日
    00
  • JavaScript基础之静态方法和实例方法分析

    JavaScript基础之静态方法和实例方法分析 什么是静态方法与实例方法? 在 JavaScript 中,我们常常需要使用到一些函数或方法来将数据进行处理或者实现某些功能。那么,这些函数或方法又可以分为两种不同类型:静态方法和实例方法。 静态方法:静态方法是指在类名上被调用,而无需实例化对象的方法。它们通常用于创建和管理类本身和类内部属性,如Math.ab…

    JavaScript 2023年5月28日
    00
  • 在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题

    在一个JS文件里远程调用jQuery.js会在IE8下出现一个奇怪问题,这个问题是由于jQuery.js本身的一个问题导致的。具体的解决方法如下: 问题原因 在IE8浏览器中,如果将jQuery.js脚本文件远程加载到一个JS文件中,会发生jQuery.js文件无法执行的问题。这是由于IE8浏览器的安全设置对ActiveXObject对象的访问做了限制,导致…

    JavaScript 2023年5月27日
    00
  • JavaScript高级程序设计 事件学习笔记

    《JavaScript高级程序设计》事件学习笔记 什么是事件? 事件是指在网页中发生的交互的行为,比如页面的加载、点击按钮、鼠标滚动等,这些行为就是事件。 事件监听器 事件监听器是用来监听特定事件并处理事件的函数。可以通过给元素添加事件监听器来创建响应用户操作的交互式网页。 在 JavaScript 中,我们可以使用 addEventListener() 方…

    JavaScript 2023年5月27日
    00
  • JS实现中英文混合文字溢出友好截取功能

    以下是JS实现中英文混合文字溢出友好截取功能的完整攻略。 什么是中英文混合文字溢出? 中英文混合文字溢出通常是指,在一个容器中,两种不同字符(例如汉字和英文字符)混合排列,当容器宽度不够时,字符溢出容器的情况。由于汉字和英文字母的宽度不同,所以溢出部分难以准确的识别和截断,需要特殊处理。 如何实现中英文混合文字溢出友好截取? 第一步:计算字符长度和容器宽度 …

    JavaScript 2023年5月28日
    00
  • JavaScript计时器用法分析【setTimeout和clearTimeout】

    JavaScript计时器用法分析【setTimeout和clearTimeout】 计时器是JavaScript中重要的一个组成部分,它允许您在预定的时间间隔内重复或延迟执行代码块。在本文中,我们将详细分析JavaScript中的计时器——setTimeout和clearTimeout的用法。 setTimeout setTimeout是一种计时器,它允许…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部