关于css中last-child和last-of-type的说明

关于css中last-child和last-of-type的说明

前言

今天在写uniapp的时候,使用uView库中的tab的时候,因为二次封装修改样式,我想让最后一个tab有些特别的样式,理所应当的我就使用了last-of-type,但我发现并没有效果,但是first-of-type却有效,更离奇的是,当我删掉了最后的一个元素(非tab框元素),居然就生效了,真是太离谱了。

为了弄清楚这个问题,于是我特意去了解了一下这两个的用法

我原本的理解(这是错的,不要看!!!只是我相信不止我一个这么以为)

:last-child:首先找到符合条件的元素的父元素,当父元素的最后一个元素符合条件的话就被选中

:last-of-type:找到符合条件的元素的父元素,该父元素的子元素中最后一个符合条件的元素被选中

官网的解释

:last-child:代表一组兄弟元素中的最后元素。

:last-of-type:表示了在(它父元素的)子元素列表中,最后一个给定类型的元素。当代码类似 Parent tagName:last-of-type 的作用区域包含父元素的所有子元素中的最后一个选定元素,也包括子元素的最后一个子元素并以此类推。

但我感觉没有说到点子上,在后面群友的帮助下,在测试之后,我终于明白了到底有什么区别,以及正确的理解

第一种情况:最后一个元素是一样的

xml 复制代码
<style>
    .test-last-of-type p:last-of-type{
        color: red;
    }
​
    .test-last-child .classP:last-child{
        color: blue;
    }
</style>
xml 复制代码
<div class="test-last-of-type">
    <p>type1</p>
    <p>type2</p>
    <p>type3</p>
    <p>type4</p>
    <p>type5</p>
    <p>type6</p>
    <p>type7</p>
</div>
<div class="test-last-child">
    <p>child1</p>
    <p>child2</p>
    <p>child3</p>
    <p>child4</p>
    <p>child5</p>
    <p>child6</p>
    <p>child7</p>
</div>

结果:

可以看到,当子元素的最后一个元素都符合条件的时候,产生的效果是一样的

第二种情况:当最后一个元素不符合条件时

css 复制代码
<div class="test-last-of-type">
    <p>type1</p>
    <p>type2</p>
    <p>type3</p>
    <p>type4</p>
    <p>type5</p>
    <p>type6</p>
    <p>type7</p>
    <span>span</span>
</div>
<div class="test-last-child">
    <p>child1</p>
    <p>child2</p>
    <p>child3</p>
    <p>child4</p>
    <p>child5</p>
    <p>child6</p>
    <p>child7</p>
    <span>span</span>
</div>

结果:

我们可以发现,原本蓝色的child7就没有被选中了

结论一

last-of-type是选择子元素中符合条件的最后一个元素

last-child是选择最后一个子元素,再判断是否符合条件再决定是否选中

第三种情况:在last-of-type下,使用除了标签选择器以外的选择器

xml 复制代码
<style>
    .test-last-of-type .cls:last-of-type{
        color: red;
    }
</style>
​
<div class="test-last-of-type">
    <p class="cls">type1</p>
    <p class="cls">type2</p>
    <p class="cls">type3</p>
    <p class="cls">span</span>
</div>

结果:

这似乎符合我们的预期,那接下来的情况结果是如何呢?

xml 复制代码
<style>
    .test-last-of-type .cls:last-of-type{
        color: red;
    }
</style>
​
<div class="test-last-of-type">
    <p class="cls">type1</p>
    <p class="cls">type2</p>
    <p class="cls">type3</p>
    <p class="cls-copy">span</p>
</div>

是选中了type3,还是选中了span呢

无论选哪个,都答错了,正确答案是:谁也不会选中

结果:

是不是很神奇,这似乎跟我们前面所说的有冲突啊,别急,且听我满满道来

这个时候我们再修改一下代码:

ini 复制代码
<div class="test-last-of-type">
    <p class="cls">type1</p>
    <p class="cls">type2</p>
    <p class="cls">type3</p>
    <span class="cls-copy">span</span>
</div>

这个时候,你就会发现,居然又生效了:

这到底是为什么呢?

原来last-of-type不能直接说成选中符合条件的最后一个子元素

它真正的查找流程是:先将元素通过标签分类,例如p、span、div等标签,分成多个小组,再对每个小组的最后一个元素判断是否符合条件,再决定是否选中

按照上面的结论,我们上面的例子可以这样理解:

首先将p标签进行分组,得到了这三个

ini 复制代码
<p class="cls">type1</p>
<p class="cls">type2</p>
<p class="cls">type3</p>

然后再将span标签分组

css 复制代码
<span class="cls-copy">span</span>

这个时候再去判断我们的条件

.cls:last-of-type,在第一组中,最后一个p标签显然满足class='cls'的条件,于是被选中了,而span标签的class未满足条件,自然就没被选中

第四种情况

xml 复制代码
<style>
    .test-last-of-type .cls:last-of-type{
        color: red;
    }
</style>
​
<div class="test-last-of-type">
    <p class="cls">type1</p>
    <p class="cls">type2</p>
    <p class="cls">type3</p>
    <span class="cls">span</span>
</div>

通过以上的学习,这种情况的结果又是什么样的呢?

自己动手试试吧!

结论

对于last-child选择器:选中兄弟元素中的最后一个元素,判断是否符合条件再决定是否选中

对于last-of-type选择器:先将同一父元素下的子元素通过html标签(p,span,div等)进行分组,再选择每一组中的最后一个元素,根据是否符合:last-of-type的前置条件决定是否选中

最后的话

学习还是得好好学啊,有些看似简单易懂的东西,背后可能也有你想象不到的机制,最后附上我和我师兄的聊天,感受一下我的崩溃吧

相关推荐
jingqingdai32 分钟前
别用正则格式化 HTML!我用 DOM 遍历实现零风险本地格式化,老项目重构效率直接拉满
前端·重构·html
木斯佳5 分钟前
前端八股文面经大全:腾讯前端实习二、三OC面(2026-04-27)·面经深度解析
前端·状态模式
Python私教18 分钟前
如意Agent日志系统重构:从 print() 大海捞针到结构化可观测性栈
java·前端·重构
We་ct37 分钟前
LeetCode 97. 交错字符串:动态规划详解
前端·算法·leetcode·typescript·动态规划
Chengbei111 小时前
轻量化 Web 安全日志分析神器 星川智盾日志威胁检测、地理溯源、MITRE ATT&CK 映射,支持 Windows/macOS/Linux
前端·人工智能·安全·web安全·macos·系统安全·安全架构
风流 少年1 小时前
Python Web框架:FastAPI
前端·python·fastapi
GISer_Jing1 小时前
AI时代面试新常态——从“会用工具”到“深挖原理”的跨越
前端·人工智能·ai编程
IT_陈寒1 小时前
React的useEffect把我坑惨了,这些闭包陷阱真要命
前端·人工智能·后端
前端之虎陈随易1 小时前
有生之年系列,Nodejs进程管理pm2 v7.0发布
前端·typescript·npm·node.js