【问题标题】:CSS General Sibling Selector SpecificityCSS 通用同级选择器特性
【发布时间】:2015-02-09 11:44:35
【问题描述】:

对于文档:

<h1>Section 1</h1>
<p>I came after a h1 and should be red.</p>
<p>I came after a h1 and should be red.</p>

<h2>Section 2</h2>
<p>I came after a h2 and should be green.</p>
<p>I came after a h2 and should be green.</p>

<h1>Section 3</h1>
<p>I should be the same color as the section one text?</p>
<p>I should be the same color as the section one text?</p>

我试着给它设计样式:

h1 ~ p {
    color: red;
}

h2 ~ p {
    color: green;
} 

http://jsfiddle.net/4ks7j938/7/

我预计第 1 段和第 3 段的样式相同,第三段匹配更具体的 h1 ~ p 选择器,因为 h1h2 更接近同级。但是,在我的测试中,结果是第 2 段和第 3 段的样式相同。

两个问题:

css 选择器规范是否真的在某处指定了这种行为? css spec on the General sibling selector 似乎可以在这里解释。

如何实现第 1 段和第 3 段的样式相同的预期结果?我不能向 html 添加类或任何属性,我只能控制 css。

【问题讨论】:

标签: css css-selectors css-specificity


【解决方案1】:

两个选择器具有相同的特异性,导致h2 ~ p 优先的原因是它在之后定义,因此级联于h1 ~ p。兄弟姐妹的亲密程度无关紧要。
对于您想要的行为,您可以使用 adjacent sibling selector +

如果你改变h1 ~ p,你会看到它需要精确

h2 ~ p {
    color: green;
}

h1 ~ p {
    color: red;
}
<h1>Section 1</h1>
<p>I came after a h1 and should be red.</p>
    
<h2>Section 2</h2>
<p>I came after a h2 and should be green.</p>

<h1>Section 3</h1>
<p>I should be the same color as the section one text?</p>

【讨论】:

  • 你刚刚打败了我:p
  • 您的订购解释是有道理的(但仍然不是我所期望的)。但是您的相邻兄弟选择器解决方案不起作用,或者说它工作得很好,足以解决最初发布的非常有限的示例问题。它不适用于每个部分的多个元素,但我已经更新了 jsfiddle 和示例。
  • @MattBierner 我想不出一个通用目的来解决您的问题,我只会使用h1+p,h1+p+p,h1... 来表示可能有多少p
  • @AbdelrahmanGobarah sn-p 是为了演示答案中解释的行为,因此完全按预期工作。
【解决方案2】:

Musa 似乎是正确的,在一般情况下仅使用 CSS 无法解决此问题。

但这是三个部分的一种解决方案:

h1 ~ p,
h1 ~ h1 ~ p {
    color: red;
}

h2 ~ p {
    color: green;
}

http://jsfiddle.net/4ks7j938/12/

或者,根据交织的数量,这也可能起作用,并且可能扩展到更多部分:

h1 ~ p,
h1 ~ h2 ~ h1 ~ p,
h1 ~ h2 ~ h1 ~ h2 ~ h1 ~ p
/* add more as needed */ {
    color: red;
}

h2 ~ p,
h2 ~ h1 ~ h2 ~ p,
h2 ~ h1 ~ h2 ~ h1 ~ h2  ~ p
/* add more as needed */ {
    color: green;
}

http://jsfiddle.net/4ks7j938/15/

然而,这两种方法都不是特别可扩展的。

【讨论】:

    【解决方案3】:

    多么棘手的问题! 如果您有权添加一些 jQuery,那么一些 traversing methods 可能会有用。 以下方法可行,但您需要使其适合您的特定需求,因此另一种方法可能会更好。

    $( "h1" )
      .nextUntil( "h2" )
        .css( "color", "red" );
    
    $( "h2" )
      .nextUntil("h1")
        .css( "color", "green" );
    

    updated fiddle

    【讨论】:

    • 提出的问题是对 CSS 选择器和特异性的基本误解。你的答案是“搞砸了,让我们使用 JavaScript”,而不是尝试真正理解 CSS 中发生了什么。
    • 其他一些答案已经让我们深入了解如何使用 CSS 解决这个问题。我发现这个 jQuery 方法实际上解决了这个特定的问题,并建议可能还有其他选择。我不是说搞砸,我只是提供另一种可能的解决方案。建一座桥。
    【解决方案4】:

    您的代码在第一行有h1 标签的css,因此它将查找所有ptag,这是h1 标签的兄弟,并将红色应用于所有p 标签。在下一行,它将找到两个位于第一个'h1tag and those twop`标签下方的p标签将应用于第二个css。这是您遇到的一个令人兴奋的问题。 现在你的问题的解决方案是 css3 adjecent siblings selector

    看看这个小提琴:http://jsfiddle.net/4ks7j938/9/

    【讨论】:

    • 查看更新后的示例,每个部分包含许多元素,了解为什么相邻选择器不适用于更一般的情况:jsfiddle.net/4ks7j938/10
    【解决方案5】:

    您可以使用此代码:

    h1 ~ p {
        color: red; 
    }
    h2+p{
        color: green; 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-15
      • 2011-05-03
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      相关资源
      最近更新 更多