css整理之-----------选择器
背景
在20年初时总感觉自己的css 不够用,想把css 相关的东西整理下,去年一整年都比较忙,忙着就到2021了,今天趁着有点时间,先从选择器开始吧。

听说图片可以提升颜值....
选择器
CSS选择器用于选择你想要的元素的样式。简单划分为简单选择器、组合选择器、伪类选择器。
简单选择器
- 通配符
- 标签选择器
- 类选择器
- id选择器
- 属性选择器

属性选择器还有如下语法:
| 选择器 | 描述 |
| [attribute] | 用于选取带有指定属性的元素。 |
| [attribute=value] | 用于选取带有指定属性和值的元素。 |
| [attribute~=value] | 用于选取属性值中包含指定词汇的元素。 |
| [attribute|=value] | 用于选取带有以指定值开头的属性值的元素,该值必须是整个单词。 |
| [attribute^=value] | 匹配属性值以指定值开头的每个元素。 |
| [attribute$=value] | 匹配属性值以指定值结尾的每个元素。 |
| [attribute*=value] | 匹配属性值中包含指定值的每个元素。 |
组合选择器
- 后代选择器
- 子元素选择器
- 兄弟选择器
- 交集选择器
- 并集选择器

注意点
- 子代选择器只会匹配儿子元素,不会匹配孙子元素
- 后代选择器会匹配儿子、孙子元素
- 兄弟选择器有+和~,+ 只会匹配下一个兄弟元素,~会匹配后面所有的兄弟元素
ul li + p { color: deeppink; } // 匹配li下一个兄弟元素p,且存在同一个父级元素
ul li ~ h3 { color: purple; } // 匹配li元素后面的所有的兄弟元素h3,且存在同一个父级元素
ul li.gz { font-size: 20px } // 交集
.gz,.bj { font-size: 20px } // 并集
codepen 代码
伪类选择器
伪类是W3C制定的一套特殊的选择器,也就是你不用写类名 如 class=... 你就可以直接拿来使用;伪类选择器主要分为
- 动态伪类选择器
- UI元素状态伪类选择器
- 结构伪类选择器
- 否定伪类选择器
1 selector:pseudo-class { property: value;}

