zoukankan      html  css  js  c++  java
  • css: 组合选择器

     组合选择器:后代选择器、子元素选择器、兄弟选择器、交集选择器和并集选择器这几种复合选择器

    一、后代选择器

    后代选择器的语法是用空格分隔的多个选择器组合,它的作用是在 A 选择器的后代元素中找到 B 选择器所指的元素。它的语法形式就是:“选择器 A 选择器 B” ,例如:

    <!-- HTML -->
    <div class="page">
        <div class="article">
            <h1>我是标题部分</h1>
            <p>黑化肥发灰,灰化肥发黑</p>
            <p>黑化肥发灰会挥发;灰化肥挥发会发黑</p>
            <p>黑化肥挥发发灰会花飞;灰化肥挥发发黑会飞花</p>
        </div>
        <p class="footer">版权 © tuituitech.com</p>
    </div>
    
    // CSS:
    .page p{
        font-size: 18px;
    }

    上面的例子中就是一个标准的后代选择器,“.page p” 就表示在 .page 选定的区域里去找 p 标签。上面的后代选择器就会把 class 为 page 元素里面的所有 p 元素的字体都改成 18px。后代选择器最主要的目的是在给元素加一个范围的限制,上面例子中如果直接用一个标签选择器 p 效果也是一样的,但这样容易影响到页面里其他部分的 p 元素,所以前面加个 .page 给它限定住。

    我们要注意,后代选择器是可以叠加使用的。假如我们只想限定 class=“article” 元素里的 p 标签字号是 18px,也可以用下面的方式:

    // CSS:
    .page .article p{
        font-size: 18px;
    }

    Tips:后代选择器通常用来限制选择器生效的范围,防止因为选择器使用不当或者对元素命名出现重复造成的样式冲突。

    二、元素选择器

    子元素选择器和后代选择器类似,也是为选择器限定范围。不同的是子元素选择器只找子元素,而不会把所有的后代都找一遍。它的语法是 “选择器 A> 选择器 B”,例如:

    <!-- HTML -->
    <div class="page">
        <div class="article">
            <h1>我是标题部分</h1>
            <p>黑化肥发灰,灰化肥发黑</p>
            <p>黑化肥发灰会挥发;灰化肥挥发会发黑</p>
            <p>黑化肥挥发发灰会花飞;灰化肥挥发发黑会飞花</p>
        </div>
        <p class="footer">版权 © tuituitech.com</p>
    </div>
    
    // CSS:
    .page > p{
        color: grey;
    }

    用 “.page> p” 这个选择器就会把 .page 元素里面的 .footer 元素的字体变成灰色,但不会对 .article 元素下的 p 元素产生影响。

    子元素选择器也是可以叠加使用的,还按上面的例子,假如我们想使用子元素选择器仅设置 .article 元素里面的 p 元素样式,我们就可以用下面的选择器来实现:

    // CSS:
    .page > .article > p{
        color: black;
    }

    Tips:
    子元素选择器的作用和后代选择器相似,也是用来限制选择器生效的范围。它和后代选择器不同的是:
    1. 子元素选择器只匹配子元素,不会匹配后代元素。在有确定的父子关系时,尽量使用子元素选择器,效率会比后代选择器高。
    2. 使用子元素选择器还可以避免对非直接后代的样式影响,在只想给子元素设置样式时会比后代选择器安全。

    三、兄弟选择器

    在 CSS 中,还有一种选择器是用来选取同级元素的,叫做兄弟选择器。兄弟选择器有两种,一种是相邻兄弟选择器,另外一种是通用兄弟选择器。

    • 相邻兄弟选择器

    相邻兄弟选择器是用来选取某个元素紧邻的兄弟元素,它的语法是 “选择器 A + 选择器 B”,表示找到与 A 元素相邻的 B 元素。其实就是对选择器 B 加上 “紧邻着选择器 A” 的限制。一下面的代码为例:

    <!-- HTML -->
    <div class="article">
        <p>黑化肥与灰化肥</p>
        <h1>我是标题部分</h1>
        <p>黑化肥发灰,灰化肥发黑</p><!--生效-->
        <p>黑化肥发灰会挥发;灰化肥挥发会发黑</p>
        <p>黑化肥挥发发灰会花飞;灰化肥挥发发黑会飞花</p>
    </div>
    // CSS
    h1 + p{
        margin-top: 10px;
        color: red;
    } 

    上面的例子中,h1 + p 选择器就表示选择紧邻 h1 元素的 p 元素,让这个 p 元素距离标题隔开 10px,并且字体设置为红色。这里要注意,相邻选择器只能选择紧挨在 h1 后面的 p 元素,而不能向前找。

    Tips:
    相邻兄弟选择器通常有两类用处:
    1. 用于自动调整占位,比如后面在布局的时候,有 header 和没 header 情况下内容区的高度会不同,就可以使用相邻兄弟选择器来控制内容区的高度。
    2. 相邻兄弟选择器的第二种用法是用来控制相同元素中间的间隔,比如在 List 组件开发时,每个 li 元素之间要加上分割线的需求就会通过相邻兄弟选择器来实现。

    • 通用兄弟选择器

     通用兄弟选择器和相邻兄弟选择器很相似,它的语法是 “选择器 A ~ 选择器 B”,也是用选择器 A 做限制,选择器 B 是最终匹配的目标。不同的是通用兄弟选择器会匹配选择器 A 指定元素后面的所有符合选择器 B 规则的元素。

     
    <!-- HTML -->
    <div class="article">
        <p>黑化肥与灰化肥</p>
        <h1>我是标题部分</h1>
        <p>黑化肥发灰,灰化肥发黑</p><!--red-->
        <p>黑化肥发灰会挥发;灰化肥挥发会发黑</p><!--red-->
        <p>黑化肥挥发发灰会花飞;灰化肥挥发发黑会飞花</p><!--red-->
    </div>
    
    // CSS
    h1 ~ p{
        color: red;
    } 

    Tips:
    兄弟选择器(包括相邻兄弟选择器和通用兄弟选择器)中都是只能向后选择,如果需要向前选择,就只能给前面的元素指定上 class,再用类选择器来实现了。

    四、交集选择器

    交集选择器是为了找两个或多个选择器的交集,用法就是把两个选择器放在一起,形式如 “选择器 A 选择器 B”,中间不需要加空格或者其他符号。交集选择器最主要的作用是在限定范围内标识特殊的样式。

    <!-- HTML -->
    <div class="menu">
        <a class="menu-item">菜单1</a>
        <a class="menu-item active">菜单2</a>
        <a class="menu-item">菜单3</a>
        <a class="menu-item">菜单4</a>
    </div>
    // CSS
    .menu-item{
        background: #ccc;
        color: #000;
    }
    .menu-item.active{
        background: #aaa;
        color: #fff;
    }

    通过 .menu-item 给所有菜单元素一个基础样式,然后通过交集选择器 .menu-item.active 给当前活跃的菜单选项一个特殊的标记。在这个例子里,交集选择器有两个意思,一方面是把选择器限定在 .menu-item 范围内,另一方面是选中范围内比较特殊的 .active 元素。

    五、并集选择器

    并集选择器是为了合并类似的样式,可以把选择器不同但样式相同的 CSS 语法块做合并。并集选择器就是用逗号分割多个选择器,形式如 “选择器 A, 选择器 B”,表示该样式对选择器 A 和选择器 B 所选择的元素都生效。

    // CSS
    h1{
        margin: 0;
        padding: 0;
    }
    h2{
        margin: 0;
        padding: 0;
    }
    h3{
        margin: 0;
        padding: 0;
    }

    上面的样式是希望把 h1,h2 和 h3 的内外边距都归零,来解决不同浏览器中元素默认的内外边距不一致的问题。这种写法会占用很多 CSS 代码量,但是可以通过并集选择器来进行简化:

    h1, h2, h3{
        margin: 0;
        padding: 0;
    }

  • 相关阅读:
    [Swift]LeetCode462. 最少移动次数使数组元素相等 II | Minimum Moves to Equal Array Elements II
    [Swift]LeetCode458. 可怜的小猪 | Poor Pigs
    [Swift]数组排序:sort和sorted
    2013年总结(0)-序
    2013年总结(0)-序
    互联网日志的种类、存储和计算
    互联网日志的种类、存储和计算
    第一次当面试官
    第一次当面试官
    JS实践与写博客-序
  • 原文地址:https://www.cnblogs.com/Nyan-Workflow-FC/p/13072040.html
Copyright © 2011-2022 走看看