10 复合选择器

10.1 复合选择器的定义

在CSS中,可以根据选择器的类型把选择器分为基础选择器和复合选择器,复合选择器是建立在基础选择器之上,对基本选择器进行组合形成的。

  • 复合选择器可以更准确、更高效的选择目标元素(标签)
  • 复合选择器是由两个或多个基础选择器,通过不同的方式组合而成的
  • 常用的复合选择器包括∶后代选择器、子选择器、并集选择器、伪类选择器等等

10.2 属性选择器 {# arr-filter1}

属性选择器可以选择标签选择器或者类选择器中特定属性的标签。详见第18.2.1.1章。

CSS语法

CSS选择器[属性名="属性值"]{
    属性1:属性值1;
}

如:

选择inpt标签中,type属性为text的标签

input[type="text"]{
    border: 1px solid red;
}

选择v1类中,xx属性为456的标签

.v1[xx="456"]{
    color: gold;
}

10.3 后代选择器

后代选择器又称为包含选择器,可以选择父元素里面子元素。其写法就是把外层标签写在前面,内层标签写在后面,中间用空格分隔。当标签发生嵌套时,内层标签就成为外层标签的后代。

语法

元素1 元素2 {样式声明}

上述语法表示选择元素1里面的所有元素2(后代元素)。例如∶

ul li { 样式声明} /*选择ul里面所有的li标签元素
.c1 li { 样式声明} /*选择ul里面所有的li标签元素

这里的c1是类名

  • 元素1和元素2中间用空格隔开
  • 元素1是父级,元素2是子级,最终选择的是元素2
  • 元素2可以是儿子,也可以是孙了等,只要是元素1的后代即可
  • 元素1和元素2可以是任意基础选择器,如标签选择器,类选择器,ID选择器

例子

<head>
    <style>
        ol li {
            /* 我只选择ol中的li标签 */
            color: pink;
        }

        ol li a {
            color: red;
        }

        .navy li a {
            color: green;
        }
    </style>
</head>

<body>
    <ol>
        <li>我是ol 的孩子</li>
        <li>我是ol 的孩子</li>
        <li>我是ol 的孩子</li>
        <li>我是ol 的孩子</li>
        <li><a href="#">我是li 的孙子</a></li>
    </ol>
    <ul>
        <li>我是ul 的孩子</li>
        <li>我是ul 的孩子</li>
        <li>我是ul 的孩子</li>
        <li><a href="#">不会变化 </a></li>
    </ul>
    <ul class="navy">
        <li>我是ul 的孩子</li>
        <li>我是ul 的孩子</li>
        <li>我是ul 的孩子</li>
        <li><a href="#">不会变化 </a></li>
        <li><a href="#">不会变化 </a></li>
        <li><a href="#">不会变化 </a></li>

    </ul>
</body>

10.4 子选择器

子元素选择器(子选择器)只能选择作为某元素的最近一级子元素。简单理解就是选亲儿子元素.

语法

元素1>元素2{样式声明}

上述语法表示选择元素1里面的所有直接后代(子元素)元素2。例如∶

div > p {样式声明}/*选择div里面所有最近一级p标签元素*/
  • 元素1和元素2中间用大于号隔开

  • 元素1是父级,元素2是子级,最终选择的是元素2

  • 元素2必须是亲儿子,其孙子、重孙之类都不归他管.你也可以叫他亲儿子选择器

<head>
    <style>
        .nav>a {
            color: red;
        }
    </style>
</head>
<body>
    <div class="nav">
        <a href="#">
            我是儿子
        </a>
        <p>
            <a href="#">
                我是孙子
            </a>
        </p>
    </div>
</body>

10.5 并集选择器

并集选择器可以选择多组标签,同时为他们定义相同的样式。通常用于集体声明. 并集选择器是各选择器通过英文逗号(,)连接而成,任何形式的选择器都可以作为并集选择器的一部分。语法︰

元素1,元素2 {样式声明}

上述语法表示选择元素1和元素2。例如︰

ul, div {样式声明} /* 选择ul和div标签元素*/
  • 元素1和元素2中间用逗号隔开
  • 逗号可以理解为的意思
  • 并集选择器通常用于集体声明
  • 约定的语法规范,并集选择器喜欢竖着写
  • 最后一个选择器不加逗号

例子

要求:熊大熊二改为粉色 小猪一家改为粉色。

<head>
    <style>
        div,
        p,
        .pig li {
            color: pink;
        }
    </style>
</head>
<body>
    <div>熊大</div>
    <P>熊二</P>
    <span>光头强</span>
    <ul class="pig">
        <li>小猪佩奇</li>
        <li>小猪爸爸</li>
        <li>猪妈妈</li>
    </ul>
</body>

10.6 伪类选择器

伪类选择器用于向某些选择器添加特殊的效果,比如给链接添加特殊效果,或选择第1个,第n个元素。

伪类选择器书写最大的特点是用冒号( :)表示,比如:hover . :first-child。

因为伪类选择器很多,比如有链接伪类、结构伪类等,所以这里先给大家讲解常用的链接伪类选择器。

10.6.1 链接伪类

语法

