4.5 复合选择器

复合选择器compound selector是简单选择器的一种组合:多个简单选择器连续紧跟,不允许有空格等符号,表示选择元素同时满足指定的多个条件。复合选择器除六种简单选择器外,还能够使用伪元素选择器。


4.5.1 复合选择器的基本使用

基本语法

标签名.类名#id名[属性名=属性值]:伪类名

标签名最多只能1个,如果设置必须放在开头;类名、属性可以设置多个。


示例

div.class1.class2#id1[prop1=value1][prop2=value2]

匹配元素:标签是div,且class属性同时含有class1与class2,且id等于id1、且标签属性prop1等于value1,且标签属性等于value2。

复合选择器至少包含两个条件。如果其中含有标签选择器,标签名放在最前,其它选择器的顺序任意。

示例代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>小步教程</title>

    <style>
        p.class1.class2{
            font-size: 20px;
            font-weight: 800;
        }
    </style>
</head>
<body>
    <div>
        <h4>小步教程 xiaobuteach.com</h4>
        <p class="class1">第1段</p>
        <p class="class2">第2段</p>
        <p class="class1">第3段</p>
        <p class="class2">第4段</p>
        <p class="class1 class2" id="p5">第5段</p>
    </div>
</body>
</html>

p.class1.class2匹配结果是第5段。


4.5.2 伪类选择器的实际运用

伪类选择器实际运用

A:伪类名称{/*样式定义*/}

A表示复合选择器的基本形式。伪类选择器在已有复合选择器后使用冒号,然后加伪类名称。继续介绍hover伪类与first-child伪类。

(1)伪类hover

需求场景:class1元素悬停时颜色变成蓝色。

        .class1:hover{
            color: #4aa6fc;
        }

(2)伪类first-child

A:first-child

选择器A首先匹配到元素集{e1,e2,……ei…,en},:first-child判断每个元素ei是否ei父元素的第一个子元素,如果是则匹配,如果不是则排除。项目经常出现“选择第1个子元素”的场景属于伪类first-child的逻辑。

提问。.class1:first-child匹配到哪几个元素?

        .class1:first-child{
            color: #4aa6fc;
        }

结果是匹配到第1段与第11段,选择过程:.class1选中第1段与第11段;第1段在父元素div1是第1个子元素,满足条件;第11段在父元素div2是第1个子元素,满足条件。初学者容易误解成只有第1段。


4.5.3 伪元素选择器

伪元素选择器与伪类选择器类似,如果单独使用表示针对所有元素,实际应用场景是用作复合选择器的一部分。

伪元素选择器语法

A::伪元素名称{/*样式定义*/}

A表示复合选择器的基本形式。伪元素选择器在已有复合选择器后使用两个冒号,然后加伪元素名称。伪元素名称是由CSS规范定义,每个伪元素名称有特定用途。项目常用伪元素::before与::after,::before表示在A元素内部开始位置添加一个无标签的元素,::after表示在内部结束位置添加一个无标签的元素,通过content指定内容。


需求:class1元素的开始添加内容“HTML”,class1元素的结尾添加内容“CSS"。

        .class1::before{
            content: 'HTML ';
        }

        .class1::after{
            content: ' CSS';
        }

运行效果

img

实际项目一般不会通过伪元素直接加文字,而是加特殊符号、图标等。

试一试。通配符(星号)选择器是否能匹配到::before与::after元素。

答案:不能。