【发布时间】:2018-02-03 06:50:41
【问题描述】:
我想在我的 DOM 中动态设置给定选择器的所有元素的样式。我或多或少地看到了两种方法。对于下面的示例,我将使用 p 元素,它是 text-align 属性,但我对这两种可能的方法的优缺点更感兴趣,而不是在专门的文本对齐段落中。
1。内联(每个元素)样式
var nodes = document.getElementsByTagName('p');
Array.prototype.forEach.call (nodes, function (node) {
node.style.textAlign = "center";
});
2。样式表
var sheet = (function() {
// Create the <style> tag
var style = document.createElement("style");
// WebKit hack :(
style.appendChild(document.createTextNode(""));
// Add the <style> element to the page
document.head.appendChild(style);
return style.sheet;
})();
sheet.insertRule("p { text-align: center; }");
通常我会走内联样式的路线,因为它看起来更简单,并且可以确保样式更改会覆盖现有样式表。但我突然想到,一方面:有时不覆盖样式表可能更可取,另一方面:修改一个style 元素可能比修改一个未知数量的p 元素更高效。但这只是我的假设。
在性能方面,是否存在将内联样式应用于每个单独的元素会比创建样式表更好的情况?假设答案可能取决于我设计了多少元素,那么创建样式表是否会变得更有效率?
编辑:为了澄清我问这个问题的原因,我将解释一下我问这个问题的原因:我最近将一些我经常在项目之间复制粘贴和改编的 JS hack 变成一组可重用的 CommonJS 模块。在最高或最宽的测量值可能会因窗口调整大小或其他触发器而发生变化的情况下,它们会执行以下操作,例如将给定选择器的所有元素设置为与集合中最高或最宽的元素相同的高度或宽度。
这是一篇关于它的博文:http://davejtoews.com/blog/post/javascript-layout-hacks
这里是模块的 GitHub 存储库:
此时,所有这些模块都使用内联样式,但我正在考虑将它们转换为样式表。对于这两种方法的优缺点,我找不到一个好的答案,所以我在这里发布了这个问题。
【问题讨论】:
-
您考虑过响应性吗?我相信这就是级联样式表成为必需品的地方。您将如何内联添加
@media查询?或者你打算通过javaScript做CSS正在做的事情?你真的认为它会更快吗? -
媒体查询是个好点。对于促使我提出这个问题的用例,不会涉及媒体查询,但对于内联与样式表的一般问题,这绝对是样式表的重点。
-
我个人更喜欢第三种方式:CSS
body.p_are_centered p { text-align: center }js :document.body.classList.add('p_are_centered')。不需要时不要乱用 DOM。 (当然你可以用任何父节点替换body) -
为什么是动态的?我们感兴趣,我想这有助于理解用例,从而了解性能如何重要或受到影响。
-
@Kaiido:对于我心目中的用例,css 不是一个选项,这就是为什么我专门询问两种纯 JavaScript 解决方案之间的区别。我将在下面发表另一条评论,并编辑该帖子以详细说明我在做什么。
标签: javascript css performance dom