CSS3 nth 伪类选择器

考察下面的 HTML 代码片段:

<div><section>section 1</section><section>section 2</section><ul><li>item 1</li><li><ul><li>sub item 1</li><li>sub item 2</li><li>sub item 3</li></ul></li><li>item 3</li><li>item 4</li><li>item 5</li><li>item 6</li><li>item 7</li><li>item 8</li><li>item 9</li></ul><section>section 3</section><section>section 4</section><section>section 5</section>
</div>

单凭 section 可以让我们选中所有的<section> 标签,what if we wanna specific ones? 譬如只选中第一个。

那你可能已经知道:first-child伪类选择器了,所以选中第一个也不是什么麻烦事情。类似地可以用:last-child选中最后一个指定的元素。

section:first-child,section:last-child {color: red;
}

here comes out the result:
css :fist-child & :last-child 选择器

当场景再复杂一些的时候,譬如选中第2个,第3个,第基数个,很自然地,我们会想到引入一个变量来完成任务。

nth 系列荣誉登场

CSS3中的 nth 系列选择器便是这样一种支持变量计算的选择器,可以完成上述复杂的选择需求。

譬如高亮前面示例 HTML 片段中第基数个 sectionli 标签可以这样做:

section:nth-child(2n+1),li:nth-child(2n+1){color:red;
}

and here comes out the result again:

使用 :nth-child 高亮第基数个元素

:nth-child完整的语法为:nth-child(an+b),它匹配父容器下面中第an+b个子元素。例如:nth-child(3n+1)将会选中位置位于第1(3*0+1),4(3*1+1),7(3*2+1)...的元素。

:nth-child这样厉害的选择器还有3个!它们分别是:

  • :nth-last-child(an+b) 原理同:nth-child,只不过方向相反,从满足条件的兄弟子节点后面开始计数
  • :nth-of-type(an+b) 匹配第 an+b 个相同标签的元素
  • :nth-last-of-type(an+b)nth-of-type ,只不过方向相反,从最后开始计数。

借助于这样灵活的选择器,在编写样式时使我们更加得心应手,甚至有了很多花样玩法。

:nth-child

:nth-child(an+b) 会匹配所有兄弟节点中位置位于an+b位置的元素。 其中 n 是从0开始的正整数。

除了像前面所说的可以通过完整的表达式匹配到连续规律位置的元素外,如果我们将 a 设为0的话,就可以匹配指定的单个元素。

譬如考察下面的 HTML 片段:

<div><p>foo</p><p>bar</p><p>baz</p>
</div>

高亮第二个元素:

p:nth-child(2){color: red;
}

利用:nth-child 选中第2个元素

同理,:nth-child(3) 会选中第三个元素。

这个示例中,也可以用:nth-last-child:

p:nth-last-child(2){color: red;
}

效果当然是一样的,因为:nth-last-child(2)从后面开始数第二个,正好与顺位数第二个是同一元素。

:nth-of-type

:nth-of-type(an+b)用法上没有区别,但它只会匹配相同标签的兄弟元素。也就是在:nth-child的基础上加了一条限制:标签要一致。

还是考察刚刚的 HTML 片段,我们要选中第二个<p> 标签,仍然是指定位置为2即可:

p:nth-of-type(2){color: red;
}

但情况变一下,我们在第2个<p>标签前面加上另外一个元素譬如<section>,考察更新后的 HTML 片段:

<div><p>foo</p><section>quz</section><p>bar</p><p>baz</p>
</div>

此时我们仍然想要选中第2个<p>标签。

p:nth-child(2){color: red;/*会匹配失败,因为第二个子元素不是 p 标签*/
}
p:nth-of-type(2){color: red;/*仍然匹配成功*/
}

此时用:nth-child(2)不会选中任何元素,因为它的意思是选中div下面子元素中的第2个元素,并且这个元素是一个<p> 标签。而上面 HTML 片段中,第二个子元素明显不是<p>标签,所以匹配失败。

