Javascript 隐藏/取消隐藏数百个DOM元素的最佳方法:更改样式或类? 双向
有两种常用方法可以使用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处理肯定比改变每个单独的元素要少 然而,有一个更简单的解决方案:使用级联样式表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'取消隐藏 .隐藏{ 可见性:隐藏;/*隐藏时会占用相同的空间*/ /*显示
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渲染更快?你有消息来源吗。还是你在建议我上面提到的第三种方法?你有消息来源吗?如果有,请写一个答案!我怎么没想到?!我已经使用了这个技巧,基本上也是这样。谢谢你这么好的书面回答!我怎么没想到?!我已经使用了这个技巧,基本上也是这样。谢谢你这么好的书面回答!