【发布时间】:2016-04-26 18:06:09
【问题描述】:
我在一个相当复杂的 Web 应用程序中对一些 SASS 选择器进行了小改动,发现性能显着下降。当使用 Chrome 的时间线功能分析页面时,“重新计算样式”的实例(我假设在 DOM 操作后重排页面)从大约 1 毫秒变为大约 100 毫秒,并且这些样式重新计算的受影响元素计数从大约 10 变为大约 1500。
是什么让这个选择器的变化如此邪恶?以后要注意什么,以免再犯同样的错误?
原始 CSS(快速):
.button-group .button:not(:last-of-type) {
margin-right: -1px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.button-group .button:not(:first-of-type) {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
修改后的 CSS(非常慢):
.button-group > :not(:first-of-type) .button, .button-group > :not(:first-of-type).button {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
.button-group > :not(:last-of-type) .button, .button-group > :not(:last-of-type).button {
margin-right: -1px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
【问题讨论】:
-
这和Sass有什么关系? Sass 编译缓慢 -> Sass 问题。浏览器渲染 CSS 很慢 -> 不是 Sass 问题。除非您有 Sass->CSS 编译问题,否则只发布已编译的 CSS。
-
很公平@cimmanon。但当然,这个论点并不普遍适用。 “Scala 编译缓慢 -> Scala 问题。JVM 运行字节码缓慢 -> 不是 Scala 问题。除非您遇到 Scala -> 字节码编译问题,否则只发布编译后的字节码。”是否有某种地方记录了这条规则,或者它是那些“不成文的 SO 规则”类型的东西之一?
-
浏览器并不关心 CSS 是如何生成的。调试问题需要minimal reproducible example。除非 Sass 实际上是问题的一部分(即您只能用 Sass 重现问题),否则它与所提出的问题无关。
-
@cimmanon 我认为制作 MCVE 并不禁止使用合理的抽象和/或语法糖。在我看来,这种抽象级别的选择应该由用户决定。尽管如此,在这种情况下 CSS 很好,这确实是一个元级别的讨论
-
期望用户可能会帮助您安装/查找 Sass 编译器只是为了重现问题,这是不体贴的(Sass 专家通常了解 CSS,但不能指望 CSS 专家知道萨斯)。你也没有考虑到垃圾标签甚至与问题无关(重现问题不需要Sass)。
标签: css performance css-selectors