而通过:nth-of-type(2)来选择则仍然生效。因为不管第2个<p>元素前面插几个<section>标签,此时内容为bar<p>标签仍然是父容器所有子节点中顺位第二个类型为<p>的标签。

:nth-child:nth-of-type的区别

通过前面的示例可以看出,:nth-of-type在你始终需要选择第 N 个特定类型的元素时更为可靠,它首先会提取出所限定的元素类型,然后再从这个没有杂质的集合中去匹配顺序。

因此:nth-of-type在大多数时候可能更满足你的需要,毕竟很多时候需求是选中第3个<span>,第5个<p>。而不是第7个元素,无论是什么类型的节点。

这里有一个页面:nth Tester可以方便地把玩 nth 系列的四大金钢。通过可视化操作应该能够更好地理解。

扩展的花样玩法

前面说道,表达式an+b可以将 a 取值为0,这样就可以选中第 b 个元素。如果将 a 取值为1的话,我们就可以选中从第 b 个元素开始的所有元素。

譬如选中从第三个元素开始的所有<p>标签:

<div><p>1</p><p>2</p><p>3</p><p>4</p><p>5</p>
</div>
p:nth-child(n+3){color: red;
}

选中从第3个元素后的所有p标签

虽然 n 是从0开始的正整数,但 a 其实可以取负值的。当我们将 a 取值为-1的时候,可以达到只选取前 b 个元素的目的。

示例:选中前3个元素

<div><p>1</p><p>2</p><p>3</p><p>4</p><p>5</p>
</div>
p:nth-child(-n+3){color: red;
}

选取前3个元素

另外,选取基数和偶数元素时,可以通过指定值为oddeven来完成,这和2n+12n效果是一样的。

css 选偶数元素 p:nth-child(2n){ color: red; } /*或者*/ p:nth-child(even){ color: red; }

css 选基数元素 p:nth-child(2n+1){ color: red; } /*或者*/ p:nth-child(odd){ color: red; }

https://css-tricks.com/useful-nth-child-recipies/

需要注意的地方

与 class 的搭配

博主在使用过程中刚好遇到一个问题,可以拿出来分享一下。
那就是 nth 系列对元素的类名是不生效的,也就是说它只对标签名起作用,如果你使用时指定为 class 名则不会生效。

譬如考察下面的 HTML 片段与 CSS:

<div><p>1</p><p class="foo">2</p><p class="foo">3</p><p class="foo">4</p><p class="foo">5</p>
</div>
/*从带 class 为'foo'的 p 标签中选取第2个将字体设为红色*/
p.foo:nth-of-type(2){color: red;
}
/*从带 class 为'foo'的 p 标签中选取第3个将字体设为绿色*/
p.foo:nth-child(3){color: green;
}

上述 CSS 中,我们只希望对带 class 且值为foo<p>标签进行操作,于是使用了类选择器进行限制,但最终结果其实是这样的:

8.jpg

我们预期值为3的应该为红色,因为它是带 class 且值为foo这种类型里面的第二个,但其实值为2的 <p>标签被选中了。因为第一个不带 class 的 <p> 标签其实也参与了进来,证明 class 选择器其实没有生效,并没有起到限制的作用。

对于:nth-child同理。

推而广之,其实对于其他嵌套 CSS 语法组合(arbitrary selector),譬如属性选择[type=text]:nth-child:nth-of-type 都是会忽略的。

对于:nth-child,纳入考量的永远是同属同一个父容器下同一级所有的兄弟元素。而对于:nth-of-type来说,则是同一父容器下,同一级所有兄弟元素中标签类型相同的元素。

与 querySelector 的搭配

既然是伪类选择器,所以就无法使用 querySelector 来进行选择。我想你已经读出另外一层意思,即所有伪类选择器在 querySelector 中都不起作用,而不只是 nth 系列。原因见W3C Spec。

浏览器兼容性

:nth-child 为例,nth 系列的浏览器支持情况还是蛮理想的。可以放心使用。

