【问题标题】:How does Chrome dev tools generate CSS selectors?Chrome 开发工具如何生成 CSS 选择器?
【发布时间】:2014-04-21 01:42:15
【问题描述】:

为元素添加新样式规则时,Chrome 生成的选择器包含整个层次结构,而不仅仅是类名。

例如:

<body>
      <div class="container">
           <span class="helper"></span>
      </div>
</body>

.helper 添加新的样式规则将生成类似body &gt; div &gt; span 的选择器,而不仅仅是.helper。这是为什么呢?

【问题讨论】:

  • 我也注意到了这一点——不过还没有深入研究。
  • 我也想要一个答案
  • 你是说当你跨越它时,它会采用 body 和 parent div 的样式属性?

标签: html css google-chrome css-selectors google-chrome-devtools


【解决方案1】:

发生这种情况的原因有多种。在不知道所采用的确切属性的情况下,很难分辨。也看到你的CSS也会有所帮助。

据我所知,您在问为什么当您 &lt;span class"helper"&gt; 它同时具有其父 div 和父 body 属性。

这可能是因为它本身是bodydiv 的子代

这里的另一个合乎逻辑的解释是一个工作示例 jsfiddle

根据您的元素,您可能会遇到一些冲突。在我的示例中,添加了!important 标记,使其color 属性优先于span class 但在下一行中它适用。

<body>
      <div class="container">
           <span class="helper">I am being applied</span>
          <div>
              <span class="helper">I am helper but i am not red</span>
          </div>    
      </div>
</body>

body > div > span {
    color: red !important;
}
.helper { color: green }

【讨论】:

  • 我相信 OP 指的是 Chrome DevTools 元素面板中的“新样式规则”按钮,而不是 CSS 继承。
【解决方案2】:

除非我查看源代码本身,否则无法准确分析浏览器的实现。但我能说的是,浏览器需要确保您添加的样式规则仅适用于工作 DOM 中的特定元素和类,其目的是将一个 或多个 相关元素,不是很适合这个目的。

由于类的工作方式,浏览器不能假定您的类只分配给该span 元素,因为它不知道您是如何编写 HTML 的。 NichoDiaz 给出的示例说明了一个简单但有效的示例:.helper 不一定是body &gt; div &gt; span,因为它很可能是body &gt; div &gt; div &gt; span,无论是现在还是以后。

因此,与其对 helper 类做出假设(即使在您的 DOM 中只有一个元素拥有它),而是对元素的结构做出假设,这要可靠得多。由于它看到只有一个 spandiv 的子代 body 的子代,因此它会为您选择为其添加样式规则的元素生成选择器 body &gt; div &gt; span . (推测它以body &gt; 而不是html &gt; body &gt; 开头的原因是因为body总是html 的子级,这使得额外的约束完全多余。)

当然,一旦您添加了第二个span 元素,样式规则也将应用于该元素。同样,浏览器无法预料到这一点,但如果您不希望将样式规则应用于该新元素,则可以轻松修改规则以将 :nth-child(1) 添加到选择器的末尾。

如果您添加第二个span 元素 在第一个元素上创建新样式规则,您会看到浏览器生成了一个更具体的选择器body &gt; div &gt; span:nth-child(1)。如果它尝试使用.helper 而不是:nth-child(1) 生成选择器,即body &gt; div &gt; span.helper,它将匹配两个元素,这显然不是突出显示 one 元素并添加特定元素的样式规则

【讨论】:

  • +1 这是有道理的,尽管在大多数调试情况下,我只需编辑 .helper 规则属性以影响与规则匹配的所有元素,或者仅编辑元素的样式以影响单个元素. “新规则”按钮对于添加自定义规则而不是复制现有规则/创建单个元素规则似乎更有用。
  • @Fabrício Matté:你说得对,我忘了有一个选项可以编辑元素的样式。在这种情况下,也许浏览器只是试图确保规则在首次创建时不会无意中匹配其他元素,因此它构造了一个仅匹配该元素的选择器并将其用作占位符。
  • @Fabrício Matté:还有级联问题 - element.style 被添加为内联样式而不是内部样式表,尽管我不确定大多数人如何将其视为问题用户。
  • BoltClock - 你说的有道理,但它怎么才开始表现得那样呢?我不记得过去的那种行为......
猜你喜欢
  • 2012-03-02
  • 2020-08-26
  • 1970-01-01
  • 2014-02-04
  • 2013-08-04
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 2013-10-27
相关资源
最近更新 更多