CSS选择除第一个和最后两个以外的所有子元素 + 结构伪类选择器深度解析

2023-11-14

最近在练习网易严选首页的布局时,发现它的顶部导航栏需求很特殊,第一项和最后两项是没有下拉选择框的。那么问题来了,在写css的时候该怎么使用选择器去达到这样的需求呢!?
在这里插入图片描述

首先先贴一下我最后的解决方案:

.nav-first>li:nth-child(n+2):not(:nth-last-child(-n+2)):hover .nav-second {
  display: block;
}

其中核心是::nth-child(n+2):not(:nth-last-child(-n+2))
:nth-child(n+2)是从第二子元素开始选择,就剔除了第一个子元素;
:not(:nth-last-child(-n+2))是把倒数第二个及之后的所有子元素都剔除。

结构伪类选择器深度解析

以以下代码为例:

<ul class="nav">
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    <li>6</li>
    <li>7</li>
    <li>8</li>
</ul>

1) :first-child

匹配父元素nav的第一个子元素 1nav的第一个子元素必须是li标签,否则选择器会失效。

.nav li:first-child {
        color: #fff;
        background-color: red;
    }

在这里插入图片描述

2) :last-child

匹配父元素nav的最后一个子元素 8nav的最后一个子元素必须是li标签,否则选择器会失效。

.nav li:last-child {
        color: #fff;
        background-color: red;
    }

在这里插入图片描述

3) :only-child

匹配父元素nav的唯一一个子元素 1nav只能有一个子元素,而且必须是li标签,选择器才会生效,实用性不大。

.nav li:only-child {
        color: #fff;
        background-color: red;
    }

在这里插入图片描述

4) :nth-child()

这个选择符括号内可以写+/- an + b (a,b均为整数)或者关键字:

① nth-child(a)

当括号里只写一个数字,比如 .nav li:nth-child(2),作用为选中父元素nav的第二个子元素li标签,如果nav的第二个子元素不是li标签,则选择符失效。

.nav li:nth-child(2) {
        color: #fff;
        background-color: red;
    }

在这里插入图片描述

② nth-child(2n) / nth-child(2n+1)

程序猿对2n,2n+1一定很敏感——常见的奇偶数写法。
所以括号内写2n就是选中nav父元素的所有偶数项子元素li2n+1就是选中所有奇数项子元素。以2n+1为例:

.nav li:nth-child(2n+1) {
        color: #fff;
        background-color: red;
    }

在这里插入图片描述

③ nth-child(even) / nth-child(odd)

括号内也允许使用关键字:odd代表奇数,even代表偶数。

.nav li:nth-child(even) {
        color: #fff;
        background-color: red;
    }

在这里插入图片描述

④ nth-child( +/- n+b)

n 的作用其实是连续向后选中,b 的作用是从第几个子元素开始。
.nav li:nth-child(n+3)为例,将会选中第三个元素以及之后的所有子元素。

.nav li:nth-child(n+3) {
        color: #fff;
        background-color: red;
    }

在这里插入图片描述
- n 会把连续选中的方向改为向前,以.nav li:nth-child(-n+4)为例,将会选中第四个元素以及之前的所有子元素。

.nav li:nth-child(-n+4) {
        color: #fff;
        background-color: red;
    }

在这里插入图片描述

5) :nth-last-child( +/- n+b)

这个选择符的作用类似于第四个:nth-child,只不过是从正数变成了倒数,连续选择的默认方向改成了向前。
可以看以下两者等价对比图:

:nth-child :nth-last-child 作用域
:nth-child(2) :nth-last-child(7) 选中第二个
:nth-child(2n+1) :nth-last-child(2n) 选中所有奇数项
:nth-child(even) :nth-last-child(odd) 选中所有偶数项
:nth-child(n+3) :nth-last-child(-n+6) 选中第三个及之后的所有项
:nth-child(-n+4) :nth-last-child(n+5) 选中第四个及之前的所有项

6) :not()

:not()选择符需要配合前边所讲的选择符使用,它的作用是剔除括号内选中的子元素。以开头的网易严选案例来说,不选中最后两个子元素,可以先写:nth-last-child(-n+2),作用为选中倒数第二个及之后的所有子元素,然后把它放进:not()的括号内就达成了这个需求。

.nav li:not(:nth-last-child(-n+2)) {
        color: #fff;
        background-color: red;
    }

在这里插入图片描述

中间小结

前五个选择符都是以-chlid结尾的,它的工作原理是先确定子元素位置,然后再看当前位置子元素标签是否符合设定的标签类型,符合就选中,不符合就不选中,所以会出现选择符无效的情况;

