写点什么

【CSS 学习总结】第四篇 - CSS 选择器 - 伪类和伪元素

作者:Brave
  • 2021 年 12 月 24 日
  • 本文字数:2873 字

    阅读完需:约 9 分钟

一,前言


上一篇,主要介绍了 CSS 的选择器,主要涉及以下几点:


  • CSS 的三大特征;

  • CSS 选择器的优先级;

  • CSS 优先级的计算规则;

  • CSS 选择器的权重;

  • CSS 选择器面试题;


本篇,介绍 CSS 选择器:伪类和伪元素;



二,伪类(伪类选择器)

1,伪类的简介


  • 伪类用于定义元素的特殊状态;

  • 同一元素,根据不同状态,显示不同样式,样式随状态(用户行为)变化而变化;

  • 伪类用冒号表示,如::link:hover

  • 与普通 CSS 类相比较,伪类选择器只有处于 dom 树无法描述的状态下,才能为元素添加样式;所以被称作伪类;

2,伪类的语法

<!-- 语法 -->selector:pseudo-class {  property: value;}
<!-- 示例 -->a:link { color: #FF0000;}
input:focus { background-color: yellow;}
复制代码


备注:

  • 伪类名称对大小写不敏感;

3,伪类的应用


  • 设置鼠标悬停在元素上时的样式;

  • 为已访问和未访问链接设置不同的样式;

  • 设置元素获得焦点时的样式;


// 示例:a 标签的四种状态,分别对应 4 种伪类;
/* 未访问的链接 */a:link { color: blue;}
/* 已访问的链接 */a:visited { color: red;}
/* 鼠标悬停链接 */a:hover { color: orange;}
/* 已选择的链接(鼠标点击但不放开时) */a:active { color: #0000FF;}
复制代码


注意:

  • a 标签的 4 个伪类(4 种状态)必须按照一定顺序书写,否则将会失效:

  • a:hover 必须在 CSS 定义中的 a:link 和 a:visited 之后,才能生效;

  • a:active 必须在 CSS 定义中的 a:hover 之后才能生效;

  • 书写顺序为:a:linka:visiteda:hovera:active

  • 记忆方法:love hate - “爱恨准则”;

4,伪类的意义


  • 通过伪类选择器,能够格式化 DOM 树以外的信息;

  • 通过伪类选择器,能够获取到常规 CSS 选择器无法获取到的信息;

5,全部伪类选择器

| **选择器**  | **示例** | **备注** || ----- | ----- | ------ || `:active` | `a:active` | 选择活动状态的链接 || `:checked` | `input:checked` | 选择每个被选中的`<input>`元素 || `:disabled` | `input:disabled` | 选择每个被禁用的`<input>`元素 || `:enabled` | `input:enabled` | 选择每个已启用的`<input>`元素 || `:empty` | `p:empty` | 选择没有子元素的每个`<p>`元素 || `:first-child` | `p:first-child` | 选择其父中首个子元素的每个`<p>`元 || `:first-of-type` | `p:first-of-type` | 选择其父中指定类型的首个子元素`<p>` || `:last-child` | `p:last-child` | 选择其父中最后一个子元素的每个`<p>`元素 || `:last-of-type` | `p:last-of-type` | 选择作为其父的最后一个`<p>`元素的每个`<p>`元素 || `:focus` | `input:focus` | 选择获得焦点的`<input>`元素 || `:hover` | `a:hover` | 选择处于鼠标悬停状态的链接 || `:in-range` | `input:in-range` | 选择满足指定范围值的`<input>`元素 || `:invalid` | `input:invalid` | 选择所有无效值的`<input>`元素 || `:lang` | `p:lang(it)` | 选择每个`lang 属性值`以 "it" 开头的`<p>`元素 || `:link` | `a:link` | 选择所有未被访问的链接 || `:not(*selector*)` | `:not(p)` | 选择每个非`<p>`元素的元素 || `:nth-child(*n*)` | `p:nth-child(2)` | 选择作为其父的第二个子元素的每个 `<p>`元素 || `:nth-last-child(*n*)` | `p:nth-last-child(2)` | 选择作为父的第二个子元素的每个`<p>`元素<br>从最后一个子元素计数 || `:nth-last-of-type(*n*)` | `p:nth-last-of-type(2)` | 选择作为父的第二个`<p>`元素的每个`<p>`元素<br>从最后一个子元素计数 || `:nth-of-type(*n*)` | `p:nth-of-type(2)` | 选择作为其父的第二个`<p>`元素的每个`<p>`元素 || `:only-of-type` | `p:only-of-type` | 选择作为其父的唯一`<p>`元素的每个 `<p>`元素 || `:only-child` | `p:only-child` | 选择作为其父的唯一子元素的`<p>`元素 || `:optional`| `input:optional` | 选择不带 "required" 属性的 `<input>`元素 || `:out-of-range` | `input:out-of-range` | 选择值在指定范围之外的`<input>`元素 || `:read-only` | `input:read-only` | 选择指定了`readonly`属性的`<input>`元素 || `:read-write` | `input:read-write` | 选择不带`readonly`属性的`<input>`元素 || `:required` | `input:required` | 选择指定了`required`属性的`<input>`元素 || `:root` | `root` | 选择元素的根元素 || `:target` | `#news:target` | 选择当前活动的`#news`元素(单击包含该锚名称的 URL)|| `:valid` | `input:valid`| 选择所有具有有效值的`<input>` 元素 || `:visited` | `a:visited` | 选择所有已访问的链接 |
复制代码



三,伪元素(伪元素选择器)

1,伪元素的简介


  • CSS 伪元素用于设置元素指定部分的样式;

  • 伪元素使用双冒号表示法,如:::first-line


备注:

W3C 为了区分伪类和伪元素,CSS3 的伪元素使用双冒号表示法取代了单冒号表示法;但是,为了能够向后兼容,CSS2 和 CSS1 的伪元素仍可使用单冒号语法;

2,伪元素的语法

<!-- 语法 -->selector::pseudo-element {  property: value;}
<!-- 示例 -->p::first-line { color: #ff0000;}
h1::before { content: '♥';}
复制代码

3,伪元素的应用


注意:

  • ::first-line 伪元素只能应用于块级元素

  • ::first-letter 伪元素只适用于块级元素


todo:后续需要补充伪元素下可以生效的属性有哪些;

4,伪元素的意义


用于创建不在文档树中的元素,并为其添加样式;

  • 可以通过:before在元素前增加文本,并为文本添加样式;

  • 用户虽然可以看到文本内容,但文本实际并不在文档树中;


伪元素可以创建文档语言无法创建的虚拟元素;

  • 文档语言无法描述元素内容的第一个字母或第一行,但伪元素可以(::first-letter::first-line);

  • 伪元素还可以创建源文档不存在的内容;比如:使用 ::before::after

5,全部伪元素选择器


| **选择器**  | **示例** | **备注** || ----- | ----- | ------ || `::first-letter` | `p::first-letter` | 选择`<p>`元素的首字母; || `::first-line` | `p::first-line` | 选择`<p>`元素的首行; || `::before` | `p::before` | 在`<p>`元素之前插入内容;<br>必须定义`content`属性;|| `::after` | `p::after` | 在`<p>`元素之后插入内容;<br>必须定义`content`属性;|| `::selection` | `p::selection` | 设置被用户选择时的样式;<br>只能定义被选择时的`color`<br>和`background-color`;|
复制代码



四,伪类和伪元素选择器的区别


  • 伪类的操作对象是文档树中已有的元素,而伪元素则创建了一个文档数外的元素。因此,伪类与伪元素的区别在于:有没有创建一个文档树之外的元素;

  • 伪类本质上是为了弥补常规 CSS 选择器的不足,以便获取到更多信息;

  • 伪元素本质上是创建了一个有内容的虚拟容器;

  • CSS3 中伪类和伪元素的语法不同;

  • 在 CSS3 中,已经明确规定了伪类用一个冒号来表示,而伪元素则用两个冒号来表示;

  • 可以同时使用多个伪类,而只能同时使用一个伪元素;


五,结尾


本篇,介绍了 CSS 选择器伪类和伪元素,主要涉及以下几个点:


  • 伪类选择器;

  • 伪元素选择器;

  • 伪类和伪元素选择器的区别;


下一篇,介绍 CSS 变量 var;

用户头像

Brave

关注

还未添加个人签名 2018.12.13 加入

还未添加个人简介

评论

发布
暂无评论
【CSS 学习总结】第四篇 -  CSS 选择器-伪类和伪元素