区别

以及实际场景中的应用

1.伪类与伪元素

伪类:
例如 :link — :visited — :hover — :active
用于当已有元素处于的某个状态时,为其添加对应的样式,这个状态是根据用户行为而动态变化的。
比如说当用户悬停在指定的元素时,我们可以通过 :hover 来描述这个元素的状态,虽然它和普通得css类 相似,可以为已有的元素添加样式,但是它只有处于dom树无法描述的状态下才能为元素添加样式,所以称其为伪类。
在浏览器检查 伪类的样式的时候 需要点击样式将其状态勾选上才可正常展示

伪元素 :
例如:::before 或者 ::after
用于创建一些不在文档树中的元素,并为其添加样式,比如说,我们可以通过 ::before 来在一个元素前增加一些文本,并为这些文本添加样式,虽然用户可以看到这些文本,但是这些文本实际上不在文档树中。

伪类与伪元素 - 图1

伪类与伪元素 - 图2

2.实战应用 —伪类

表单校验
表单的校验中,常会用到 :required:valid:invalid 这三个伪类。先来看看它们所代表的含义。

  • :required,指定具有 required属性 的表单元素
  • :valid,指定一个 匹配指定要求 的表单元素
  • :invalid,指定一个 不匹配指定要求 的表单元素 ```css input:valid { border-color: green; box-shadow: inset 5px 0 0 green; } input:invalid { border-color: red; box-shadow: inset 5px 0 0 red; }

input中类型为email的校验

符合email校验规则



不符合email校验规则



有required标识,但未填写

折叠菜单<br />缺点:任意时刻必需有一个菜单项是展开状态,单击同一菜单项无法实现隐藏/展示状态切换,无法自适应高度,只能设置固定高度。css
<!— 在url最后添加 #modal1,使得target生效 —> target 1
<!— 将url的#modal1 变为 #,使得target失效 —> target 1

.t-collapse { >.collapse-body { display: none; &:target { display: block; } } } **元素的index**<br />当我们要指定一系列标签中的某个元素时,并不需要用JavaScript获取。可以用 `:nth-child(n)` 与 `:nth-of-type(n)` 来找到,并指定样式。但它们有一些小区别,需要注意。<br />类似2n+1的表达式,再或者是 even / odd。 - :nth-of-type(n) 除了关注n之外,还需要关注最前面的`类型`,也就是标签。 - :nth-child(n) 它关注的是:其父元素下的第n个孩子,与类型无关。 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/618347/1578639548088-4f7d0f42-63d7-4a19-9ad7-dc76eed1f8f8.png#align=left&display=inline&height=586&name=image.png&originHeight=586&originWidth=696&size=111486&status=done&style=none&width=696) <a name="THEIO"></a> ### 3.实战应用 --伪元素 美化选中的文本<br />在网页中,默认的划词效果是,原字色保持不变,划过时的背景变为蓝底色。其实,这是可以用 `::selection` 来进行美化的。看下面这个例子:css

Custom text selection color

::selection { color: red; background-color: yellow; }

```