关于Css的选择器 :first-child和:last-child所踩过的坑

做项目时用到了last-child选择器,结果没有出现预期的效果,查了下W3C的文档发现我想的没那么简单。

就拿:last-child举例,文档中对其的解释是:

指定属于其父元素的最后一个子元素的 p 元素的背景色

什么意思呢?我详细说明一下:

假如是 div:last-child 那么该选择器最终选择的元素是 : 对所有div标签的父元素的其最后一个子元素div 设置样式,也就是说,其父元素的最后一个子元素必须是div 才能设置样式

这里有个非常重要需要注意的地方:div:last-childdiv后面不能有空格,有了空格后意思就变了

不懂?举几个简单的例子就懂了:

Html结构
在这里插入图片描述
Css
在这里插入图片描述
可以先不看效果,自己想一下那个标签会被设置样式

效果:
在这里插入图片描述

有些人可能会疑惑,为什么p标签没有被设置样式。
因为根据刚才的释义div:last-child中规定了最后的那个子元素必须是div,否则无效。
详细过程:根据div:last-child 浏览器会获取所有的div。其中浏览器获取到了id为a2,a3,a4,a5div标签,他们的父元素都是a1,而a1的最后一个子元素是p,不是div,所以无效

而为什么a6div也被设置样式了呢?
因为a6也是div,其父元素body的最后一个子元素是div 也就是a6 所以被设置样式了

  1. 好的,现在我们加上空格:div :last-child 看看会发生什么样的情况(html结构不变)

在这里插入图片描述
效果如下:
在这里插入图片描述
会发现,a6div 不再有绿色背景。
为什么呢?因为加了空格,空格就相当于后代选择器,所以div :last-child的含义是指定了以div 标签为目标,其最后一个子元素设置样式,而且不会有元素名的限制(比如说一定要div标签等)。
而如果这样写:div div:last-child 含义就是以div 标签为目标,其里面的最后一个子元素,且该必须是div 元素,为其设置样式。

就是说如果在a6里面加入一些标签,如果是div :last-child(有空格),则不会对最后的一个子元素做限制:
在这里插入图片描述
效果:
在这里插入图片描述
很明显,a6中的最后一个子元素(p元素)被渲染

这里可以做个总结:
name1 name2:last-child ,其中紧挨着:last-childname2是用来对最后一个子元素名作限制的,也可以不写直接用name1 :last-child ,这样name2为空,代表不对元素名作限制,一般都是这样的用法,直接选择最后一个子元素,这样比较直观,也容易懂

以上就是我的理解了。不懂得或者有疑问得欢迎和我交流

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
:first-child和:first-of-type是CSS选择器中的两个不同的选择器。 :first-child选择器匹配其父元素中的第一个子元素。例如,如果我们有以下CSS代码: p:first-child { background-color: yellow; } span:first-child { background-color: yellow; } 那么它将选择所有p元素和span元素中的第一个子元素,并将其背景颜色设置为黄色。\[1\] :first-of-type选择器匹配其父级是特定类型的第一个子元素。例如,如果我们有以下CSS代码: p:first-of-type { color: blue; } 那么它将选择所有p元素中的第一个子元素,并将其字体颜色设置为蓝色。注意,这里的:first-of-type只要是该类型元素的第一个就行了,不要求是第一个子元素了。\[2\] 所以,两个选择器的区别在于:first-child选择器只匹配其父元素中的第一个子元素,而:first-of-type选择器匹配其父级是特定类型的第一个子元素。 #### 引用[.reference_title] - *1* [css:first-child和first-of-type](https://blog.csdn.net/xiaojinguniang/article/details/119887850)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [:first-child和:first-of-type的区别](https://blog.csdn.net/weixin_46305214/article/details/104644576)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [CSS选择器 :first-of-type/:last-of-type/ :first-child/:last-child 用法](https://blog.csdn.net/momo_mom177/article/details/124008659)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值