【发布时间】:2012-12-10 10:01:31
【问题描述】:
我正在努力学习编写更高效的 CSS,尤其是当我正在处理一个需要快速呈现的相当复杂的网站时。
我习惯在我的 HTML/CSS 中有很多这样的内容(主要是因为我喜欢可读性):
.spotlight {}
.spotlight ul {}
.spotlight ul li {}
.spotlight ul li a {color: #333;}
<div class="spotlight">
<ul>
<li><a href="">link</a></li>
<li><a href="">link</a></li>
<li><a href="">link</a></li>
</ul>
</div>
我现在了解到浏览器从右到左运行 CSS 规则匹配过程,这意味着上面最后一个 CSS 规则中的 <a> 元素将首先匹配页面上的每个链接,从而导致性能损失。
因此,据我所知,浏览器友好的解决方案将更具体,并使用,例如:
.spotlight {}
.spotlight-link {color: #333;}
<div class="spotlight">
<ul>
<li><a class="spotlight-link" href="">link</a></li>
<li><a class="spotlight-link" href="">link</a></li>
<li><a class="spotlight-link" href="">link</a></li>
</ul>
</div>
(假设我尽可能使用继承,但通常仍需要对树下的最后一个元素进行特定控制)
让我怀疑的是:在整个页面中的元素上打印类名所产生的所有额外 HTML 膨胀难道不会抵消避免嵌套 CSS 子选择器所带来的性能提升吗?我习惯于尝试编写更少的 HTML,而这种做法与它背道而驰。任何见解将不胜感激。
【问题讨论】:
-
通常避免后代选择器的原因(在实践中)不是性能,而是 CSS 范围/维护(很难在评论中真正解释)。浏览器解析 CSS 的速度非常快,我真的不会太担心。如果你真的很担心速度而不是维护,你可以使用单字符类名 。
-
@Wesley Murch:“通常避免后代选择器的原因(在实践中)不是性能,而是 CSS 范围/维护”不幸的是,that's not what they'd like to have you think...
-
“在整个页面中的元素上打印类名称所产生的所有额外 HTML 膨胀难道不会抵消避免嵌套 CSS 子选择器所带来的性能提升吗?”确切地。为了客户端性能而膨胀所有 HTTP 请求确实没有意义。
-
郑重声明,Mozilla 的文章最初是为设计自己的 UI 设计的,其中客户端性能是可以理解的至高无上的。我无法忍受他们对某些选择器做出的所有歧视性概括。后代组合器已经存在了将近 20 年。如果 20 年后浏览器仍然无法快速匹配它们,那么有些事情是非常非常错误的。这很愚蠢。
-
我只是完全避免使用 JavaScript、CSS 和 HTML——它们对性能非常不利。哦,不要让我开始使用图像...
标签: html css performance css-selectors