接下来要讲的一组选择符都是以-of-type结尾,它是先筛选出来所有符合标签类型的子元素,重新排列顺序,然后按照设定确定最终选中的子元素位置。

所以我们稍微改一下示例代码:(把数字1,3,5的标签改成了div)

<ul class="nav">
    <div>1</div>
    <li>2</li>
    <div>3</div>
    <li>4</li>
    <div>5</div>
    <li>6</li>
    <li>7</li>
    <li>8</li>
</ul>

7) :first-of-type

类似于:frist-chlid,这个选择符是选择同类型中的第一个同级兄弟元素。比如选择li标签:

.nav li:first-of-type {
        color: #fff;
        background-color: red;
    }

所以nav下的所有div标签就不参与本次样式设定,示例代码相当于:

<ul class="nav">
    <li>2</li>
    <li>4</li>
    <li>6</li>
    <li>7</li>
    <li>8</li>
</ul>

在这里插入图片描述
在这里.nav li:first-of-type等同于.nav li:nth-chlid(2)
同理若选择div标签,则示例代码相当于:

<ul class="nav">
    <div>1</div>
    <div>3</div>
    <div>5</div>
</ul>

css样式就该这么写:

.nav div:first-of-type {
        color: #fff;
        background-color: red;
    }

在这里插入图片描述

8) :last-of-type

选择同类型中的最后一个同级兄弟元素。以li标签为例:

.nav li:last-of-type {
        color: #fff;
        background-color: red;
    }

在这里插入图片描述

9) :only-of-type

选择同类型中的唯一的一个同级兄弟元素。以li标签为例:

.nav li:only-of-type {
        color: #fff;
        background-color: red;
    }

由于li标签不唯一,所以选择符失效:
在这里插入图片描述

10) :nth-of-type

和上述:nth-chlid语法相同,在这只举一例:

.nav li:nth-of-type(n+2) {
        color: #fff;
        background-color: red;
    }

在这里插入图片描述

11) :nth-last-of-type

和上述:nth-last-chlid语法相同,在这也只举一例:

.nav div:nth-last-of-type(-n+2) {
        color: #fff;
        background-color: red;
    }

在这里插入图片描述
结构伪类选择器也可以组合使用,来满足PM大大的各种 “ 合理 ” 需求~
(现在开篇的案例是不是就很好理解啦~)

到这里,今天的结构伪类选择器的深度解析就讲完啦~ ❀撒花❀❀撒花❀❀❀❀❀
感谢你萌的耐心观看,这次是写的篇幅最长的一次了,呼~
码字不易,希望能对你萌的学习有所帮助!爱你们呦

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CSS选择除第一个和最后两个以外的所有子元素 + 结构伪类选择器深度解析 的相关文章

