CSS选择器是用于选择文档中特定元素以便应用样式的强大工具。以下是您提到的几种选择器类型的详细解释:
-
CSS属性选择器:
- 属性选择器允许您基于HTML元素的属性及其值来选择元素。
- 常见属性选择器包括:
[attribute]
:匹配任何带有指定属性的元素,不论属性值为何。[attribute=value]
:匹配属性值精确等于给定字符串的元素。[attribute~=value]
:匹配属性值是一个以空格分隔的单词列表,其中含有指定值的元素。[attribute^=value]
:匹配属性值以指定字符串开头的元素。[attribute$=value]
:匹配属性值以指定字符串结尾的元素。[attribute*=value]
:匹配属性值包含指定字符串的元素。[attribute|=value]
:匹配属性值要么精确等于指定字符串,要么以指定字符串紧接着连字符-
开始的元素。
-
关系选择器:
- 关系选择器用来根据元素之间的上下文关系来选择元素。
E F
:选择作为E元素后代的所有F元素。E > F
:选择作为E元素直接子元素的所有F元素。E + F
:选择紧接在E元素之后的第一个同级F元素。E ~ F
:选择E元素之后的所有同级F元素。
- 关系选择器用来根据元素之间的上下文关系来选择元素。
-
结构化伪类选择器:
- 结构性伪类根据元素在DOM树中的位置或结构来选择元素,不依赖于文档源顺序。
:root
:匹配文档根元素,在HTML文档中通常是<html>
。:first-child
:匹配父元素的第一个子元素。:last-child
:匹配父元素的最后一个子元素。:only-child
:匹配没有其他同胞元素的元素。:nth-child(n)
:匹配其父元素的第n个子元素。:nth-last-child(n)
:匹配其父元素倒数第n个子元素。:empty
:匹配没有子元素(包括文本节点)的元素。
- 结构性伪类根据元素在DOM树中的位置或结构来选择元素,不依赖于文档源顺序。
-
状态化伪类选择器:
- 这些选择器用于基于用户界面状态(如鼠标悬停、焦点状态、是否被选中等)来选择元素。
:hover
:匹配鼠标指针位于其上方的元素。:focus
:匹配获得焦点(比如通过键盘导航)的元素。:active
:匹配正在被用户激活(通常是指按下鼠标按钮还未释放)的元素。:visited
:匹配用户已访问过的链接(仅适用于<a>
元素)。:link
:匹配未被用户访问过的链接(也仅适用于<a>
元素)。:target
:匹配URL指向的ID相同的元素。
- 这些选择器用于基于用户界面状态(如鼠标悬停、焦点状态、是否被选中等)来选择元素。
-
伪元素选择器:
- 伪元素不是真正的DOM元素,而是可以通过CSS创建虚拟内容或样式化某些特殊部分。
::before
:在元素的实际内容之前插入内容,通常配合content
属性一起使用。::after
:在元素的实际内容之后插入内容,同样需要配合content
属性。::first-letter
:可以选择元素内文本的第一个字母。::first-line
:可以选择元素内文本的第一行。::selection
:可以选择用户高亮选择的部分。::placeholder
:可以样式化input元素的占位符文本。
- 伪元素不是真正的DOM元素,而是可以通过CSS创建虚拟内容或样式化某些特殊部分。
请注意,伪元素选择器在CSS3中建议使用双冒号 (::),尽管单冒号 (:before, :after) 在许多浏览器中仍然兼容,但为了规范和未来兼容性,推荐使用双冒号形式。
以下是一些不同类型CSS选择器的实例:
属性选择器实例:
/* 匹配所有带有href属性的a元素 */
a[href] {
color: blue;
}
/* 匹配title属性值为"important"的所有元素 */
*[title="important"] {
font-weight: bold;
}
/* 匹配class属性中包含"highlight"的元素 */
[class*="highlight"] {
background-color: yellow;
}
/* 匹配id属性以"header-"开始的元素 */
[id^="header-"] {
border-top: 2px solid black;
}
/* 匹配src属性值以".jpg"结尾的img元素 */
img[src$=".jpg"] {
max-width: 100%;
}
关系选择器实例:
/* 选择作为div元素后代的所有p元素 */
div p {
margin-bottom: 1em;
}
/* 选择作为任意元素直接子元素的strong元素 */
* > strong {
font-weight: bolder;
}
/* 选择紧跟在一个h2元素后的第一个同级p元素 */
h2 + p {
text-indent: 1em;
}
/* 选择紧随在某个li元素之后的所有同级li元素 */
li ~ li {
margin-top: 0.5em;
}
结构化伪类选择器实例:
/* 选择文档根元素下的所有body元素 */
:root body {
background-color: white;
}
/* 选择作为父元素的第一个子元素的所有p */
p:first-child {
font-weight: bold;
}
/* 选择作为父元素最后一个子元素的a元素 */
a:last-child {
text-decoration: underline;
}
/* 选择没有同胞元素的li */
li:only-child {
list-style-type: none;
}
/* 选择每个ul下的第偶数个li */
ul li:nth-child(even) {
background-color: lightgray;
}
状态化伪类选择器实例:
/* 当鼠标悬停在链接上时改变其颜色 */
a:hover {
color: red;
}
/* 当输入框获得焦点时边框变粗 */
input:focus {
border: 2px solid blue;
}
/* 已访问过的链接颜色变淡 */
a:visited {
color: purple;
}
/* 为目标锚点添加背景色 */
:target {
background-color: yellow;
}
伪元素选择器实例:
/* 在每个段落前插入引号 */
p::before {
content: open-quote;
}
/* 在每个段落后添加省略号 */
p::after {
content: "…";
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* 高亮用户选择的文本 */
::selection {
background-color: lightblue;
color: white;
}
/* 样式化input元素的placeholder文本 */
input::placeholder {
color: gray;
opacity: 0.8;
}