【问题标题】:Doesn't CSS first-child or last-child work with class wise? [duplicate]CSS first-child 或 last-child 不能与类明智地一起使用吗? [复制]
【发布时间】:2017-05-16 07:36:13
【问题描述】:

也许这个问题很荒谬,但我想知道这个事实。我有一个带有两个类的li 元素(见下文),但它没有按我预期的那样工作。有人知道原因吗?

.red:first-child {
    color:#F00;
}
.blue:first-child {
    color:#00F; /* not working */
}
.red:last-child {
    color:#F00; /* not working */
}
.blue:last-child {
    color:#00F; 
}
<ul>
    <li class="red">one</li> <!-- This is the first child of red -->
    <li class="red">two</li>
    <li class="red">three</li>
    <li class="blue">one</li> <!-- and this first child of blue -->
    <li class="blue">two</li>
    <li class="blue">three</li>
</ul>

【问题讨论】:

  • 它按预期工作。 &lt;li class="blue"&gt;one&lt;/li&gt; 不是父 ulfirst-child
  • @Satpal:不,它没有按预期工作......
  • 问题存在于对:first-child:last-child选择器的错误理解。只有当一个元素分别是其父元素的第一个或最后一个子元素时,它们才会选择任何元素。
  • 您的选择器 .blue:first-child 不起作用,因为 .blue 不是父母的第一个孩子。这是这个选择器实现背后的想法,对我来说它很合乎逻辑。
  • @mnemosdev: 不,ul:first-child 匹配 ul 的方式与 ul.example(带有类选择器)匹配 ul 的方式大致相同。它与其他元素不匹配。同样, .red:first-child 匹配任何具有 .red 类的元素,而不是其父级或子级。

标签: html css


【解决方案1】:

正如其他人所提到的, :first-child 正在按预期工作,作为父母的第一个孩子。

:first-child 选择器用于选择指定的选择器,仅当它是其父级的第一个子级时。

来源:CSS :first-child Selector

你可以像这样到达第一个 .blue:

.red + .blue

或者如果你想在 .red 之后得到所有的 .blue

.red ~ .blue

您可能希望使用 :first-of-type 选择第一个类型,但那些 .blue 必须是不同的 HTML 元素。

div.red:first-of-type {
    color:#F00;
}
div.red:last-of-type {
    color:#00F;
}
p.blue:first-of-type {
    color:#F00;
}
p.blue:last-of-type {
    color:#00F; 
}
<div>
    <div class="red">one</div>
    <div class="red">two</div>
    <div class="red">three</div>
    <p class="blue">one</p>
    <p class="blue">two</p>
    <p class="blue">three</p>
</div>

【讨论】:

  • 不。 :first-of-type 也不查看类。
  • 你是对的@BoltClock,它没有。据我所知,在课堂上没有这样做的选择。但是,您可以使用我在答案中包含的其他选择器到达第一个蓝色。
  • 我同意。我确实认为 :first-of-type 甚至不应该被考虑,因为 ul 只能将 li 作为孩子(这意味着 both pseudo-classes will always match the same element),而且我个人不喜欢更改 HTML 以适应 CSS 选择器。但我删除了我的反对票。
【解决方案2】:

它不起作用,因为你对浏览器说的是(红色的情况,蓝色的情况类似):

  1. 找到所有元素.red
  2. .red 元素列表中,选择第一个 (first-child)。
  3. 给它应用红色。

浏览器按预期工作并将红色应用于列表的第一个元素。

编辑:

蓝色的情况是因为 CSS 总是寻找最精确的规则。如果两个规则具有相同的精度级别,则最后一个获胜,因此在这种情况下,最后一个 .blue:last-child 获胜,.blue:first-child 将被忽略。

【讨论】:

  • "蓝色的很相似" 这就是为什么提问者 期望 .blue:first-child 匹配第一个 .blue 元素。但事实并非如此。
  • 对不起,我没有读到它,“mea culpa”。在这种情况下,两个选择器具有相同的“精度级别”,我的意思是,它们并不比彼此更精确,因此“最后一个”规则适用,颜色是最后一个蓝色。
  • 这与特异性无关。特异性并不排除 .blue:first-child 和 .blue:last-child 同时匹配不同的元素(或相同的元素)。
  • @BoltClock 你是对的。这是一个codepen,订单已更改。
【解决方案3】:

因为它考虑李列表。首先,您必须提及第一个孩子,因此请先执行命令以显示红色。然后将最后一个代码作为蓝色最后一个孩子,因此将最后一个代码显示为蓝色。

它不考虑红色和蓝色类订单。它考虑了li list和periorities。

【讨论】:

  • 这是我的问题,为什么它不考虑类明智
  • 它只考虑父元素和子元素,例如 ul 作为父元素,将 li 作为子元素。不上课。
猜你喜欢
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 2013-03-03
  • 2016-06-24
  • 2014-10-16
  • 2014-11-21
  • 1970-01-01
  • 2011-12-17
相关资源
最近更新 更多