开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情
css选择器
在应用编码中,可能很多人都有这个习惯,就是使用很多的类,殊不知有时使用选择器比写类要来的更快一点,也更简单一点
分类
对于选择器在标准概念中并无做出明确的分类,不过我们有时可以根据功能来做一个方便记忆的分类
基础选择器
基础选择器
| tag | 标签选择器 | 指定类型的标签 | 1 |
|---|---|---|---|
| #id | ID选择器 | 指定身份的标签 | 1 |
| .class | 类选择器 | 指定类名的标签 | 1 |
| * | 通配选择器 | 所有类型的标签 | 2 |
层次选择器
| elemP elemC | 后代选择器 | 元素的后代元素 | 1 |
|---|---|---|---|
| elemP>elemC | 子代选择器 | 元素的子代元素 | 2 |
| elemP+elemC | 相邻同胞选择器 | 元素相邻的同胞元素 | 2 |
| elemP~elemC | 通用同胞选择器 | 元素后面的同胞元素 | 3 |
集合选择器
| elem1,elem2 | 并集选择器 | 多个指定的元素 | 1 |
|---|---|---|---|
| elem.class | 交集选择器 | 指定类名的元素 | 1 |
条件选择器
| :lang | 指定标记语言的元素 | 2 |
|---|---|---|
| :dir() | 指定编写方向的元素 | 4 |
| :has | 包括指定元素的元素 | 4 |
| :is | 指定条件的元素 | 4 |
| :not | 非指定条件的元素 | 4 |
| :where | 指定条件的元素 | 4 |
| :scope | 指定元素作为参考点 | 4 |
| :any-link | 所有包括href的链接元素 | 4 |
| :local-link | 所有包括href且属于绝对地址的链接元素 | 4 |
状态选择器
| :active | 鼠标激活的元素 | 1 |
|---|---|---|
| :hover | 鼠标悬浮的元素 | 1 |
| :link | 未访问的链接元素 | 1 |
| :visited | 已访问的链接元素 | 1 |
| :target | 当前锚点的元素 | 3 |
| :focus | 输入聚焦的表单元素 | 2 |
| :required | 输入必填的表单元素 | 3 |
| :valid | 输入合法的表单元素 | 3 |
| :invalid | 输入非法的表单元素 | 3 |
| :in-range | 输入范围内的表单元素 | 3 |
| :out-of-range | 输入范围外的表单元素 | 3 |
| :checked | 选项选中的表单元素 | 3 |
| :optional | 选项可选的表单元素 | 3 |
| :enabled | 事件启用的表单元素 | 3 |
| :disabled | 事件禁用的表单元素 | 3 |
| :read-only | 只读的表单元素 | 3 |
| :read-write | 可读可写的表单元素 | 3 |
| :target-within | 内部锚点元素处于激活状态的元素 | 4 |
| :focus-within | 内部表单元素处于聚焦状态的元素 | 4 |
| :focus-visible | 输入聚焦的表单元素 | 4 |
| :blank | 输入为空的表单元素 | 4 |
| :user-invalid | 输入合法的表单元素 | 4 |
| :indeterminate | 选项未定的表单元素 | 4 |
| :placeholder-shown | 占位显示的表单元素 | 4 |
| :current() | 浏览中的元素 | 4 |
| :past() | 已浏览的元素 | 4 |
| :future() | 未浏览的元素 | 4 |
| :playing | 开始播放的媒体元素 | 4 |
| :paused | 暂停播放的媒体元素 | 4 |
结构选择器
| :root | 文档的根元素 | 3 |
|---|---|---|
| :empty | 无子元素的元素 | 3 |
| :nth-child(n) | 元素中指定顺序索引的元素 | 3 |
| :nth-last-child(n) | 元素中指定逆序索引的元素 | 3 |
| :first-child | 元素中为首的元素 | 2 |
| :last-child | 元素中为尾的元素 | 3 |
| :only-child | 父元素仅有该元素的元素 | 3 |
| :nth-of-type(n) | 标签中指定顺序索引的标签 | 3 |
| :nth-last-of-type(n) | 标签中指定逆序索引的标签 | 3 |
| :first-of-type | 标签中为首的标签 | 3 |
| last-of-type | 标签中为尾的标签 | 3 |
| :only-of-type | 父元素仅有该标签的标签 | 3 |
属性选择器
| [attr] | 指定属性的元素 | 2 |
|---|---|---|
| [attr=val] | 属性等于指定元素的元素 | 2 |
| [attr*=val] | 属性包括指定值的元素 | 3 |
| [attr^=val] | 属性以指定值开头的元素 | 3 |
| [attr$=val] | 属性以指定值结尾的元素 | 3 |
伪元素
| ::before | 在元素前加入的内容 | 2 |
|---|---|---|
| ::after | 在元素后加入的内容 | 2 |
| ::first-letter | 元素的首字母 | 1 |
| ::first-line | 元素的首行 | 1 |
| ::selection | 鼠标选中的元素 | 3 |
| ::backdrop | 全屏模式的元素 | 4 |
| ::placeholder | 表单元素的占位 | 4 |
优点:
对于上述分类的选择器,我们可以规划处几点
- 减少很多无用或少用的类,保持
css文件的整洁性与观赏性 - 减少修改类而有可能导致样式失效的问题,有时修改类但未确保
HTML与CSS一样而导致样式失效 - 减少无实质性使用的类,例如很多层嵌套的标签,这些标签可能只用到一个属性,就无必要创建类关联
- 对于那些结构与行为分离的写法,使用
Scss/Less编写属性时结构会更清晰易读 - 使用选择器可实现一些看似只能由
JS才能实现的效果,既减少代码量也减少JS对DOM的操作,使得交互效果更流畅
因为选择器太多,所以下面列举几个比较常用的
:hover
这个选择器作用于鼠标悬浮的节点,是一个很好用的选择器。
通常也可以结合attr(),来应用于鼠标悬浮在某个节点中显示提示浮层
:valid与:invalid
通常我们在判断表单输入是否合法时,会使用JS来做判断,而h5发布后,上面两个选择器就可以替代而减少代码量
:checked
作用于选项选中的表单节点,不过只有当的type设置为radio与checkbox时可用
主要用于模拟鼠标点击事件
<input class="switch-btn" type="checkbox">
.btn {
border-radius: 31px;
width: 102px;
height: 62px;
background-color: #e9e9eb;
}
.switch-btn {
position: relative;
appearance: none;
cursor: pointer;
transition: all 100ms;
@extend .btn;
&::before {
position: absolute;
content: "";
transition: all 300ms cubic-bezier(.45, 1, .4, 1);
@extend .btn;
}
&::after {
position: absolute;
left: 4px;
top: 4px;
border-radius: 27px;
width: 54px;
height: 54px;
background-color: #fff;
box-shadow: 1px 1px 5px rgba(#000, .3);
content: "";
transition: all 300ms cubic-bezier(.4, .4, .25, 1.35);
}
&:checked {
background-color: #5eb662;
&::before {
transform: scale(0);
}
&::after {
transform: translateX(40px);
}
}
}
::before与::after
有时为了实现某个效果会在网页中添加很多的标签来书写效果,不过,写的太多也会显得很繁琐,这时会引入伪元素来解决。
伪元素在网页中是不存在的元素
伪类与伪元素虽然都是选择器,但它们还是存在一丝丝的差别。
伪类通常是一些状态选择器,选择处于指定状态的DOM,例如:hover、:focus、:checked等伪元素通常是一些实体选择器,选择满足指定条件的DOM,例如::selection、::first-letter、::first-line等