【问题标题】:CSS selector to select first element of a given classCSS选择器选择给定类的第一个元素
【发布时间】:2011-04-06 15:25:50
【问题描述】:

我正在尝试在具有 id 或类“B”的元素中选择“A”类的第一个元素。我尝试了 > + 和第一个子选择器的组合,因为它不是类元素“B”中的第一个元素。它起作用了,但是......我正在尝试覆盖一些默认的css并且我无法控制服务器端,并且似乎'A'类元素有时会在不同的位置生成。这是一个插图:

<class-C>
  <class-B> might have a different name
      <some-other-classes> structure and element count might differ
      <class-A></class-A> our target
      <class-A></class-A> this shouldn't be affected
      <class-A></class-A> this shouldn't be affected
  </class-B>
</class-C>

有时类“B”的名称不同,“A”之前的元素也不同。那么有什么方法可以选择元素“C”中第一次出现的“A”?因为'C'类总是在那里。我不能使用 + > 和第一个子选择器,因为第一个“A”元素的路径不同,但元素“C”始终存在,这将是一个不错的起点。

【问题讨论】:

  • 我有一个 CSS3 选择器,但对它的支持非常少(例如,除了 IE9 支持之外,没有任何 IE)。
  • 是的,CSS2 会很好。
  • 为了后代,我的新解决方案仍然使用 CSS3,但这次 IE7+ 支持它。

标签: css css-selectors


【解决方案1】:

CSS3 提供了:first-of-type 伪类,用于选择与其同级相关的类型的第一个元素。但是它没有 :first-of-class 伪类。

作为一种解决方法,如果您知道其他 .A 元素的默认样式,则可以使用带有通用兄弟组合符 ~ 的覆盖规则将样式应用于它们。这样,您就可以“撤消”第一条规则。

坏消息是~ 是一个 CSS3 选择器。
好消息是 IE 从 IE7 开始识别它,就像 CSS2 的 &gt;,所以如果你担心浏览器兼容性,唯一失败的“主要浏览器”是 IE6。

所以你有这两条规则:

.C > * > .A {
    /* 
     * Style every .A that's a grandchild of .C.
     * This is the element you're looking for.
     */
}

.C > * > .A ~ .A {
    /* 
     * Style only the .A elements following the first .A child
     * of each element that's a child of .C.
     * You need to manually revert/undo the styles in the above rule here.
     */
}

样式如何应用于元素如下所示:

<div class="C">
    <!--
    As in the question, this element may have a class other than B.
    Hence the intermediate '*' selector above (I don't know what tag it is).
    -->
    <div class="B">
        <div class="E">Content</div> <!-- [1] -->
        <div class="F">Content</div> <!-- [1] -->
        <div class="A">Content</div> <!-- [2] -->
        <div class="A">Content</div> <!-- [3] -->
    </div>
    <div class="D">
        <div class="A">Content</div> <!-- [2] -->
        <div class="E">Content</div> <!-- [1] -->
        <div class="F">Content</div> <!-- [1] -->
        <div class="A">Content</div> <!-- [3] -->
    </div>
</div>
  1. 此元素没有类 A。没有应用任何规则。

  2. 此元素具有类A,因此应用第一条规则。但是,它之前没有出现任何其他此类元素,这是 ~ 选择器所要求的,因此第二条规则应用。

  3. 此元素具有类A,因此应用第一条规则。根据~ 的要求,它也位于同一父级下具有相同类的其他元素之后,因此也适用第二条规则。第一条规则被覆盖。

【讨论】:

  • 10 个月前我在使用:first-of-type 写作时抽什么烟?
  • @BoltClock 可能是一些非常强大的东西。 ;)
  • 可以逆转这个过程吗?并选择最后一个元素而不是除第一个之外的所有元素?
  • “除了第一个 .A 是 .C 的孙子之外的所有样式”不太准确。它实际上是除了 (first-in-each-child-of-.C) 之外的所有样式。
  • @oriadam:因为 :not() 不接受组合子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 2011-09-30
  • 2011-07-14
  • 1970-01-01
相关资源
最近更新 更多