首先看一个例子

<div>
<p>第一个段落</p>
<p>第二个段落</p>
</div> p:nth-child(2) {
background: red;
}
p:nth-of-type(2) {
background: yellow;
}

分别执行两段 css, 发现效果是一样的,如下:

但是如果文档的结构变得更加复杂呢?看下面一个例子:

<body>
<h1>这是标题</h1>
<p>这是副标题</p>
<div>
<p>第一个段落。</p>
<p>第二个段落。</p>
<p>第三个段落。</p>
<p>第四个段落。</p>
</div>
<p>这是注释</p>
<p>Internet Explorer 不支持 :nth-child() 选择器。</p>
</body>
p:nth-child(2) {
background: red;
}
p:nth-of-type(3) {
background: yellow;
}

此时的样式应该是怎样的呢?效果如下:

平时开发中对于 nth-child(n)和 nth-of-type(n) 常用在一些需要单独渲染的列表元素的选取上面,因为结构单一,所以不难区分,久而久之就容易对两者的用法产生混淆,虽然概念和用法都比较简单,但是一些教程和文档上面的描述比较绕,理解起来比较困难,所以这里针对上面的例子,通过集合的方式来简单的辨析一下两种元素选取方式的区别。

ele:nth-child(n)

选取父元素的第 N 个子元素,不论元素的类型。n 可以是数字(从 1 开始),关键词(even/odd),或者公式(3n + 1, 2n + 1...)

元素的选取方式和过程:

  1. 选取 ele 的父元素的所有一级子元素 => 集合 P(不分类型,若有多个 ele,则分别选取,最终生成多个集合)
  2. 在集合 P 中选取第 n 个,判断类型是否为 ele,若是,则返回元素,否则返回空

针对上例子,首先选取 p 元素的父元素的所有一级元素,形成集合,因为有多个 p 元素,所以要分别选取,最终形成两个子元素集合

body 下的所有子元素集合 P

[
<h1>这是标题</h1>,
<p>这是副标题</p>,
<div>...</div>,
<p>这是注释</p>,
<p>Internet Explorer 不支持 :nth-child() 选择器。</p>,
]

div 下的所有子元素结合 K

[
<p>第一个段落。</p>,
<p>第二个段落。</p>,
<p>第三个段落。</p>,
<p>第四个段落。</p>,
]

在 P 中选取第 2 个元素 ——> 判断元素类型是否为 p ——> 是 ——> 返回此元素

<p>这是副标题</p>

在 K 中选取第二个子元素 ——> 判断元素类型是否为 p ——> 是 ——> 返回此元素

<p>第二个段落。</p>

ele:nth-of-type(n)

选取父元素的第 N 个类型为 ele 的子元素。

  1. 选取父元素的所有类型为 ele 的子元素 => 集合 N
  2. 选取这些子元素集合 N 中的第 n 个,并返回

第一步生成集合 M 和 N

[
<p>第一个段落。</p>,
<p>第二个段落。</p>,
<p>第三个段落。</p>,
<p>第四个段落。</p>,
]
[
<p>这是副标题</p>,
<p>这是注释</p>,
<p>Internet Explorer 不支持 :nth-child() 选择器。</p>,
]

然后分别选取 M 和 N 中的第三项,返回:

<p>第三个段落。</p>
<p>Internet Explorer 不支持 :nth-child() 选择器。</p>

简单总结来说,nth-child(n) 可以理解为先无条件选择子元素,后选择对应序号的元素并判断类型是否符合

nth-of-type(n) 则是先根据类型选择子元素,然后直接选择对应序号的元素即可。

参考:https://juejin.im/post/59bce23c51882519777c5eb5

http://www.w3school.com.cn/cssref/selector_nth-child.asp

