Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 隐藏/取消隐藏数百个DOM元素的最佳方法:更改样式或类? 双向_Javascript_Css_Dom - Fatal编程技术网

Javascript 隐藏/取消隐藏数百个DOM元素的最佳方法:更改样式或类? 双向

Javascript 隐藏/取消隐藏数百个DOM元素的最佳方法:更改样式或类? 双向,javascript,css,dom,Javascript,Css,Dom,有两种常用方法可以使用javascript动态更改元素的可见性 通过修改其样式: //隐藏时占用相同的空间 elem.style.visibility=“隐藏”/“可见”以取消隐藏 //隐藏时不占用任何空间 elem.style.display='none'/'block'|'inline'取消隐藏 通过修改其类列表: elem.classList.add'hidden'//classList.remove'hidden'取消隐藏 .隐藏{ 可见性:隐藏;/*隐藏时会占用相同的空间*/ /*显示

有两种常用方法可以使用javascript动态更改元素的可见性

通过修改其样式:

//隐藏时占用相同的空间 elem.style.visibility=“隐藏”/“可见”以取消隐藏 //隐藏时不占用任何空间 elem.style.display='none'/'block'|'inline'取消隐藏 通过修改其类列表:

elem.classList.add'hidden'//classList.remove'hidden'取消隐藏 .隐藏{ 可见性:隐藏;/*隐藏时会占用相同的空间*/ /*显示:无;/*隐藏时不占用任何空间*/ } ℹ️ 还可以使用其他属性,例如不透明性(参见@Kingfish的注释),但它们都必须通过修改样式或类列表来更新

但是对于隐藏/取消隐藏大量元素,哪一个更好? 对于一个或几个元素,修改样式或类列表也同样有效。但是我需要改变几十个甚至数百个元素的可见性。对于体积变化,以下哪种方法更好

最小化CPU使用 最小化重画延迟 最小化UI线程阻塞 我有一台速度非常快的计算机,因此很难知道它对性能受限设备的用户的影响

还有第三条路吗? 我想同时显示/隐藏的所有元素都有一个特定的类。似乎最合乎逻辑的是,我应该能够修改该类的CSS规则,即设置其CSS可见性属性,而不是为该类的数百个成员中的每一个添加/删除另一个类。我已经对此进行了研究,很少有人谈论它,这让我怀疑它是否被认为是一种黑客行为,不兼容浏览器,或者是因为其他原因而不好

有没有一个有根据的解释

还有第三条路吗

是的,有。甚至还有第四条路

我想同时显示/隐藏的所有元素都有一个特定的类。似乎最合乎逻辑的是,我应该能够修改该类的CSS规则,即设置其CSS可见性属性,而不是为所有这些元素添加/删除另一个类

是的,这是可能的,使用。获取定义规则的样式表,获取该类的规则,更改其定义

这不是黑客攻击,而且有很好的浏览器支持。很少这样做,因为很少有人知道它,而且访问正确的规则有点麻烦,您可以通过首先使用CSSOM创建和插入规则对象来解决这个问题。我不确定它的优化程度有多好,但它所需要的JS处理肯定比改变每个单独的元素要少

然而,有一个更简单的解决方案:使用级联样式表

body.hide-x .x {
    display: none; 
}
/* or, reverse:
.x {
    display: none;
}
body.show-x .x {
    display: inline;
}
*/
这将根据show-x类是否应用于正文,在文档中显示/隐藏类为x的所有元素

您可以将“显示:无”替换为“可见性:隐藏”或“不透明度:0”,或者根据需要整体应用任何其他属性更改

还有第三条路吗

是的,有。甚至还有第四条路

我想同时显示/隐藏的所有元素都有一个特定的类。似乎最合乎逻辑的是,我应该能够修改该类的CSS规则,即设置其CSS可见性属性,而不是为所有这些元素添加/删除另一个类

是的,这是可能的,使用。获取定义规则的样式表,获取该类的规则,更改其定义

这不是黑客攻击,而且有很好的浏览器支持。很少这样做,因为很少有人知道它,而且访问正确的规则有点麻烦,您可以通过首先使用CSSOM创建和插入规则对象来解决这个问题。我不确定它的优化程度有多好,但它所需要的JS处理肯定比改变每个单独的元素要少

然而,有一个更简单的解决方案:使用级联样式表

body.hide-x .x {
    display: none; 
}
/* or, reverse:
.x {
    display: none;
}
body.show-x .x {
    display: inline;
}
*/
这将根据show-x类是否应用于正文,在文档中显示/隐藏类为x的所有元素


您可以将“显示:无”替换为“可见性:隐藏”或“不透明度:0”,或根据需要整体应用的任何其他属性更改。

这可能会有所帮助:根据,不透明度:0提供最佳性能,因为它利用硬件加速,不重绘布局。当然,它会给您的显示器留下空白空间,但当您考虑将可见性作为一个选项时,这可能不是一个问题。隐藏元素仍然容易受到事件的影响一般来说,更改类比直接更改属性更可取,只是因为它的可扩展性更好,更易于管理,而不一定是因为性能。但是,在对属性进行更改时,您需要小心地将它们组织成批,以便它们可以作为单个操作进行处理,并且只会导致错误
单涂/回流焊。所以,考虑到这一点,应用类比单独更改CSS属性要好。@Kinglish谢谢这是有用的信息!但它仍然不能回答我的基本问题。见ℹ️ 注意我在上面添加了。@ScottMarcus页面特别指出“不应用”将更改为太多元素。第二条评论:如果我隐藏了300个元素,那么无论是设置样式属性还是添加类,仍然需要300个JS操作。JS具有完全相同的复杂性。你是说JS引擎一个比另一个更快,还是说其中一个的DOM渲染更快?你有消息来源吗。还是你在建议我上面提到的第三种方法?你有消息来源吗?如果有,请写一个答案!这可能会有帮助:根据,不透明度:0提供了最好的性能,因为它利用了硬件加速,并且不会重新绘制布局。当然,它会给您的显示器留下空白空间,但当您考虑将可见性作为一个选项时,这可能不是一个问题。隐藏元素仍然容易受到事件的影响一般来说,更改类比直接更改属性更可取,只是因为它的可扩展性更好,更易于管理,而不一定是因为性能。但是,在对特性进行更改时,您需要小心地将它们组织成批,以便它们可以作为单个操作进行处理,并且只会导致单个绘制/回流。所以,考虑到这一点,应用类比单独更改CSS属性要好。@Kinglish谢谢这是有用的信息!但它仍然不能回答我的基本问题。见ℹ️ 注意我在上面添加了。@ScottMarcus页面特别指出“不应用”将更改为太多元素。第二条评论:如果我隐藏了300个元素,那么无论是设置样式属性还是添加类,仍然需要300个JS操作。JS具有完全相同的复杂性。你是说JS引擎一个比另一个更快,还是说其中一个的DOM渲染更快?你有消息来源吗。还是你在建议我上面提到的第三种方法?你有消息来源吗?如果有,请写一个答案!我怎么没想到?!我已经使用了这个技巧,基本上也是这样。谢谢你这么好的书面回答!我怎么没想到?!我已经使用了这个技巧,基本上也是这样。谢谢你这么好的书面回答!