a : link /*选择所有未被访问的链接*/
a : visited /*选择所有已被访问的链接*/
a : hover /*选择鼠标指针位于其上的链接*/
a : active /* 选择活动链接(鼠标按下未弹起的链接) */

例子

<head>
    <style>
        /* 未访问过的链接 a:link 把没有点击过的链接选出来*/
        a:link {
            color: #333;
            text-decoration: none;
        }

        /* a: visited 选择访问过的链接 */
        a:visited {
            color: orange;
        }

        /* a: hovor  选择鼠标经过的链接 */
        a:hover {
            color: skyblue;
        }

        /* a:active 选择鼠标正在按下,还没有正在弹起的链接 */
        a:active {
            color: green;
        }
    </style>
</head>
<body>
    <a href="#">小猪佩奇</a>
</body>

注意事项

  1. 为了确保生效,请按照LVHA的循顺序声明:link - :visited - :hover - :active。 记忆法:love hate。

  2. 因为a链接在浏览器中具有默认样式,所以我们实际工作中都需要给链接单独指定样式。

实际开发中最常见的写法

/* a是标签选择器瞭所有的链接*/
a {
  color: gray;
}
/ * :hover是链接伪类选择器鼠标经过*/
a : hover {
  color: red; /*鼠标经过的时候,由原来的灰色变成了红色*/}
}
<head>
    <style>
        a {
            color: #333;
            text-decoration: none;
        }

        a:hover {
            color: #369;
        }
    </style>
</head>

<body>
    <a href="#">小猪佩奇</a>
    <a href="http://www.xxxxxx.com">未知的网站</a>
</body>

10.6.2 :hover伪类选择器的应用

  1. 鼠标放在文字上,改变其样式(颜色、字体大小)
    <style>
        .c1 {
            color: red;
            font-size: 18px;
        }

        .c1:hover {
            color: green;
            font-size: 26px;
        }
    
    </style>
          
<body>      
    <div class="c1">联通</div>
    <div class="c2">广西</div>
</body>
  1. 鼠标放在文字上,显示隐藏图片
    <style>

        .download {
            display: none;
        }

        .app:hover .title {
            color: red;
        }

        .app:hover .download {
            display: block;
        }
    
    </style>
          
<body>      
    <div class="app">
        <div class="title">下载APP</div>
        <div class="download">
            <img src="a1.jpeg" alt="" style="width: 200px;">
        </div>
    </div>
</body>

10.6.3 :after选择器

在选择器的末尾加入内容

  1. 功能1:在每个c1类文字末尾加上“大帅哥”三个字
<head>
    <style>
        .c1::after {
            content: "大帅哥";
        }
    </style>
</head>

<body>
    <div class="c1">ABCD</div>
    <div class="c1">ABCD</div>
    <div class="c1">ABCD</div>
    <div class="c1">ABCD</div>

</body>
  1. 功能2:对于浮动元素,在标签尾部加入clear:both

参考见第 15.8.6

10.6.4 :focus伪类选择器

:focus 伪类选择器用于选取获得焦点的表单元素。

焦点就是光标,一般情况<input>类表单元素才能获取,因此这个选择器也主要针对于表单元素来说。

input :focus {
  background-color: yellow ;
}

例子

<head>
    <style>
        /* 把光标的input表单元素选出来 */
        input:focus {
            background-color: pink;
            color: red;
        }
    </style>
</head>

<body>
    <input type="text">
    <input type="text">
    <input type="text">
</body>

10.7 复合选择器总结

表10.1: 复合选择器总结
选择器 作用 特征 使用情况 隔开符号及用法
后代选择权 用来选择后代元素 可以是子孙后代 较多 符号是空格 .nav a
子代选择器 选择最近一级元素 只选亲儿子 较少 符号是大于 .nav>p
并集选择权 选择某些相同样式的元素 可以用于集体声明 较多 符号是逗号 .nav,.header
链接选择器 选择不同状态的链接 跟链接相关 较多 重点记住a{}和a:hovor 实际开发的写法
:focus选择器 选择获得光标的表单 跟表单相关 较少 input:focus 记住这个写法

10.8 多个选择器的覆盖问题

以CSS样式的顺序为准,如

    <style>
        .c1 {
            color: red;
            border: 1px solid red;
        }

        .c2 {
            font-size: 28px;
            color: green;
        }

由于CSS样式代码中c2类定义在后面。下面的html中,c2中的字色的绿色会覆盖c1中的红色字色。

    <div class="c1 c2">
        中国联通
    </div>

如果不想让CCS中后定义的覆盖前面的定义的样式:可以在前面不想被覆盖的样式中加入 !important

        .c1 {
            color: red !important;
            border: 1px solid red;
        }

        .c2 {
            font-size: 28px;
            color: green;
        }

10.9 课堂练习

  1. 将下面链接文字改为红色
<div class="nav">
    <ul>
        <li><a href="#">百度</a></li>
        <li><a href="#">百度</a></li>
    </ul>
</div>
<style>
    .nav li a {
        color: red;
    }
</style>
  1. 将下面的大肘子文字修改为红色
<div class="hot">
    <a href="#">大肘子</a>
    <ul>
        <li><a href="#">猪头</a></li>
        <li><a href="#">猪尾巴</a></li>
    </ul>
</div>
<style>
    .hot>a {
        color: red;
    }
</style>