css - 具有封闭类特异性的相邻兄弟选择器

标签 css css-selectors

我有这个 DOM:

<div class="a">
    <div class="b"></div>
    <div class="c"></div>
</div>

我想要这个 css 规则:

.b + .c { margin-left: 220px; }

但仅限于类 a

我希望这样的事情会奏效,但运气不好。

.a .b + .a .c {}

有谁知道这是否可能?

最佳答案

改用这个选择器:

.a .b + .c {
    margin-left: 220px;
}

... 或 .a > .b + .c,如果您希望规则仅应用于 .a 容器的子容器,而不是应用于它的所有后代。

Demo .

现在进行解释部分。如 CSS spec 中所定义,每个带有 + 符号的选择器都被视为选择器链:

A selector consisting of a single simple selector matches any element satisfying its requirements. Prepending a simple selector and combinator to a chain imposes additional matching constraints, so the subjects of a selector are always a subset of the elements matching the last simple selector.

现在分析您开始使用的表达式:

.a .b + .a .c

根据规范,这实际上被视为...

((.a .b) + .a) .c

换句话说,选择器被应用...

  • 所有的 .c 元素,它...
  • ... 有 .a 元素作为它们的祖先,它们...
  • ...... 有 .b 元素作为它们前面的 sibling ,它们......
  • .............有 .a 元素作为他们的祖先。

此选择器将匹配此 HTML 中的 .c 元素:

<div class="a">
  <div class="b"></div>
  <div class="a">
    <div class="c">This is matched</div>
  </div>
</div>

但是,在您的情况下,您不必检查 .c 祖先 - 仅检查 .b(它的前一个兄弟)就足够了。如果 .b 在其 DOM 树中有 .a,那么它的 sibling 肯定也有。 )

关于css - 具有封闭类特异性的相邻兄弟选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19717677/

相关文章:

jquery - IE10 - 需要将 CSS 光标更改为 "pointer"在 contenteditable <div> 中 <span> 上的鼠标输入

html - 如何让 md-sidenav 将内容推送到右边而不是重叠?

jQuery 选择器性能

css - `:first-child` 伪类存在哪些变通方法不足以解决此示例中的问题?

html - CSS 渐变背景条纹而不是平滑渐变

jquery "cannot read propery ' id' of null"when tracking event.pageX+Y

JQuery 选择器帮助

CSS 选择器 * + * 定义?

javascript - Materialise CSS 框架汉堡菜单不起作用

css-selectors - 包含具有目标的元素?