来自 MDN 关于 nth-child 的浏览器兼容性表格

更多资料

  • MDN :nth-child doc
  • MDN :nth-of-type doc
  • :nth Tester
  • The Difference Between :nth-child and :nth-of-type
  • Useful :nth-child Recipes
  • nth-child doesn't respond to class
  • Can I combine :nth-child() or :nth-of-type() with an arbitrary selector

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RedisCluster的安装、部署、扩容和 Java客户端调用

Redis下载 官网地址&#xff1a;http://redis.io/ 中文官网地址&#xff1a;http://www.redis.cn/ 下载地址&#xff1a;http://download.redis.io/releases/ 安装 # &#xff08;三台&#xff09;安装 C 语言需要的 GCC 环境 yum install -y gcc-c yum install -y wget # 下…

【CloudCompare教程】001:CloudCompare中文版下载与安装图文教程

CloudCompare是一款功能强大的点云后处理软件,本文讲解CloudCompare中文版下载与安装方法。 文章目录 一、CloudCompare下载地址二、CloudCompare安装教程三、CloudCompare中文设置一、CloudCompare下载地址 官方下载地址:http://www.danielgm.net/cc/release/ 二、CloudComp…

ML.NET相关资源整理

在人工智能领域&#xff0c;无论是机器学习&#xff0c;还是深度学习等&#xff0c;Python编程语言都是绝对的主流&#xff0c;尽管底层都是C实现的&#xff0c;似乎人工智能和C#/F#编程语言没什么关系。在人工智能的工程实现&#xff0c;通常都是将Python训练好的人工智能模型…

JAVA学习日志(7-1-继承)

为什么80%的码农都做不了架构师&#xff1f;>>> 继承 1.提高代码复用性 2.让类与类之间产生关系&#xff0c;有了这个关系才有了多态的特性 **不要为了获取其他类的功能&#xff0c;简化代码而继承&#xff0c; 必须是类与类之间有所属关系才可以继承&#xff0c;所…

BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]

题意&#xff1a; 朋友的朋友是朋友&#xff0c;敌人的敌人是朋友&#xff1b;朋友形成团伙&#xff0c;求最多有多少团伙 种类并查集WA了一节课&#xff0c;原因是&#xff0c;只有那两种关系才成立&#xff0c;诸如朋友的敌人是朋友之类的都不成立&#xff01; 所以拆点做吧 …

常见Lidar点云数据处理及可视化软件汇总

常见的点云处理及可视化软件有&#xff1a; CloudCompare、Globalmapper、Pix4d、ArcGIS&#xff08;Pro&#xff09;、Lidar 360、PCL等等。 文章目录1. CloudCompare2. Globalmapper3. Pix4d4. ArcGIS&#xff08;Pro&#xff09;5. Lidar 3606. PCL1. CloudCompare CloudCo…

基于 HTML5 Canvas 绘制的电信网络拓扑图

电信网结构&#xff08;telecommunication network structure&#xff09;是指电信网各种网路单元按技术要求和经济原则进行组合配置的组合逻辑和配置形式。组合逻辑描述网路功能的体系结构&#xff0c;配置形式描述网路单元的邻接关系&#xff0c;即以交换中心&#xff08;或节…

【GlobalMapper精品教程】021:利用控制点校正栅格图像

本文讲解GlobalMapper中利用控制点校正栅格图像的方法,数据为配套实验数据包中的data021.rar。 文章目录 一、结果预览二、校正过程【推荐阅读】:ArcGIS实验教程——实验二:ArcGIS地理配准完整操作步骤 一、结果预览 二、校正过程 (1)打开图像。选择实验包中的待校正的栅…

WTM:ASP.NET Core快速开发利器!

不少程序员朋友应该都有这个想法&#xff0c;接接私活&#xff0c;赚赚外快&#xff0c;但是从零开发一套系统并不容易&#xff0c;今天给大家推荐一款开箱即用的通用后台管理系统。一个能够让程序猿快速开发的炒鸡脚手架&#xff0c;采用.NET Core开源框架&#xff01;github地…

