选择器可以选中页面上的特定元素并为其指定样式。 CSS提供了一组极其丰富的选择器,这些选择器可以以有趣的方式进行混合和匹配。
基础选择器
最基本的选择器
/* 通用选择器。 该选择器匹配所有元素 *//* focus(1:1) */* {color: red}/* 类型选择器或则标签选择器 *//* focus(1:1) */p {padding: 8px;}/*类选择器。该选择器匹配class属性中有指定类名的元素例如: <div class="my-class"> Hello World! </div>*//* focus(1:1) */.my-class {color: red}/*ID选择器。 该选择器匹配拥有指定ID属性的元素例如: <div id="my-id"> Hello World! </div>*//* focus(1:1) */#my-id {color: red}
伪类选择器
伪类选择器用于选择处于某种特定状态的元素。这种状态可能是由于用户交互,也可能是由于元素相对于其父级或兄弟元素的位置。
伪类选择器始终以一个冒号:
开始,其语法如下
selector:pseudo-class {property: value;}
例如,伪类 :hover
可以用于选择一个按钮,当用户的指针悬停在按钮上时,设置此按钮的样式
MDN上有超过50中不同类型的伪类, 建议您尽可能的查看一下。
下面我们会介绍一些常用的伪类
focus/focus-within
focus
: 匹配通过鼠标点击、触摸屏幕或者按Tab键导航而获得焦点的元素focus-within
: 解决嵌套元素的焦点问题。 当父元素中的任意子元素成为焦点时, 规则生效。
first-child/last-child/nth-child(an+b)、first-of-type/last-of-type
li:first-child
:li
如果是其兄弟元素中的第一个元素, 则匹配li:last-child
:li
如果是其兄弟元素中的最后一个元素, 则匹配li:nth-child(an+b)
:li
如果是其兄弟元素中的指定位置, 则匹配
li:first-of-type
: 一组兄弟元素中 指定类型 的第一个元素li:last-of-type
: 一组兄弟元素中 指定类型 的最后一个元素
has()、is()/where()、not()
has()
has()
允许开发者基于元素的子元素来选择元素。这个伪类本质上是一个父元素选择器
尝试实现下面功能, 注意切换 Show caption
时的差异
当<figure>
内部包含有<figcaption>
时,我希望<figure>
有以下特性:
- Padding
- Background
- Shadow
在没有has()
之前,我们只能通过Javascript
动态的给<figure>
元素添加某个类来实现该功能, 比如:
figure.with-caption {padding: 16px;background-color: #fff;box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1);}
但是有了has()
之后,仅通过CSS我们就能实现上面的要求
/* 当figure内部包含有figcaption时 */figure:has(figcaption) {padding: 16px;background-color: #fff;box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1);}
is()/where()
is()
和where()
都以选择器列表作为参数,并选择该列表中任意一个选择器可以选择的元素, 这对于以更紧凑的形式编写大型选择器非常有用。
例如你的同事编写了以下代码:
h1 > b, h2 > b, h3 > b, h4 > b, h5 > b, h6 > b {color: hotpink;}
那么你可以改用:is()
或 where()
达到相同的效果:
/* 提高易读性的同时避免了使用长选择器:*/:is(h1,h2,h3,h4,h5,h6) > b {color: hotpink;}
not()
用于选择不符合一组选择器的元素,因此也被称为反选伪类(negation pseudo-class)。它的作用是防止特定的元素被选中,通过将一个或多个以逗号分隔的选择器列表作为其参数,选择器中不得包含另一个否定选择器或伪元素
其语法如下:
:not(selector1, selector2, ...) {/* ... */}
下面用一个例子解释下该伪类是如何使用的, 需求如下:
- 创建一个
ul
列表, 内部包含n个li
- 除第一个
li
之外的其余li
左边距设为40px
你第一时间可能想到用下面这种方法去实现:
li {margin-left: 40px;}li:first-of-type {margin-left: 0px}
但其实使用not()
可以更简单的实现
link、hover、visited、active
伪元素选择器
伪元素类似于伪类,但是它不匹配特定状态的元素,而是匹配在文档中没有直接对应HTML元素的特定部分。伪元素选择器可能只匹配元素的一部分,甚至向HTML标记中未定义的地方插入内容
例如, 我们可以为用::marker
来为列表标记设置样式为📌.
:
其语法如下, 注意是::
这要与伪类区分开来:
selector::pseudo-element {property: value;}
细想一下,我们并没有显式的创建 列表标记, 但我们却可以通过::marker
来给它设置样式.
这就是为什么它们被称为伪元素
——这些选择器针对的是DOM中我们没有用HTML标记显式创建的元素。
伪元素类型
::before
:在选定元素的内容前插入内容。::after
:在选定元素的内容后插入内容。::first-letter
:选择元素的第一个字母。::first-line
:选择元素的第一行。::marker
:选择列表项的标记(例如列表项前的数字或符号)。::placeholder
:选择表单元素的占位符文本。::selection
:选择用户选中的文本。::backdrop
:选择元素的背景层,通常用于全屏模式下的背景。::file-selector-button
:选择文件输入元素的选择按钮。::cue
:选择媒体元素的文本轨道(例如字幕或描述)。::part()
:选择使用::part()属性定义的部分。::slotted()
:选择使用插槽(slot)插入的元素。
组合器
CSS组合器(Combinators)用于描述两个选择器之间的关系,它们帮助我们更精确地选择和样式化文档中的元素。CSS组合器可以将两个或多个选择器组合起来,以便更准确地定位和选择元素
以下是CSS中的四种组合器:
后代选择器(Descendant Selector)
:使用空格( )
来连接两个选择器,表示第二个选择器是第一个选择器的后代。例如,div p 选择所有在<div>
元素内部的<p>
元素。子选择器(Child Selector)
:使用大于号>
来连接两个选择器,表示第二个选择器是第一个选择器的直接子元素。例如,div > p 选择所有直接在<div>
元素内部的<p>
元素。相邻兄弟选择器(Adjacent Sibling Selector)
:使用加号+
来连接两个选择器,表示第二个选择器紧跟在第一个选择器后面,并且它们共享同一个父元素。例如,div + p 选择紧跟在<div>
元素后面的第一个<p>
元素。一般兄弟选择器(General Sibling Selector)
:使用波浪线~
来连接两个选择器,表示第二个选择器跟在第一个选择器后面,并且它们共享同一个父元素。例如,div ~ p 选择所有在<div>
元素后面的<p>
元素。
属性选择器
CSS属性选择器是一种强大的工具,它允许开发者根据元素的属性和属性值来选择和样式化元素。以下是CSS属性选择器的详细解释和使用示例:
基本用法
属性选择器的基本语法是[attr]
,它选择所有具有指定属性的元素。例如,a[title]
选择所有具有title属性的<a>
元素。
具体属性选择器:
[attr="value"]
:选择所有属性值完全匹配给定值的元素。[attr~="value"]
:选择所有属性值包含给定值的元素,且值之间用空格分隔。[attr|="value"]
:选择所有属性值以给定值开头的元素,且值之间用连字符分隔。[attr^="value"]
:选择所有属性值以给定值开头的元素。[attr$="value"]
:选择所有属性值以给定值结尾的元素。[attr*="value"]
:选择所有属性值包含给定值的元素。