CSS3选择器:具有类名的第一个类型?

时间:2011-06-22 21:57:25

标签: css css3 css-selectors

是否可以使用CSS3选择器:first-of-type来选择具有给定类名的第一个元素?我的测试没有成功,所以我认为不是吗?

代码(http://jsfiddle.net/YWY4L/):

p:first-of-type {color:blue}
p.myclass1:first-of-type {color:red}
.myclass2:first-of-type {color:green}
<div>
  <div>This text should appear as normal</div>
  <p>This text should be blue.</p>
  <p class="myclass1">This text should appear red.</p>
  <p class="myclass2">This text should appear green.</p>
</div>

9 个答案:

答案 0 :(得分:306)

不,只使用一个选择器是不可能的。 :first-of-type伪类选择其类型的第一个元素(divp等)。使用具有该伪类的类选择器(或类型选择器)意味着如果元素具有给定类(或者具有给定类型)则选择元素是其中的第一个类型兄弟姐妹。

不幸的是,CSS不提供只选择第一次出现的:first-of-class选择器。作为一种解决方法,您可以使用以下内容:

.myclass1 { color: red; }
.myclass1 ~ .myclass1 { color: /* default, or inherited from parent div */; }

解决方法的说明和插图是herehere

答案 1 :(得分:41)

草稿CSS选择器级别4建议在:nth-child selector内添加of <other-selector>语法。这将允许您挑选匹配给定其他选择器的 n 子项:

:nth-child(1 of p.myclass) 

以前的草稿使用了一个新的伪类:nth-match(),因此您可能会在该功能的一些讨论中看到该语法:

:nth-match(1 of p.myclass)

现在已经implemented in WebKit,因此可以在Safari中使用,但似乎是the only browser that supports it。已经提交了实施它的门票Blink (Chrome)Gecko (Firefox)request to implement it in Edge,但其中没有任何明显的进展。

答案 2 :(得分:10)

可以使用CSS3选择器:first-of-type 来选择具有给定类名的第一个元素。

但是,如果目标元素具有前一个元素兄弟,则可以组合negation CSS pseudo-classadjacent sibling selectors以匹配不具有前一个具有相同类名的元素的元素:

:not(.myclass1) + .myclass1

完整的工作代码示例:

p:first-of-type {color:blue}
p:not(.myclass1) + .myclass1 { color: red }
p:not(.myclass2) + .myclass2 { color: green }
<div>
  <div>This text should appear as normal</div>
  <p>This text should be blue.</p>
  <p class="myclass1">This text should appear red.</p>
  <p class="myclass2">This text should appear green.</p>
</div>

答案 3 :(得分:9)

我找到了一个供您参考的解决方案。从某些组div中选择两个相同类div的组第一个

p[class*="myclass"]:not(:last-of-type) {color:red}
p[class*="myclass"]:last-of-type {color:green}

顺便说一句,我不知道为什么:last-of-type有效,但:first-of-type不起作用。

我在jsfiddle的实验...... caniuse.com

答案 4 :(得分:7)

这是一个旧线程,但我正在回应,因为它仍然在搜索结果列表中显得很高。现在未来已经到来,你可以使用:nth-​​child伪选择器。

p:nth-child(1) { color: blue; }
p.myclass1:nth-child(1) { color: red; }
p.myclass2:nth-child(1) { color: green; }

:nth-​​child伪选择器功能强大 - 括号接受公式和数字。

更多信息:https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-child

答案 5 :(得分:3)

作为后备解决方案,您可以将类包装在这样的父元素中:

<div>
    <div>This text should appear as normal</div>
    <p>This text should be blue.</p>
    <div>
        <!-- first-child / first-of-type starts from here -->
        <p class="myclass1">This text should appear red.</p>
        <p class="myclass2">This text should appear green.</p>
    </div>
</div>

答案 6 :(得分:0)

不确定如何解释这一点,但今天我遇到了类似的情况。 .user:first-of-type{}工作正常时无法设置.user:last-of-type{}。 我将它们包装在没有任何类或样式的div中后,此问题已解决:

https://codepen.io/adrianTNT/pen/WgEpbE

<style>
.user{
  display:block;
  background-color:#FFCC00;
}

.user:first-of-type{
  background-color:#FF0000;
}
</style>

<p>Not working while this P additional tag exists</p>

<p class="user">A</p>
<p class="user">B</p>
<p class="user">C</p>

<p>Working while inside a div:</p>

<div>
<p class="user">A</p>
<p class="user">B</p>
<p class="user">C</p>
</div>

答案 7 :(得分:0)

您可以通过选择该类中同级兄弟中的每个元素并将其反转来完成此操作,这将选择页面上几乎所有的元素,因此您必须再次按该类进行选择。

例如:

<style>
    :not(.bar ~ .bar).bar {
        color: red;
    }
<div>
    <div class="foo"></div>
    <div class="bar"></div> <!-- Only this will be selected -->
    <div class="foo"></div>
    <div class="bar"></div>
    <div class="foo"></div>
    <div class="bar"></div>
</div>

答案 8 :(得分:-5)

简单:first对我有用,为什么还没有提到这个?