伪类选择器之E:first-child系列和E:first-of-type系列


刚开始学习选择器,一开始对伪类选择器确实有点懵。昨天晚上自己动手写了写,终于是慢慢搞懂了。下面对一些容易误解的一些知识点做个总结,便于以后复习和查阅。


一.E:first-child

  • 我们先来看看:first-child,一开始我就对这个伪类选择器误解了,以为只是选择某个元素的第一个子元素。举个例子:
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>伪类选择器</title>
<style>
p:first-child{
  color: yellow;
}
li:first-child{
  background: #ccc;
}
span:first-child{
  color: red;
}
</style>
</head>
<body>
  <div>
    <h3> <em>My</em> <span>goal</span></h3>
    <p>Next stage</p>
    <ol>
      <li>Learn the front knowledge.</li>
      <li>Find a satisfactory internship.</li>
      <li>Find a <span>good job</span> when graduating.</li>
    </ol>
    <p>Come on!</p>
  </div>
</body>
</html>

我们可以事先想一下结果会是什么。
先分析一下。在上面的例子中作为某个父元素的第一个子元素的有:第一个h3、第一个em、第一个span、第一个p、第一个li。
再来看看第一个样式,p:first-child{color: yellow;},它的意思不是说要把p元素的第一个元素变成黄色,而是说把作为某个元素第一个子元素的所有p元素设置为黄色。也就是说它必须要满足两个条件:第一,必须为p标签;第二,必须要为某个父元素的第一个子元素。按照这么说来,例子中没有符合条件的p标签。
然后再来看看第二个样式,li:first-child{background: #ccc;},将作为某个元素(ol或者ul)的第一个子元素li设置背景色为灰色,显而易见,有符合条件的li元素,那就是<li>Learn the front knowledge.</li>
最后再来看看第三个样式,span:first-child{color: red;},它就是说把作为某个元素第一个子元素是span的元素颜色变为红色。从上面的例子来看,span有两次出现。第一次是作为h3的第二个子元素,所以不满足要求。再来看看第二个span,它是作为li的第一个子元素,满足了两个条件,所以肯定会变成红色。
结果和预想的完全吻合:

first-child

  • 为了加深理解咱们再来举两例:
  • 例1:
<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>first-child</title>
<style>
.fruit p:first-child{
 color: red;
}
.fruit > p:first-child{
 text-align: center;
}
</style>
</head>
<body>
<div class="fruit">
  <p>There are many fruit.For example:</p>
    <ul>
      <li>grape</li>
      <li>banana</li>
      <li>watermelon <p>and so on.</p></li>
    </ul>
  <p>Which is your favorite?</p>
</div>
</body>
</html>

上面的代码中写了两个样式,其中会牵扯到组合选择器。我们先来看看第一个,.fruit p:first-child{color: red;}。这是一个后代选择器,这在我的另一篇博客:CSS选择器当中做过说明。它用来匹配.fruit的所有后代(不只是子元素、还包括子元素向下递归),而在这里后代的要求为:必须是p元素且必须为某个元素的第一个子元素。这样说来满足要求的就是:
<p>There are many fruit.For example:</p><p>and so on.</p>,所以结果是把它们渲染为红色。再来看看第二个样式,.fruit > p:first-child{text-align: center;}。这是一个直接子元素选择器,它用来匹配.fruit的直接子元素(不包括向下递归的元素,而是同一层级的第一层子元素。),而直接子元素的要求为:必须是p元素且必须为某个元素的第一个子元素。这样说来满足要求的就是:<p>There are many fruit.For example:</p>
再来看看结果,和预想的完全一样。

后代选择器和:first-chlid组合使用

  • 例2:
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>first-child</title>
<style>
p:first-child span{
  font-weight: bold;
}
</style>
</head>
<body>
 <div class="hello">
   <p><em>Hello</em>,my name is <span>cao tingting</span>.I'm a <span>new-comer</span> here and relly <span>appreciate</span> your advice.</p>
 </div>
</body>
</html>

例2中只有一个样式,它表示什么意思呢?p:first-child span,首先找到某个元素第一个子元素是p的标签,再来找到p里面所有的<span>。那么显而易见,在这个例子中就是<span>cao tingting</span><span>new-comer</span>以及<span>new-comer</span>,将他们设置粗体。

效果

总结:E:first-child要满足两个条件。第一:必须是E元素;第二:必须要是某元素的第一个子元素。

二.E:first-of-type

这个伪类选择器的含义就是匹配父元素下使用同种标签的第一个子元素(等同于:nth-of-type(1)),它和E:first-child不一样。它主要强调同种类的标签中的第一个而不管这类标签是否是第一个出现。也就是说先找出所有的E元素再找到第一个。下面来举个例子进行说明,我们就用第一个例子来说明,以便进行对比。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>伪类选择器</title>
<style>
p:first-child{
  background: #ccc;
}
p:first-of-type{
   color: red;
}
</style>
</head>
<body>
  <div>
    <h3><em>My</em> <span>goal</span></h3>
    <p>Next stage</p>
    <ol>
      <li>Learn the front knowledge.</li>
      <li>Find a satisfactory internship.</li>
      <li>Find a <span>good job</span> when graduating.</li>
    </ol>
    <p>Come on!</p>
  </div>
</body>
</html>

前面已经分析过为什么p:first-child会没有效果,咱们再来看看p:first-of-type,首先找出所有的p元素,再来看看第一个是谁,这里面就是<p>Next stage</p>,所以它渲染为红色。

效果对比图

总结:E:first-of-type强调的是以元素种类划分,即先找到所有的E元素,再来找到第一个。

三.以此类推的E:nth-child(n)和E:nth-of-type(n)等等

关于n的取值,它可以为: 1,2,3,4,5; 2n+1, 2n, 4n-1; odd, even。

  • nth-child(n)
    它表示匹配其父元素的第n个子元素,第一个编号为1。如果第n个子元素为E,则被选中。它其实和E:first-child是一个原理,都要满足上面提到的两个条件。
    与E:first-child原理相同的还有:
    E:nth-last-child(n),表示匹配其父元素的倒数第n个子元素,第一个编号为1;
    E:last-child,表示匹配父元素的最后一个子元素,等同于:nth-last-child(1);

  • E:nth-of-type(n)
    它表示匹配同一种类标签的第n个子元素。它的原理和E:first-of-type一样。
    与E:first-of-type原理相同的还有:
    E:nth-last-of-type(n),表示匹配作为某个元素子元素E(只计算使用同种标签的元素)的倒数第n个元素。
    E:first-of-type:匹配父元素下使用同种标签的第一个子元素,等同于:nth-of-type(1)
    E:last-of-type:匹配父元素下使用同种标签的最后一个子元素,等同于:nth-last-of-type(1)
    为了看的更明显,再来举个例子吧。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>对比</title>
<style>
span:nth-child(2n){
  background: yellow;
}
span:nth-of-type(2n){
  color: red;
}
</style>
</head>
<body>
 <div class="box">
   <div class="content">
     <h3>标题</h3>
       <span>内容1</span>
       <span>内容2</span>
     <p>这是一个<span>很长</span>的<span>段落。</span></p>
   </div>
       <ol>
         <li>列表<span>内容</span></li>
         <li>列表内容</li>
         <li>列表内容</li>
       </ol>
 </div>
</body>
</html>

结果也是可以预料的。


结果对比

到此为止应该对这一块都很清楚了吧。


再来补充几点用法

四.感知子元素的个数

.list li:nth-last-child(n+4) ~ li,
.list li:nth-last-child(n+4):first-child {
  color: red
}

:nth-last-child(n+4)这一个选择器的意思就是倒数第四个以及之前的元素,后面加了~ li,就是表示符合前面条件的元素之后的li元素。
如果总数不够四个,就不会选择任何元素。
但是如果只用~ li,是不会匹配到第一个li的,所以又加上了li:nth-last-child(n+4):first-child
实现了根据元素个数的多少来应用不同的样式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容