随机推荐

  • 蓝桥之顺子日期

    小明特别喜欢顺子 顺子指的就是连续的三个数字 123 456 等 顺子日期指的就是在日期的 yyyymmdd 表示法中 存在任意连续的三位数是一个顺子的日期 例如 20220123 就是一个顺子日期 因为它出现了一个顺子 123 而 202
  • Linux系统之使用Keepalived+Nginx部署高可用Web集群

    Linux系统之使用Keepalived Nginx部署高可用Web集群 一 本次实践介绍 1 1 本次实践简介 1 2 本次实践环境规划 二 Keepalived和Nginx介绍 2 1 Keepalived简介 2 2 Keepaliv
  • 针对java.net.SocketException: Connection reset的问题排查

    针对java net SocketException Connection reset的问题排查 最近在与第三方系统对接接口时 需要用到socket这种方式 在调试过程中 一直出现java net SocketException Conne
  • 钓鱼邮件攻击分析

    北京网际思安科技有限公司麦赛邮件安全实验室 MailSec Lab 研究发布了 2022年全球邮件威胁报告 以下简称 报告 报告数据显示 在2022年 全球每1000个邮箱 平均每月遭受的邮件攻击数量为299 27次 不含垃圾邮件 同比增加
  • VUE+ElementUI+VueDraggable +El-ImageViewer 实现图片批量上传,支持拖拽控制顺序及图片预览

    话不多说 上代码 没安vuedraggable的小伙伴们自行安装一下 npm install vuedraggable 具体实现
  • Windows 启动Hive 提示:Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClien

    Windows 10 启动Hive 提示如下错误信息 2020 07 06 11 51 18 958 WARN metadata Hive Failed to register all functions java lang Runtime
  • 前端开发经验小结

    http被浏览器强制跳转https 本地调试时如果遇到http强制跳转https的情况 需要修改一下浏览器的HSTS域名安全策略 具体可参考这篇文章 如果是在微信开发者工具 参考这篇文章 window open性能问题 window ope
  • 单片机通用Bootloader框架

    通用Bootloader框架 终端控制台预览 flash分区 APP分区固件制作 设置中断向量表 设置flash起始地址 加入升级成功标识写入 生成可烧写bin文件 固件升级与上载 更新固件 上载固件 升级方式 工程下载 最近搞了Bootl
  • Mysql的安装配置教程(详细)

    首先简单概述分为几个步骤 一 下载Mysql 二 安装Mysql 三 验证Mysql安装是否成功 四 配置环境变量 五 验证配置环境变量是否成功 一 下载Mysql 要在Windows或Mac上安装MySQL 首先从MySQL官方网站下载最
  • uniapp中map使用点聚合渲染marker覆盖物

    效果如图 一 什么是点聚合 当地图上需要展示的标记点 marker 过多时 可能会导致界面上 marker 出现压盖 展示不全 并导致整体性能变差 针对此类问题 推出点聚合能力 点聚合官网教程 二 基本用法 template
  • 使用wireshark对HTTPS解密

    最近需要解析HTTPS流量 所以对wireshark的HTTPS解密进行了实测 使用wireshark解密https的方法 方法一 1 在wireshark的首选项中的protocols的tls选项里添加服务器私钥文件 p12文件需要填写密
  • jar包修改编译反编译操作

    1 首先下载一个反编译工具JD GUI 自己用的是这款 2 获取到你要改的jar包文件 3 先把jar包直接解压暂时放在一个目录里 本人准备修改这个文件 4 再把jar包拖进JD GUI进行解码然后保存到另一个文件夹中 jarTest 5
  • C++ 堆内存分配 new delete 简谈

    堆内存 堆区 heap 是内存空间 是区别于栈区 全局数据区和代码区的内存区域 是程序在运行时申请的内存空间 new和delete new和delete是C 专有的操作符 不需要声明头文件 new是用来申请分配堆内存的 delete是用来释
  • 剖析muduo网络库核心代码,重写muduo库

    项目简介 模拟muduo库实现nonnon blocking IO multiplexing loop线程模型的高并发 TCP 服务器模型 开发环境 Centos7 技术栈 C 多线程 socket网络编程 epoll多路转接 项目设计 整
  • 某机字长为32位,存储容量为64MB,若按字节编址.它的寻址范围是多少?

    问题 1 某计算机字长为32位 其存储容量为16MB 若按双字编址 它的寻址范围是多少 2 某机字长为32位 存储容量为64MB 若按字节编址 它的寻址范围是多少 解答 我的方法是全部换算成1位2进制的基本单元来算 先计算总容量 如第一题中
  • telnet端口不通怎么解决(单边不通的方法建议)

    telnet端口不通是大家在检测端口的时候可能会遇到的问题之一 遇到这种状况一般要如何解决呢 这里为各位带来分享 看一下telnet端口不通的解决方式 看一下如何处理吧 telnet端口不通怎么解决 1 开放供应商服务器端口 总是出现由于连
  • The engine “node“ is incompatible with this module. Expected version

    前言 vue项目用了yarn yarn install后报错如下 开始 执行 yarn config set ignore engines true 然后yarn install后成功 结束 在此记录问题 如有需要修改的地方 还请不吝赐教
  • Kubernetes—K8S运维管理

    Kubernetes K8S运维管理 更新中 一 Node管理 1 1 Node的隔离与恢复 1 2 Node 的扩容 二 更新资源对象的Label 三 Namespace 集群环境共享与隔离 3 1 创建Namespace 3 2 定义C
  • [病虫害识别|博士论文]面向农作物叶片病害鲁棒性识别的深度卷积神经网络研究

    文章目录 创新点 文章中的方法 国内外现状 手工设计特征 基于深度特征学习的农作物病害识别研究 基于高阶残差的卷积神经网络的农作物病害识别 结构图 对比方法 基于高阶残差和参数共享反馈的卷积神经网络农作物病害识别方法 结构图 对比方法 基于
  • CSS选择除第一个和最后两个以外的所有子元素 + 结构伪类选择器深度解析

    最近在练习网易严选首页的布局时 发现它的顶部导航栏需求很特殊 第一项和最后两项是没有下拉选择框的 那么问题来了 在写css的时候该怎么使用选择器去达到这样的需求呢 首先先贴一下我最后的解决方案 nav first gt li nth chi