浅析 nth-child(n) 和 nth-of-type(n)的更多相关文章

  1. Selenium Xpath Tutorials - Identifying xpath for element with examples to use in selenium

    Xpath in selenium is close to must required. XPath is element locator and you need to provide xpath ...

  2. jQuery 2.0.3 源码分析Sizzle引擎 - 词法解析

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 浏览器从下载文档到显示页面的过程是个复杂的过程,这里包含了重绘和重排.各家浏览器引擎的工作原理略有差别,但也有一定规则. 简 ...

  3. web前端面试题总结

    HTML Doctype作用? 严格模式与混杂模式如何区分?它们有何意义? (1).<!DOCTYPE> 声明位于文档中的最前面,处于 <html> 标签之前.告知浏览器的解析 ...

  4. 前端开发面试知识点大纲--摘自jackyWHJ

    前端开发面试知识点大纲:HTML&CSS:    对Web标准的理解.浏览器内核差异.兼容性.hack.CSS基本功:布局.盒子模型.选择器优先级及使用.HTML5.CSS3.移动端适应 Ja ...

  5. HTML、CSS部分

    要点:对Web标准的理解.浏览器差异.CSS基本功:布局.盒子模型.选择器优先级及使用.HTML5.CSS3.移动端开发 技术等 1.Doctype作用? 严格模式与混杂模式-如何触发这两种模式,区分 ...

  6. Scalaz(24)- 泛函数据结构: Tree-数据游览及维护

    上节我们讨论了Zipper-串形不可变集合(immutable sequential collection)游标,在串形集合中左右游走及元素维护操作.这篇我们谈谈Tree.在电子商务应用中对于xml, ...

  7. jQuery1.4源码解读

    来吧, 慢慢折腾吧 总结一下: jq1.4挺简单的, 正则写的不多, 看的都懂, 多写一些 三目写法到底要不要 特殊的地方的注释一定要有 /*! * jQuery JavaScript Library ...

  8. 立即执行函数(IIFE)的理解与运用

    作为JavaScript的常用语法,立即执行函数IIFE(Immediately-Invoked Function Expression)是值得我们认真去学习探究的. 一.创建函数的两种方式 我们先从 ...

  9. HTML中动态图片切换JQuery实现

    相信很多同学都注意到了,各大新闻或者娱乐网站都含有动态图片切换,那个漂亮的感觉让刚刚学习html的人,都非常好奇和心动.那下面就让我们看一下到底如何实现动态图片切换呢?看一下百度贴吧的效果图吧~ // ...

  10. HTML5面试题-备

    万不可投机取巧.只求当时过关,非长久之计也!(感谢大神分享) 面试有几点需要注意: 面试题目: 根据你的等级和职位变化,入门级到专家级:范围↑.深度↑.方向↑. 题目类型: 技术视野.项目细节.理论知 ...

随机推荐

  1. xss挑战赛小记 0x02(prompt(1))

    0x0O 上次搜xss挑战赛的时候 还找到了一个看上去难度更高的挑战赛 今天做了一下 学到了很多新东西 这个挑战赛能够在页面成功prompt(1)就算过关了 挑战地址 http://prompt.ml ...

  2. Ubuntu中搭建Hadoop集群(简记)

    stp1:在Vmware虚拟机上创建Ubantu.2环境 步骤:文件—>新建虚拟机—>典型(下一步)—>下一步——>位置(不建议放c盘,文件地址一定要全英文)—>下一步— ...

  3. shell -- shift用法

    shift是Unix中非常有用的命令.可以使命令参数左移,从而使脚本程序中命令参数位置不变的情况下依次遍历所有参数.如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1. ...

  4. 「日常训练」Single-use Stones (CFR476D2D)

    题意(Codeforces 965D) $w$表示河的宽度,$l$表示青蛙所能跳的最远的距离,第二行的$w-1$个元素表示离河岸为$i$的地方有$a[i]$个石头,一个石头被踩两次,问最多有多少只青蛙 ...

  5. linux学习总结---web前端③

    css3: border-radius opacity: transform: 旋转 rotate 平移translate 缩放scale 扭曲skew transition:转变 强调:开始和结束 ...

  6. CubieTruck使用笔记--SD卡中使用lubuntu

    http://docs.cubieboard.org/tutorials/ct1/installation/install_lubuntu_desktop_server_to_sd_card 按照上面 ...

  7. 解决hadoop no dataNode to stop问题

    错误原因: datanode的clusterID 和 namenode的 clusterID 不匹配. 解决办法: 1. 打开 hadoop/tmp/dfs/namenode/name/dir 配置对 ...

  8. Nginx代理实现跨域

    #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...

  9. 关于C标准

    关于C标准 1. 前言 本文从英文 C-FAQ (2004 年 7 月 3 日修订版) 翻译而来.本文的 中文版权为朱群英和孙云所有. 本文的内容可以自由用于个人目的,但 是不可以未经许可出版发行. ...

  10. systemtap没找到函数变量

    为啥systemtap没找到函数 hon@station6:~/codebox/stap/net$ sudo stap -L 'kernel.function("sock_recvmsg_n ...