第二个span
以上示例中,选择器要匹配的元素是位于 p 元素的后代元素中的 span 元素,因此第一个 span 元素就不符合规则,而第二个 span 则会被匹配到。 儿子选择器 结构:<第一个选择器> > <第二个选择器> 儿子选择器是多个选择器之间通过 > 右箭头符号连接,表示的是在满足第一个选择器的前提下,从它匹配到的元素的直接子元素中寻找第二个选择器。 跟后代选择器的区别就在于它只能在直接子元素中匹配第二个选择器。 示例: p > span { background-color: black; } 第一个span第二个span
第三个span
第一个 span 元素不是 p 元素的后代,第二个 span 元素是 p 元素的直接子元素,第三个 span 元素是 p 元素的孙子元素,因此只有第二个 span 元素满足规则被匹配到。
兄弟选择器
结构:<第一个选择器> + <第二个选择器>
兄弟选择器是多个选择器之间通过 + 加号连接。表示的是,在满足第一个选择器的前提下,从它匹配到的元素的紧跟着的位于同一层级的下一个元素,看该元素是否符合第二个选择器。
也就是说,兄弟选择器,两个选择器所匹配的元素要求,位于同一层级,且相邻。
示例:
p + a {
background-color: #6a90d9;
}
第一个a
第二个a
第三个a 第四个a 上述示例中,同时满足位于同一层级,且相邻,且需要先满足第一个选择器的前提下,还满足第二个选择器这四个条件的 a 元素就是第三个 a 元素了。 普通兄弟选择器 结构:<第一个选择器> ~ <第二个选择器> 普通兄弟选择器,是多个选择器之间通过 ~ 波浪符号连接。表示的是满足第一个选择器的前提下,从它匹配到的元素后,去寻找位于同一层级,且在该元素后面的所有满足第二个选择器的元素。 兄弟选择器只匹配相邻的一个元素,而普通兄弟选择器则是可以匹配位于元素后面的所有符合第二个选择器的元素。 示例: p ~ a { background-color: #6a90d9; } 第一个a第二个a
第三个a 第四个a 同时满足同层级,且在 p 元素后面的兄弟元素有两个,第三个 a 元素和第四个 a 元素,因此这里可以匹配到这两个元素。 伪选择器 选择器的目的就是为了匹配到 HTML 文档中的满足条件的元素,然后将样式属性作用在元素上。 元素是什么,在基础一节中有介绍过,元素其实就是包含了标签以及文本内容的整块内容。因此被选择器匹配到的元素,都是直接将 CSS 样式作用到整个元素上,也就是作用到整个文本内容上。 那么,如果有一些需求并不是直接去匹配 HTML 文档中的具体元素,而是指定了一些状态、行为,然后让浏览器动态去根据当前情况选择符合这些状态、行为的元素。 或者有一些需求是并不想将 CSS 样式作用到整个元素上,而是只作用到元素标记的文本内容的某一部分。 这个时候,这种选择器就称作伪选择器,因为它有区别于普通选择器的行为 伪选择器总共分成两种:伪元素选择器,伪类选择器 伪元素选择器 当伪选择器最终将 CSS 作用的对象并不是整个元素,而是满足条件的元素标记的文本内容的某一部分时,称伪元素选择器。 伪元素选择器不多,如下: ::first-line 匹配满足条件的元素标记的文本内容的首行部分 ::first-letter 匹配满足条件的元素标记的文本内容的首字母部分 :before 在满足条件的元素之前插入生成的内容 :after 在满足条件的元素之后插入生成的内容 伪元素选择器的用法基本都是和其他选择器组合使用,比如 p::first-line 表示匹配 p 元素标记的文本内容的首行部分。 而 :before 和 :after 与之前的选择器都不大一样,因为之前介绍的选择器作用都只是用于匹配选择 HTML 文档中的元素或文本内容而已。但这两个伪元素选择器会生成内容,并插入到匹配到元素的文本内容中去。 因此,它们的基本用法通常都是这样: a:before { content: "在文本内容之前插入"; } a:after { content: "在文本内容之后插入"; } 有一种应用场景很适合使用这两种伪元素选择器,当需要对列表动态的生成复杂的编号规则时,可以结合 :before 和 counter() 使用。在 CSS 中也是可以使用一些内置的方法功能。 伪类选择器 当不是通过 HTML 文档中元素的一些基本性质,比如 id,class,标签名,属性这些基本特征来匹配这些元素时,就可以称作伪类选择器。 伪类选择器是通过满足一些指定状态、行为下来匹配元素的一种选择器,比如满足是否获取焦点等等。 伪类选择器相对来说,比较多,如下: :first-child 选择元素的第一个子元素 :last-child 选择元素的最后一个子元素 :only-child 选取元素的唯一一个子元素 :only-of-type 选取属于父元素的特定类型的唯一子元素 :nth-child(n) 选取元素的第n个子元素 :nth-last-child(n) 选取元素的倒数第n个子元素 :nth-of-type(n) 选取属于父元素的特定类型的第n个子元素 :nth-last-of-type(n) 选取属于父元素的特定类型的倒数第n个子元素 :enabled 选取启用状态的元素 :disable 选取被禁用状态的元素 :checked 选取所有选中的复选框和单选按钮元素 :default 选取默认的元素 :valid :invalid 选取基于输入验证判定的有效或者无效的input元素 :in-range :out-of-range 选取被限定在指定范围之内或之外的input元素 :required :optional 根据是否允许使用required属性选取input元素 :link 选取未访问的链接元素 :visited 选取用户已访问的链接元素 :hover 选取鼠标指针悬停的元素 :active 选取当前被用户激活的元素,这通常意味着用户即将点击该元素 :focus 选取获得焦点的元素 :not(<选择器>) 否定选择,(如选择所有不匹配<选择器>的元素) :empty 选取不包含任何子元素或文本的元素 :lang(<语言>) 选取lang属性为指定值的元素 :target 选取URL片段标识符指向的元素 一些伪类选择器看下说明应该就清楚怎么使用,不明白的再具体去查找相关文档即可。 3.层叠算法 由于一个元素通常会被多个选择器命中,而这些选择器又有可能是通过不同方式作用到元素上,因此这里存在了两种场景下的优先级问题,但请记住,只有当作用到同一个元素上的样式属性起了冲突时才会存在优先级问题。 如果不同选择器作用到同一个元素上,但它们各自的样式属性列表中没有重复的,那就不存在冲突,也就不存在优先级问题,都会一起合并作用到元素上。 场景1:不同使用方式的优先级 CSS 有三种使用方式,另外浏览器也有默认样式,因此这些构成了一个优先级顺序: 元素内嵌样式(全局属性 style 定义的样式) 文档内嵌样式(style 标签定义的样式) 和 外部样式(link 标签引入的外部 CSS 文件) 浏览器中的用户样式 浏览器中的默认样式 以上优先级从高到低,同层级之间,如果存在冲突的样式属性的话,以文档中最后出现的属性为准,采用覆盖规则。 场景2:不同选择器之间的优先级 当作用到同一个元素上的不同选择器存在样式属性冲突时,优先以场景1考虑优先级,如果不存在场景1的情况,即起冲突的选择器在场景1中处于同一层优先级,那么才会考虑不同选择器之间的优先级。 id 选择器 class 选择器,属性选择器,伪类选择器 元素选择器,伪元素选择器 以上优先级从高到低,同层级之间,如果存在冲突的样式属性的话,以文档中最后出现的属性为准,采用覆盖规则。 但,有时候,使用的是组合选择器,那么这时候就需要依靠一定的算法来计算出谁的优先级高了,这个算法叫做层叠算法: 通过对以上不同选择器赋予某个数值来计算整个组合选择器的最终数值,然后比较大小。 比如,上面三个优先级的选择器中,1优先级的表示100,2优先级的表示10,3优先级的表示1,以此来计算一个组合选择器的数值大小。 通常来说,组合选择器不会过于离谱,长达十几个选择器的组合,因此以上述赋予每个优先级的数值足够覆盖绝大多数场景。 示例: 层叠算法 h1,和 #indentifier 都只是简单选择器,不通过这种层叠算法计算也行。 h1 + p::first-letter 和 li > a[href*=”zh-CN”] > .inline-warning 这种比较复杂的组合选择器,就可以根据赋予每一层级优先级对应的数值来进行计算,最终根据数值大小比较谁的优先级高。 这种赋予不同优先级某个具体数值具现化的思想叫做层叠算法,通常是用于比较复杂的组合选择器时。 但实际开发中,很少会需要用到层叠算法,掌握场景1和场景2下简单的优先级分辨理论基础足够了。实际开发过程中,没必要这么复杂,借助开发工具或者运行查看下效果就可以确认谁的优先级高低了。 大家好,我是 dasu,欢迎关注我的公众号(dasuAndroidTv),如果你觉得本篇内容有帮助到你,可以转载但记得要关注,要标明原文哦,谢谢支持~https://www.cnblogs.com/dasusu/p/9875482.html