批量更新多个元素的Javascript中的CSS值?

Posted

技术标签:

【中文标题】批量更新多个元素的Javascript中的CSS值?【英文标题】:Updating CSS Values in Javascript across multiple elements in batch? 【发布时间】:2021-01-31 08:23:27 【问题描述】:

我正在开发一个网络应用程序,它需要跨多个元素频繁更新 CSS 值。我正在尝试减少回流,并想知道是否有办法批量完成此操作?这是一个例子:

for(let j = 0; j<defholdids.length; j++) 
    $('#'+defholdids[j]).css(
      'z-index':'4',
      'color':'rgba(0,0,0,0.7)',
    );

defholdids 是一个存储了元素 ID 的数组。循环遍历并更新 css 值。据我了解,每次更新元素 css 值时都会触发重排。有没有办法更新所有元素的 CSS 值,然后“重排”而不是每次迭代都触发“重排”?

我正在与 Electron 合作创建一个桌面应用程序,不确定这是否会有所作为。

【问题讨论】:

【参考方案1】:

如何为需要 cssupdates 的元素分配一个类名并立即更新它们。例如

   $('.class-name-goes-here').css(
      'z-index':'4',
      'color':'rgba(0,0,0,0.7)',
    );

【讨论】:

这会覆盖/防止通过 ID 对单个元素的 css 进行更改吗?示例:我需要能够更新 $('#'+defholdid[1]).css('color','value') 而无需更新课程。然后稍后将其更改回来(通过我显示的代码)。 ID CSS 值不会覆盖类值重置吗?【参考方案2】:

通过引入(第二个)类然后在适当的元素上添加/切换/删除该类,而不是直接操作元素的.css(),几乎总是会更好。

在约瑟夫的回答中,他介绍了 .class-name-goes-here(我将其缩写为 .main-class 如果您引入第二个/附加类:

.aux-class 
  z-index:4;
  color: rgba(0,0,0,0.7);

你可以做$('.main-class').addClass('aux-class'); 这会将更改一次性应用到所有 .main-class 元素。

您可以稍后通过 $('.main-class').removeClass('aux-class'); 将其改回

如果您有众所周知且维护良好的状态,您可以使用.toggleClass() 而不是单独的添加和删除。

这不会阻止您对$(element).css() 进行进一步的操作,但必须“手动”恢复这些更改。我可能会介绍另一个不同的(第三个?第四个?)类。

为它所代表的状态(或对象)命名类也很好。 这些名称取决于事物是什么以及您对它们做什么。也许.main-class.aux-class的好名字可以是.toggleable.active,所以可能

<section>
  <div class="toggleable">
    ...some content...
  </div>

  <div class="something-else">
    ...some other content...
  </div>

  <div class="toggleable">
    ...even more content...
  </div>

  <div>
    ...no particular class on this div...
  </div>
</section>

然后,按下按钮(例如)你会这样做$('.toggleable').addClass('active')

【讨论】:

感谢您的建议。如果我知道我的元素只有两种状态(z-index 99 的白色或 z-index 4 的黑色)将“更改”类应用于元素/删除元素是否可以满足我的需要?我可以将它专门应用于“选定”元素,然后将其从所有元素中删除?尝试删除未绑定到元素的类可以吗?基本上我有一个按钮需要清除所有,但允许用户选择单个元素。 另外,如果我理解错了,请纠正我,但我在某处读到,将 CSS 更改应用于 DOM 树上可能的最低元素可以节省重排时间,这不与此相反吗? 如果你知道只有两种状态,那一种是default还是initial状态?我不会有额外的课程,然后在用户选择东西时有一个“选定的”课程。假设我们正在谈论“卡片”,初始未选中状态是 white/z-index=99 — 你将拥有所有这些 &lt;div class="card"&gt; 并且 .card ... 的 CSS 将应用白色和 99,然后当用户选择您将添加$(clickedElement).addClass('selected') ...您可以为清除按钮添加$('.card').removeClass('selected').removeClass 当一个类不在一个元素上时,如果可以的话;不是错误。 不是每个 CSS 更改都会导致重排;颜色没有。 z-index 可能(我不记得了),但是通过这种方法,您仍然将 z-index 应用于可能的最低元素,因为 .card 您想要更改的东西堆叠顺序。您不希望将 z-index 应用于卡片的某些元素。 这就是我需要知道的!

以上是关于批量更新多个元素的Javascript中的CSS值?的主要内容,如果未能解决你的问题,请参考以下文章

从jQuery中的多个相同的类名中获取值CSS

通过javascript更改值时元素不更新错误状态

Mybatis 批量更新多个字段值

js怎样批量设置元素的style属性值

[转]CSS类选择器:一个元素同时使用多个类选择器

JavaScript CSS 如何向一个元素添加和删除多个 CSS 类