可见性:隐藏和显示:无之间的性能差异
Performance differences between visibility:hidden and display:none
我想在我的jQuery Backbone.js Web应用程序中简化事情。其中一个简化是我的菜单和对话框小部件的行为。
以前,我在开始时创建了菜单的div框,并使用display: none; opacity:0;
隐藏了它们。 当我需要一个菜单时,我将其样式更改为 display:block
然后使用 jQuery ui 位置实用程序定位div 框(因为无法定位带有 display:none
的元素(,完成后,最后将其样式更改为 opacity:1
.
现在我想用visibility:hidden
隐藏它们,当我需要一个时,我使用位置实用程序,然后将样式更改为visibility:visible
。 当我开始使用这种新方法时,我将在整个 Web 应用程序会话中隐藏大约 10 个div 框,这些框是隐藏的,但占用空间,与之前用 display:none
隐藏的div 框形成鲜明对比。
我的新方法意味着什么?它是否在任何方面影响浏览器性能?
display:none;
元素并不全部在渲染树中,因此它们在表面上的表现会更好。
不过,我怀疑您不会因此而遇到任何真正可见的性能问题。如果您因为它们的功能而需要opacity: 0
或visibility: hidden
,那么只需使用它们。如果您不需要该功能,请使用display: none;
如果您通过javascript在可见和不可见状态之间切换,那么visibility:hidden 应该是性能更好的。看到它在可见和隐藏状态下总是占用相同的空间量,因此每次您使其看起来消失时,它都会导致其下方元素的重排。对于 display:none ,您将它从文档流中删除,然后当您将其设置为 display:block 时,您将重新渲染它并将该元素下方的所有内容向下推,基本上是再次布置所有这些内容。
但是,如果您正在执行诸如在按钮按下时切换可见状态之类的操作,那么您确实应该使用适合您需求而不是性能更好的状态,因为在这种情况下性能差异可以忽略不计。当您以每秒大约 20 次的速度使用 dom 进行动画处理时,您可以担心可见性:隐藏与显示:无的性能。
visibility: hidden
不会导致文档重排,而display: none
会导致重排。
display: none
:HTML 引擎将完全忽略该元素及其子元素。引擎不会忽略标有visibility: hidden
的元素,它将对元素及其子元素进行所有计算,例外情况是元素不会渲染到视口。
如果需要位置和尺寸属性的值,则必须使用visibility: hidden
并且您必须处理视口中的空白区域,通常是将该元素包装在另一个宽度和高度为 0 且"溢出:隐藏"的元素中。
display:none
将从文档的正常流程中删除该元素,并将元素及其子元素上的位置/高度/宽度值设置为 0。当元素display
属性更改为 none
以外的其他值时,它会触发完整的文档重排,这对于大文档来说可能是一个问题 - 有时在功能有限的硬件上呈现不太大的文档。
display: none
是在视口上隐藏元素时使用的自然和合乎逻辑的解决方案,visibility: hidden
应在需要时用作回退。
编辑:正如@Juan所指出的,当您需要向 DOM 树添加许多元素时,display: none
是选择。 visibility: hidden
将触发添加到树中的每个元素的重排,而display: none
不会。
display:none
和visibility:hidden
之间有任何性能差异 - 即使有,对于只有 10 个元素,它完全可以忽略不计。 正如您所说,您主要关心的应该是是否希望元素保留在文档流中,在这种情况下,visibility
是一个更好的选择,因为它维护元素的框模型。
好吧,display: block
和 visibility: hidden
之间的主要性能区别在于,如果你有一个列表,比如说,100000 个元素,visibility: hidden
不会让你免于 DOM 挂起,因为它不会从 DOM 中删除元素。 visibility: hidden
的行为就像opacity: 0
+pointer-events: none
。 display: none
表现得像Element.remove()
.
现场示例:https://jsfiddle.net/u2dou58r/10/
根据个人经验,刚刚在一个简单的静态页面上尝试了两者,表单位于"隐藏"按钮下方,visibility: hidden
完美地执行,而display: none
会导致可单击按钮在单击时略微跳跃,就好像它试图显示隐藏的按钮一毫秒。
我认为这可能与这个问题有关: CSS 属性:显示与可见性
我只引用有趣的部分:
该元素永远不会从 DOM 层次结构中删除。当使用display:none时,所有块级显示"样式"都是完全"隐藏"的,而使用可见性:隐藏;元素本身是隐藏的,但它仍然占据 DOM 中的视觉空间。
因此,在浏览器性能方面应该没有真正的区别,因为两个版本仍在 DOM 层次结构中。这些属性仅影响元素相对于 DOM 的显示方式。
好吧,可见性:none 仍然使用div 的空间。因此,您可以跳过定位部分,因为它的位置已经分配(从而获得更好的性能(。
但我不知何故猜测您需要 display:none 方法在触发"show"事件时正确分配空间。
- 函数参数中的数据与指定变量之间的任何性能差异
- 函数声明与函数表达式之间的性能差异
- 行之间有空格会影响 JavaScript 代码的性能吗?
- 可见性:隐藏和显示:无之间的性能差异
- jQuery/CSS在幻灯片之间的转换扰乱了位置:修复了幻灯片内部的性能
- 重新分配变量和重新定义之间的性能差异
- 使用:nth-child()选择器和.get()方法之间的性能差异
- 对字符串对象调用 .localeCompare 与构造特制的 Intl.Collator 对象之间的性能差异
- 函数和对象之间的差异,以及它如何影响性能
- C# 和 Javascript 之间的性能和内存差异
- “==”和“===”之间是否存在显著的性能差异
- Javascript/jQuery-height()和.css({'height'})之间是否存在性能差
- JavaScript中多维数组或对象数组之间的性能
- Javascript和PHP之间赋值的性能
- 属性与类之间是否存在性能(或其他方面)差异
- 后端处理与phantomjs/nodejs之间的性能差异
- 内联Javascript代码和纯Javascript代码之间的最佳性能是什么?
- 为什么复杂循环和多循环之间会有如此巨大的性能差异?
- 如何补偿浏览器之间的循环性能差异
- 这两种for循环使用方法之间是否有显著的性能差异?