【发布时间】:2020-12-08 20:01:31
【问题描述】:
我有一些动态创建的 html 整个 css 属性都在一个对象中。所以他们需要使用 Javascript 给出。所以我使用下面的方法将样式附加到动态创建的 dom 元素。我相信每次我为附加样式进行 dom 操作时成本很高。在下面的代码本身中,有 10 行正在执行 css dom 操作。
function createNavbar() {
let nav;
nav = '<div class="navbar" id="nav"></div>';
this.body.insertAdjacentHTML("beforeend", nav);
let navBar = document.getElementById("nav");
navBar.style.display = "block"; // style appending begins
navBar.style.background = this.navColors.notice.bg;
navBar.style.color = this.navColors.notice.textColor;
navBar.style.borderWidth = "1px";
navBar.style.borderStyle = "solid";
navBar.style.borderColor = this.navColors.notice.borderColor;
navBar.style.top = this.navPositionValue[this.position].top;
navBar.style.right = this.navPositionValue[this.position].right;
navBar.style.bottom = this.navPositionValue[this.position].bottom;
navBar.style.left = this.navPositionValue[this.position].left; // style appending ends
}
从this SO Question 找到了更好的方法,所以我用下面一行代码替换了 10 行代码(使用了 cssText 属性)
navBar.style.cssText = `display: block; color: ${this.navColors.notice.textColor}; background: ${this.navColors.notice.bg}; border: 1px solid ${this.navColors.notice.borderColor}; top: ${this.navPositionValue[this.position].top}; right: ${this.navPositionValue[this.position].right}; bottom: ${this.navPositionValue[this.position].bottom}; left: ${this.navPositionValue[this.position].left};`
通过使用这种方法,我希望 Dom 操作减少到 1 而不是 10,但是该行很长且难以阅读。我想知道是否有比这更好的方法在 js 中附加长行或许多 css
【问题讨论】:
-
由于您使用的是template literals,因此您只需添加换行符(输入)即可获得更易读的代码。或者只是创建一个类并将该类添加到元素中
-
@Reyno 哦!那太棒了!我去做。我使用的方法是优化的吗?
-
使用 10 条指令来更改尽可能多的样式属性不会导致 10 次单独的 CSS 重绘,因为您在进行所有更改时不会屈服于中间的 JavaScript 事件循环。
-
@theFrontEndDev 是的,这非常好,但它们与第一个选项并没有太大区别。我还创建了一个答案,向您展示如何删除颜色和位置的大变量。它有助于提高可读性。
-
不需要优化。浏览器只会更新你的 CSS 一次。请看下面我的回答
标签: javascript css append