【问题标题】:The Most Efficient CSS Selector: Header Tag, Class or ID? [closed]最高效的 CSS 选择器:标题标签、类还是 ID? [关闭]
【发布时间】:2013-01-04 22:41:07
【问题描述】:

由于我们在 HTML5 中有新元素(HEADER、FOOTER、SECTION...),我们应该如何构建我们的 CSS 选择器以提高性能?

header {}
header nav {}
header nav ul li{}

#header {}
#header .nav{}
#header .nav .menu{}

或者以其他更有效的方式?

【问题讨论】:

  • css 表示级联样式表,这意味着您可以最好地重复使用其他标签的最大值,考虑到这一点,这取决于您的网站/应用程序...
  • 假设我将在页面中只使用一次标题,那么如果我使用header#header 对吗?
  • 否决选民请发表评论?
  • 浏览器会更快地找到类,但在你的情况下,“更快”在这里根本不明显
  • 我绝对不同意这个问题正在关闭。怎么没有建设性?

标签: css html css-selectors


【解决方案1】:

如果您所说的“效率”是指它如何影响页面的加载时间,那么您应该坚持使用类和 ID 而不是标签名称。 Google 有一个 best practices page 用于编写您可能会感兴趣的快速 CSS。他们建议的要点是减少浏览器必须排序的元素数量。

页面上最相关的一点是,“更喜欢类和 ID 选择器而不是标签选择器。” 稍后我们将看到,这实际上只会在这些类时提高效率和 ID 选择器会减少匹配元素的数量。

不过,在我开始讨论之前,让我们从该页面的建议总和得出其合乎逻辑的结论。我们应该发现编写 CSS 最有效的方法是为页面上的所有内容应用 ID,并且只使用 ID 选择器。但是你应该这样做吗?应该不会吧。

原因是在编写 CSS 时还有其他因素需要考虑。以下是一些:

  1. 无论您的选择器效率多么低,您页面上的其他内容可能比处理 CSS 花费的时间要长得多。如果您将时间花在优化上,最好花在其他地方。
  2. 您希望保留您的网页semantic,这绝对不意味着要为您网页上的所有内容提供 ID。
  3. 维持这样的结构会很痛苦
  4. 这将是不美观的 HTML

我从这一切中得出的结论是,只要您不牺牲太多上述几点,尤其是第一点和第二点,就遵循效率的最佳实践。

对于您的具体示例,最简单的答案是底部选择器如果减少匹配项的数量会更有效。

逐一浏览:

header#header

如果您的页面上有多个标题元素,则 ID 总是更有效。如果只有一个标题,那么它们应该同样快速。

header nav#header .nav

Google 最佳实践页面告诉我们,后代选择器是 CSS 中效率最低的选择器。

这是因为 CSS 从右到左读取。一旦它找到最右边的后代,它需要通过 DOM 树返回以确定其父代是否匹配。它必须为每场比赛都这样做。

选择器在匹配失败时会停止解释。因此,如果它正在寻找 nav 并在 ul 上运行,它就不会在 DOM 树上寻找该 ul 的标题父级。这不应该让我们太惊讶,但我只是想为了完整起见我会提到它。

这些点共同使我们得出结论,在使用后代选择器时,您希望选择器的最右边部分尽可能具体。这样可以最大限度地增加不匹配的元素数量,从而最大限度地减少慢速 DOM 树搜索的次数。

回到您示例中的两个选择器:如果您有多个带有多个导航的标题,但其中只有少数具有.nav 类,那么右侧会更有效。 如果您只有一个 ID 为 header 的 header 和一个 ID 为 nav 的 nav,那么它们将同样快速。

header nav ul li#header .nav .menu

之前的相同规则适用于这种情况。然而,在这种情况下,由于这里有两个后代选择器,而不仅仅是一个,这一事实放大了速度上的差异。

如果您的页面有多个无序列表,那么您可能希望使用这两个选择器中的第二个,以防止页面上的每个 li 匹配这个(更)复杂的选择器。

【讨论】:

  • 我喜欢你的答案,但是这一行,“(当一个类只用于一个标签时,无论如何这是一个很好的设计实践)”咬我,因为它再次提出 css 建议。
  • 所以你的意思是最好给<header id="header" > asd apply css to the #header
  • @Ark,我解释那条线的方式与你的方式相反。我将其解读为“不仅使用 .class #id 之类的东西不好,而且无论如何你都应该避免将类用于一件事”,而第二个子句将其称为良好的设计实践。并不是说为一个实例使用一个类是一种好的设计实践。
  • @Champ,我详细说明了我的答案,包括您的具体示例。如果您有任何其他问题,请告诉我。
【解决方案2】:

这取决于它们将如何被使用。如果它们只需要设置一次样式,则使用 header {} 否则添加类和/或 ID。

【讨论】:

  • 你的出发点是他在导航中不会有超过一个 li 或 ul,这并不完全正确
猜你喜欢
  • 2011-11-17
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 2023-02-15
相关资源
最近更新 更多