首先看一个例子

<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. lambda, 匿名函数, 变量,传参

    lambda: # 无参数函数情况 def delete_one(): pass Button(otherFrame, text="删除", width=4, command=de ...

  2. 扩展报表-JavaSet

    前言 使用商业分析中的扩展报表平台,可以很方便的进行数据分析,进行图表化直观展示.一般情况下使用SQL数据集进行SQL的编写,进而配合扩展报表平台进行数据分析图表的绘制,但SQL数据集针对固定的参数进 ...

  3. 代码混淆 iOS

    该方法只能针对有.m.h的类进行混淆,静态库等只有.h文件的没法进行混淆 代码混淆,刚刚看到是不是有点懵逼,反正我是最近才接触到这么个东西,因为之前对于代码和APP,只需要实现功能就好了,根本没有考虑 ...

  4. c++ combination by next_permutation

    #include <iostream> #include <algorithm> #include <vector> int main() { int n, r; ...

  5. Linux-Ps命令使用

    ps -ef | grep java ps aux | grep java ps aux 是用BSD的格式来显示Java进程 显示的项目有: USER        PID %CPU %MEM    ...

  6. flask_sqlalchemy中db.session是如何保持请求间独立的--源码阅读笔记

    本文主要是为了验证两个问题: flask处理请求时通过新建线程.进程.协程的区别(顺带一提) flask_sqlalchemy是如何使用db.session使多个请求中保函的改变同一个表的sql操作不 ...

  7. LeetCode - 35. Search Insert Position(48ms)

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  8. UVA 11883 Repairing a Road(最短路径+暴力枚举)

    You live in a small town with R bidirectional roads connecting C crossings and you want to go from c ...

  9. PhpStorm 配置数据库

    点击软件右边的 Database

  10. [问题解决]Python locale error: unsupported locale setting

    原文来源:https://stackoverflow.com/questions/14547631/python-locale-error-unsupported-locale-setting 安装f ...