动态伪类选择器
1 E:link {color: red; } // 选择匹配E元素,且匹配元素被定义了超链接并未被访问过。常用于链接描点上
2 E:visited {color: red; } // 选择匹配E元素,且匹配元素被定义了超链接并已被访问过。常用于链接描点上
3 E:hover {color: red; } // 选择匹配E元素,且用户鼠标停留在元素E上
4 E:active {color: red; } // 选择匹配E元素,且匹配元素被激活、选中,常用于链接描点和按钮上
5 E:focus {color: red; } // 选择匹配E元素,而且匹配元素获取焦点
动态伪类选择器可以用于超链接 a标签的应用中,这些状态包括:未被访问状态,已被访问状态,鼠标悬停状态、活动状态,。
1 a:link {color: #FF0000} /* 未访问的链接 */
2 a:visited {color: #00FF00} /* 已访问的链接 */
3 a:hover {color: #FF00FF} /* 鼠标移动到链接上 */
4 a:active {color: #0000FF} /* 选定的链接 */
- 在 CSS 定义中,a:hover 必须被置于 a:link 和 a:visited 之后,才有效。
- 在 CSS 定义中,a:active 必须被置于 a:hover 之后,才有效。
- 伪类名称对大小写不敏感。
a标签的这四种伪类选择器的顺序为:a:link ,a:visited,a:hover ,a:active
UI元素状态伪类选择器
UI元素状态伪类选择器主要是对于HTML中的Form元素进行操作。
1 E:checked(选中状态伪类选择器):匹配选中的复选按钮或者单选按钮表单元素
2 E:enabled(启用状态伪类选择器 ):匹配所有启用的表单元素
3 E:disabled(不可用状态伪类选择器):匹配所有禁用的表单元素
如将"disabled"的文本框与其他的文本框区别出来
1 input[type="text"]:disabled {
2 border:1px solid #999;
3 background-color: #fefefe;
4 }
结构伪类选择器
结构伪类选择器,根据元素在文档中所处的位置,来动态选择元素,从而减少HTML文档对ID或类的依赖,有助于保持代码干净整洁。
结构伪类选择器很容易遭到误解,需要特别注意如:
1 p:first-child {
2 color: red;
3 }
上面这个css 表示的是匹配父元素(可以理解为这是一个动态的变量)下的第一个元素p,而不是匹配p元素的第一个子元素;
first-child 只是父元素下的第一个元素,如果我们需要匹配中间位置或者其他位置?so,css3 在这个的基础上扩展出了nth-child(n),其中n 可以是一个数字,一个关键字(偶数、奇数),或者一个公式。
我的理解这个结构选择器设计的原则并不是让我们指定某个父元素,而是让我们匹配一个列表中的某个位置的元素。
注意点:
- 子元素的序号是从 1 开始的,但是选择器中的n是从0开始的,如 p:nth-child(n)将不选择任何元素。
x:nth-child(n)
匹配父元素索引为n的子元素x(从右往左解析),这里的父元素是动态的,元素的集合是从1开始,但是表达式的n是从0开始计算
1 :nth-child(n) // 所以这个会匹配到父元素的任一子元素
an + b, an + xx 与 an 原理一样
这是一个表达式,这里的n从0开始(元素始终是从1开始),每次n加1后代入计算,最终找到一个位置,比如:p:nth-child(2n+1)
n=0时 2n+1=1 第1个p元素
n=1时 2n+1=3 第3个p元素
n=2时 2n+1=5 第5个p元素
所以就等价于p:nth-child(1)和p:nth-child(3)和p:nth-child(5)...取得是一个集合,也就是位置是1、3、5...
其他的也可以这样推导出来。
根据上面公司,可以很快的推导出偶数、奇数的nth-child(n) 具体的公式
1 odd 奇数位, :nth-child(odd) 等价于 :nth-child(2n+1)
2 even 偶数位, :nth-child(even) 等价于 :nth-child(2n)
3 // 记住n从0开始,元素从1开始即可
预览 codepen 代码
上面理解了,下面这些常用结构伪类就很简单了
1 E:fisrt-child:匹配父元素的第一个子元素的元素E。与E:nth-child(1)等同
2 E:last-child:匹配父元素的最后一个子元素的元素E。与E:nth-last-child(1)等同
3 E:root:匹配元素E所在文档的根元素。在HTML文档中,根元素始终是html,现在与html{}等同
4 E F:nth-child(n):选择父元素E的第n个子元素F。其中n可以是整数(1,2,3)、关键字(even,odd)、可以是公式(2n+1),而且n值起始值为0,元素是1.
5 E F:nth-last-child(n):选择父元素E的倒数第n个子元素F。此选择器与E:nth-child(n)选择器计算顺序刚好相反,
但使用方法都是一样的,其中:nth-last-child(1)始终匹配最后一个元素,与last-child等同
6 E:nth-of-type(n):选择父元素内具有指定类型的第n个E元素
7 E:nth-last-of-type(n):选择父元素内具有指定类型的倒数第n个E元素
8 E:first-of-type:选择父元素内具有指定类型的第一个E元素,与E:nth-of-type(1)等同
9 E:last-of-tye:选择父元素内具有指定类型的最后一个E元素,与E:nth-last-of-type(1)等同
10 E:only-child:选择父元素只包含一个子元素,且该子元素匹配E元素
11 E:only-of-type:选择父元素只包含一个同类型子元素,且该子元素匹配E元素
12 E:empty:选择没有子元素的元素,而且该元素也不包含任何文本节点
否定伪类选择器
匹配除了某个元素之外的所有元素 如 E:not(F):匹配所有除元素F外的E元素。
为所有的li元素设置一个边框,除了class值为gz的元素
1 li:not(.gz) {
2 border: 1px solid red;
3 }
伪元素
css中的伪元素通常用来为某个元素添加一些特殊的样式或者其他的效果,伪元素在dom文档中并不存在,只是在 CSS 渲染中向元素逻辑上的头部或尾部添加内容。注意这些添加不会改变文档内容,不会出现在 DOM 中,不可复制,仅仅是在 CSS 渲染层加入,所以叫伪元素(假的元素,通过css控制又可以表现的像真正的标签元素一样)~~~
基础语法
1 header::before {
2 content: "我是before";
3 display: block;
4 color:red;
5 }
按照规范,应该使用双冒号(::)而不是单个冒号(:),以便区分伪类和伪元素。但是,由于旧版本的 W3C 规范并未对此进行特别区分,因此目前绝大多数的浏览器都同时支持使用这两种方式来表示伪元素。

通常我们大多数使用before,after比较多,这两个伪类要设置content,且content属性可以是以下几个值
1、String – 使用引号包括一段字符串,将会向元素内容中添加字符串
1 a:after { content: ""; }
2、attr() – 调用当前元素的属性,可以方便的比如将图片的 Alt 提示文字或者链接的 Href 地址显示出来
1 a:after { content:"(" attr(href) ")"; }
3、url() / uri() – 用于引用媒体文件
1 h1::before { content: url(logo.png); }
4、counter() – 调用计数器,可以不使用列表元素实现序号功能
1 h2:before { counter-increment: chapter;
2 content: "Chapter " counter(chapter) ". "
3 }
- content 属性默认是inner元素
- 伪元素不属于文档,所以js无法操作它
- 伪元素属于主元素的一部分
常见伪元素
- ::first-letter 选择元素文本的首字母
- ::first-line 选择元素文本的第一行
- ::before 在元素内容的最前面添加新内容
- ::after 在元素内容的最后面添加新内容
- ::selection匹配用户被用户选中或者处于高亮状态的部分
- ::placeholder匹配占位符的文本,只有元素设置了placeholder属性时,该伪元素才能生效
利用好伪元素可以帮我们做很多的事情,如动画、清除浮动、一些其他图标等
css整理之-----------选择器的更多相关文章
- CSS伪类选择器
一.CSS伪类选择器用于给某些选择器添加效果语法规则:选择器:伪选择器例:a:link {color: #FF0000} 未访问的链接 a:visited {color: #00FF00} 已访问的链 ...
- Lining.js - 为CSS提供 ::nth-Line 选择器功能
在CSS中,我们使用 ::first-line 选择器来给元素第一行内容应用样式.但目前还没有像 ::nth-line.::nth-last-line 甚至 ::last-line 这样的选择器.实际 ...
- CSS 子元素选择器与后代选择器区别实例讲解
css子元素选择器和后代选择器在功能描述上非常相同,但是他们其实是有区别的,本文章通过两个简单的实例向大家介绍子元素选择器与后代选择器的区别,需要的朋友可以参考一下. 首先我们来了解一下子元素选择器与 ...
- 23----2013.07.01---Div和Span区别,Css常用属性,选择器,使用css的方式,脱离文档流,div+css布局,盒子模型,框架,js基本介绍
01 复习内容 复习之前的知识点 02演示VS创建元素 03div和span区别 通过display属性进行DIV与Span之间的转换.div->span 设置display:inline ...
- 前端必会css整理
1.设置css样式的三种方式? 外部样式表,引入一个外部css文件 内部样式表,将css代码放在<head>标签内部 内联样式,将css样式 ...
- CSS的总结(选择器,伪类等...)
关于组合选择器可参考:http://www.cnblogs.com/starof/p/4453458.html 主要内容 CSS概述 CSS和HTML结合的四种方式 CSS样式优先级和代码规范 CSS ...
- 关于CSS伪类选择器
#CSS伪类选择器 ##使用css伪类选择器需要注意的 使用css的伪类选择器来选择某元素时,需要特别注意 :first-child 和 :nth-child(n) 等时, 网页渲染是从语句的后面开始 ...
- CSS之后代选择器与多类选择器
<新人报到,欢迎拍砖#- -> 一.后代选择器 说起CSS的后代选择器.它属于派生选择器中的一种,两者附属关系如下: -->派生选择器 ----CSS 后代选择器 ----CSS 子 ...
- jQuery的hover方法搭配css的hover选择器,实现选中元素突出显示
问题简述: 今天做帮一个师姐做网页遇到一个这样的要求: 鼠标不移动进表格,表格透明度不变. 鼠标移动进表格,hover到的单元格透明度不变,没hover到的单元格透明度改变. 先贴我已经实现好的效果, ...
随机推荐
- (十五)xml模块
xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要 ...
- 【Linux】Linux进程间通信的几种方式
一.进程间通信的目的 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数据:多个进程要操作共享数据,一个进程对共享数据 信息传递:一个进程需要向另一个进程发 ...
- 代码审计 - BugkuCTF
extract变量覆盖: 相关函数: extract()函数:从数组中将变量导入到当前的符号表.把数组键名作为变量名,数组的键值作为变量值.但是当变量中有同名的元素时会默认覆盖掉之前的变量值. tri ...
- xray—学习笔记
长亭xray扫描器 简介 xray (https://github.com/chaitin/xray) 是从长亭洞鉴核心引擎中提取出的社区版漏洞扫描神器,支持主动.被动多种扫描方式,自备盲打平台.可以 ...
- dubbo快速入门demo
参考文章 https://blog.csdn.net/abcwanglinyong/article/details/81906027 该demo包含三个项目,分别是: 服务提供端项目:provider ...
- 企业项目迁移go-zero全攻略(二)
承接上篇:上篇文章讲到 go-zero 架构设计和项目设计.本篇文章接着这个项目设计,将生成的 app 模块 中 gateway 和 RPC 进行改造.废话不多说,让我们开始! gateway ser ...
- Mysql 中写操作时保驾护航的三兄弟!
这期的文章主要是讲述写操作过程中涉及到的三个日志文件,看过前几期的话可能你或多或少已经有些了解了(或者从别的地方也了解过).比如整个写操作过程中用到的两阶段提交,又或者是操作过程中涉及到的日志文件,但 ...
- 使用bandit对目标python代码进行安全函数扫描
技术背景 在一些对python开源库代码的安全扫描中,我们有可能需要分析库中所使用到的函数是否会对代码的执行环境造成一些非预期的影响.典型的例如python的沙箱逃逸问题,通过一些python的第三方 ...
- Vue中组件间通信的方式
Vue中组件间通信的方式 Vue中组件间通信包括父子组件.兄弟组件.隔代组件之间通信. props $emit 这种组件通信的方式是我们运用的非常多的一种,props以单向数据流的形式可以很好的完成父 ...
- 手把手做一个基于vue-cli的组件库(上篇)
基于vue-cli4的ui组件库,先贴个最终效果吧,步骤有点多,准备分上下篇,上篇:如何做一个初步的组件.下篇:编写说明文档及页面优化.开工. GitHub源码地址:https://github.co ...