【CloudCompare教程】002:点云绘制模式详解

文章目录 1. 按高程着色2. 按索引着色3. 按渐变着色1. 按高程着色 在内容列表中选中点云图层,点击【编辑】→【标量领域】→【将坐标导出到SF】。 勾选Z,点击OK。 高程着色效果: 2. 按索引着色 点击【编辑】→【标量领域】→【添加点指数为SF】。 索引着色效果:

《首席产品官》成海清 著 图书目录 思维导图

原文档地址&#xff1a;《首席产品官》成海清

「每天一道面试题」如何理解方法的重载与覆盖?

方法重载在同一个Java 类中&#xff08;包含父类&#xff09;&#xff0c;如果出现了方法名称相同&#xff0c;而参数列表不同的情况就叫做重载。方法的重载的规则&#xff1a;&#xff08;1&#xff09;&#xff1a;方法名称必须相同&#xff08;2&#xff09;&#xff1a;参数…

day63-webservice 01.cxf介绍

CXF功能就比较强了。CXF支持soap1.2。CXF和Spring整合的非常密切。它的配置文件基本就是Spring的配置文件了。CXF是要部署在服务器才能用的。CXF得放到Web容器里面去发布。CXF就可以整合咱们的Web容器。 cxf-2.4.0解压出来之后 apache-cxf-2.4.2是核心包,apache-cxf-2.4.4-src是…

Java中的static关键字解析

static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字&#xff0c;也是各大公司的面试官喜欢在面试时问到的知识点之一。下面就先讲述一下static关键字的用法和平常容易误解的地方&#xff0c;最后列举了一些面试笔试中常见的关于static的考题。以下是…

微信公众号授权登录后报redirect_uri参数错误的问题

在进行微信公众号二次开发的时候&#xff0c;需要通过授权码模式来进行微信授权。比如&#xff0c;在进行登录的时候&#xff0c;用户点击了登录按钮&#xff0c;然后弹出一个授权框&#xff0c;用户点击同意后&#xff0c;就可以获取用户的OpenId等信息了。这篇文章主要分享下…

【GlobalMapper精品教程】022:根据一个字段属性值批量计算另一个字段属性值(地类名称求地类编码)

项目中通常需要根据一个字段属性值的不同,批量计算另一个字段属性值(如根据地类名称求地类编码),根据权属地物名称给权属地物编码批量赋值等,本文讲解在属性表中根据代码批量实现方法。 参考阅读: 【ArcGIS风暴】ArcGIS 10.2字段计算器(Field Calculator)批量条件赋值用…

[转]【读书笔记】《俞军产品方法论》——产品经理的枕边书

作者简介 俞军&#xff0c;1997年毕业于同济大学化学系。曾任百度产品副总裁、首席产品架构师&#xff0c;网名“搜索引擎9238”&#xff0c;有“百度贴吧之父”之称。滴滴前高级产品副总裁。 内容简介 摘抄语录 我的产品潜力和优势大约只来自三方面&#xff1a;第一&#xff0…

linux批量分发必会面试题,通过邮件反馈结果。

请准备三台linux机器为别为A,B,C,要求实现以下内容1、用自己的名字用户完成一把钥匙开多把锁&#xff08;A&#xff0c;钥匙&#xff0c;B,C锁&#xff09;的免密码登录部署场景该题在生产环境中的用途为&#xff1b;批量分发数据&#xff0c;批量发布程序代码&#xff0c;批量…

【GlobalMapper精品教程】023:Excel数据通过相同字段连接到属性表中(气温降水连接到气象台站)

globalmapper中也可以将Excel数据通过相同字段连接到属性表中。本文讲解将气温降水连接到气象台站点图层中。 文章目录 一、加载气象台站数据二、挂接气温降水数据一、加载气象台站数据 globalmapper中根据坐标生成点的方法,前面的文章有所说明: 【GlobalMapper精品教程】0…