前端修炼の道 | 你知道哪些复合选择器?

image

复合选择器是通过基本选择器进行组合后构成的,常用的复合选择器有:

  • 交集选择器

  • 并集选持器

  • 后代选择器

  • 子元素选择器

  • 相邻兄弟选择器

  • 属性选择器

交集选择器

交集选择器由两个选择器直接连接构成,其中第一个选择器必须是元素选择器,第二个选择器必须是类选择器或者 ID 选择器,例如:div.txt、div#txtID。两个选择器之间必须连续写,不能有空格。交集选择器选择的元素必须是由第一个选择器指定的元素类型,该元素必须包含第二个选择器对应的 ID 名或类名。交集选择器选择的元素的样式是三个选择器样式,即第一个选择器

使用交集元素选择器设置样式的语法如下:

元素选择器 . 类选择器| #ID 选择器 { 

 属性 1: 属性值 1;

 属性 2: 属性值 2;

 ... 

}

语法说明:“类选择器| ID 选择器”表示使用类选择器,或者使用 ID 选择器。

【示例 2-15】使用交集选择器设置样式。

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" />

<title> 使用交集选择器设置样式 </title>

<style>

/* 元素选择器设置边框和下外边距样式 */

div { 

 border: 5px solid red;

 margin-bottom:20px;

}

/* 交集选择器设置背景颜色 */

div.txt { 

 background:#33FFCC;

}

/* 类选择器设置字体格式 */ 

.txt { 

 font-style:italic;

}

</style>

</head>

<body>

    <div> 元素选择器效果 </div>

    <div class="txt"> 交集选择器效果 </div>

    <span class="txt"> 类选择器效果 </p>

</body>

</html>

上述 CSS 代码定义了 div 元素、类选择器 txt 和它们的交集选择器 div.txt 的样式。交集选择器所定义的背景颜色只作用于 <div class="txt">元素。上述代码在 Chrome 浏览器中的运行结果如图 2-15 所示。

image

从图 2-15 可看出,交集选择器所指定对象的最终样式是上述 CSS 中定义的三个选择器样式的层叠,有冲突时将选择优先级最高的样式来执行(有关样式的优先级的规定请参见 2.7 节)。

交集选择器由于会增加代码量,会影响性能且不利于后期维护,所以除了不得已要使用外,一般不推荐使用。

并集选择器

并集选择器也叫分组选择器或群组选择器,它是由两个或两个以上的任意选择器组成的,不同选择器之间用“,”隔开,实现对多个选择器进行“集体声明”。并集选择器的特点是所设置的样式对并集选择器中的各个选择器都有效。并集选择器的作用是把不同选择器的相同样式抽取出来,然后放到一个地方作一次性定义,从而简化了 CSS 代码量。

使用交集元素选择器设置样式的语法如下:

选择器 1,

选择器 2,

选择器 3,

… { 

 属性 1: 属性值 1;

 属性 2: 属性值 2;

 ... 

}

语法说明:选择器的类型任意,既可以是基本选择器,也可以是一个复合选择器。

【示例 2-16】使用并集选择器设置样式。

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" />

<title> 使用并集选择器设置样式 </title>

<style>

div {

    margin-bottom:10px;

    border:3px solid red;

}

span { 

    font-size:26px;

}

p { 

    font-style:italic;

}

/* 使用并集选择器设置元素的公共样式 */

span,

.p1,

#d1 { 

    background:#CCC;

}

</style>

</head>

<body>

     <div id="d1"> 这是 DIV1</div>

     <div> 这是 DIV2</div>

     <p class="p1"> 这是段落一 </p>

     <p> 这是段落二 </p>

     <span> 这是一个 SPAN</div>

</body>

</html>

上述 CSS 代码中共定义了四个选择器的样式。其中,前三个是元素选择器,用于定义各类元素的样式,第四个选择器:span,.p1,#d1为并集选择器,用于定义 span、第一个段落和第一个 div 这三个元素的公共样式,即浅灰色背景。我们看到该并集选择器中包含了元素选择器、类选择器和 ID 选择器,这完全符合前面说的并集选择器可以是任意类型的选择器的特点。示例 2-15 的运行结果如图 2-16 所示。

后代选择器

后代选择器又称包含选择器,用于选择指定元素的后代元素。使用后代选择器可以帮助我们更快更确切地找到目标元素。

使用后代元素选择器设置样式的语法如下:

    选择器 1 选择器 2 选择器 3 … { 

    属性 1: 属性值 1;

   属性 2: 属性值 2;

 ... 

}

语法说明:位于左边的选择器可以包含两个或多个使用空格隔开的选择器,位于后面的选择器选择的元素属于前面选择器选择元素的子级。这些选择器既可以是基本选择器,也可以是一个复合选择器。选择器之间的空格是一种结合符,按从右到左的方式顺序读选择器。此时,每个空格结合符可以解释为“××× 作为 ××× 的后代”,例如 div p 表示 p 作为 div 的后代。需注意的是,后代选择器所选择的后代元素包括任意嵌套层次的后代,所以 div p 又可解释为作为 div 后代元素的任意 p 元素。另外,虽然后代选择器中可以包含任意多个选择器,但为了便于阅读和理解,后代选择器中包含的选择器一般最多包含三级。

【示例 2-17】使用后代选择器设置

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" />

<title> 使用后代选择器设置样式 </title>

<style>

#box1 .p1 { /* 后代选择器 */

    background:#CCC;

}

#box2 p { /* 后代选择器 */

    background:#CFC;

}

</style>

</head>

<body>

     <div id="box1">

         <p class="p1"> 段落一 </p>

         <p class="p2"> 段落二 </p>

     </div>

     <div id="box2">

         <p class="p1"> 段落三 </p>

         <p> 段落四 </p>

     </div>

     <p class="p1"> 段落五 </p>

     <p> 段落六 </p>

</body>

</html>

上述 CSS 代码中定义了两个后代选择器样式,其中“#box1 .p1”后代选择器用于选择 ID 为 box1 元素中类名为 p1 的所有后代元素;“#box2 p”后代选择器用于选择 ID 为 box2 的元素中所有类型为 p 的后代元素。上述代码在浏览器中的运行结果如图 2-17 所示

image

从图 2-17 中可以看到,“#box1.p1”后代选择器只选择了段落一,虽然段落三和段落五的类名都是 p1,但由于它们不属于 #box1 元素的后代,因而没有被选择;而“#box2 p”后代选择器则只选择了段落三和段落四,其他段落的类型虽然也都是 p,但由于它们不属于 #box2 的后代,所以也没有被选择。

子元素选择器

后代选择器可以选择某个元素指定类型的所有后代元素,如果只想选择某个元素的所有子元素,则需要使用子元素选择器。

使用子元素选择器设置样式的语法如下:

选择器 1> 选择器 2 {

  属性 1: 属性值 1; 

  属性 2: 属性值 2;

 …

}

语法说明:“>”称为左结合符,在其左右两边可以出现空格,“选择器 1> 选择器 2”的含意为“选择作为选择器 1 指定元素的所有选择器 2 指定的子元素”,例如:div>span 表示选择了 div 元素内所有子元素 span。

子元素选择器中的两个选择器既可以是基本选择器,也可以是交集选择器,另外选择器 1 还可以是后代选择器。

【示例 2-18】子元素选择器应用示例。

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" />

<title> 子元素选择器应用示例 </title>

<style>

h1>span {

    color:red;

}

</style>

</head>

<body>

    <h1> 这是非常非常 <span> 重要 </span> 且 <span> 关键 </span> 的一步。</h1>

    <h1> 这是真的非常 <em><span> 重要 </span> 且 <span> 关键 </span></em> 的一步。</h1>

</body>

</html>

上述 CSS 代码中的 h1>span 选择了 h1 元素的所有子元素 span。在第一个 h1 元素中的两个 span 就是 h1 的子元素。而第二个 h1 中的两个 span 是 h1 元素中 em 里的子元素,它属于 h1 元素的子元素的子元素,所以没有被选中。因而 CSS 样式只对第一个 h1 元素的两个 span 元素有效,即只有第一行中的“重要”和“关键”这两个词显示红色,第二行的这两个词颜色没变。上述代码在 Chrome 浏览器中的运行结果如图 2-18 所示。

image

相邻兄弟选择器
如果需要选择紧接在某个元素后的元素,而且二者有相同的父元素,可以使用相邻兄弟选择器。相邻兄弟选择器的基本语法如下。

选择器 1+ 选择器 2 {

 属性 1: 属性值 1; 

 属性 2: 属性值 2;

 …

}

语法说明:“+”称为相邻兄弟结合符,在其左右两边可以出现空格,“选择器 1+ 选择器 2”的含意为选择紧接在选择器 1 指定元素后出现的选择器 2 指定的元素,且这两个元素拥有共同的父元素,例如:div+span 表示选择紧接在 div 元素后出现的 span 元素,其中 div 和 span 两个元素拥有共同的父元素。

【示例 2-19】相邻兄弟选择器应用示例。

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" />

<title> 相邻兄弟选择器应用示例 </title>

<style>

h1+p {

     color:red;

     font-weight:bold;

     margin-top:50px;

}

p+p{

     color:blue;

     text-decoration:underline;

}

</style>

</head>

<body>

     <h1> 这是一个一级标题 </h1>

     <p> 这是段落 1。</p>

     <p> 这是段落 2。</p>

     <p> 这是段落 3。</p>

</body>

</html>

上述 CSS 代码中的 h1+p 选择了 h1 元素后面的第一个 p,而 p+p 则选择了第一个 p 元素后面的各个 p 元素,因而第二个和第三个段落使用了 p+p 选择器样式,而第一个段落则使用了 h1+p 选择器样式。上述代码在 Chrome 浏览器中的运行结果如图 2-19 所示。

image

属性选择器

在 CSS 中,我们还可以根据元素的属性及属性值来选择元素,此时用到的选择器称为属性选择器。属性选择器的使用主要有 2 种形式,基本语法分别如下。

属性选择器 1 属性选择器 2...{

 属性 1: 属性值 1;

 属性 2: 属性值 2;

 …

}

元素选择器属性选择器 1 属性选择器 2... {

 属性 1: 属性值 1;

 属性 2: 属性值 2;

 …

}

语法说明:属性选择器的写法是 [ 属性表达式 ],其中属性表达式可以是一个属性名,也可以是“属性=属性值”等这样的表达式,例如:[tilte] 和 [type="text"] 都是属性选择器。属性选择器前可以指定某个元素选择器,此时将在指定类型的元素中进行选择,例如:img[title] 只能选择具有 title 属性的 img 元素。属性选择器前也可以使用通配符 ,此时效果和第一种形式完全一样,都不限定选择元素的类型,例如:[title] 和 [title] 效果完全一样,都将选择具有 title 属性的所有元素。

注意:元素选择器及“*”和属性选择器之间没有空格。另外,可以连续使用多个不同的属性选择器,此时将进一步缩小元素选择的范围,例如 a[href][title] 用于选择同时具有 href 和 title 属性的 a 元素。

常见的属性选择器格式如表 2-3 所示。

image

【示例 2-20】属性选择器的应用。

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" />

<title> 属性选择器的应用 </title

<style>

[title] {/* 选择具有 title 属性的元素 */

     color: #F6F;

}

a[href][title]{/* 选择同时具有 href 和 title 属性的 a 元素 */

     font-size: 36px;

}

img[alt] {/* 选择具有 alt 属性的 img 元素 */

     border: 3px #f00 solid;

}

p[align="center"] {/* 选择 align 属性等于 center 的 p 元素 */

     color: red;

    font-weight: bolder;

}

</style>

</head>

<body>

     <h2> 应用属性选择器样式:</h2>

     <h3 title="Helloworld">Helloworld</h3>

     <a title=" 首页 "href="#"> 返首页 </a><br/><br/>

     <img src="miaov.jpg" alt=" 妙味课堂 logo" />

     <p align="center"> 段落一 </p>

     <hr />

     <h2> 没有应用属性选择器样式

     <h3>Helloworld</h3>

     <a href="#"> 返首页 </a><br/><br/>

     <img src="miaov.jpg">

     <p align="right"> 段落二 </p>

</body>

</html>

上述 CSS 代码中使用了三个属性选择器,其中 [title] 属性选择器选择了第一个 h3 和第一个 a 元素,这两个元素都具有“title”属性;a[href][title] 属性选择器选择了第一个 a 元素,因为只有它同时具有 href 和 title 属性,所以第一个 a 元素同时具有了 [title] 属性器和 a[href][title] 属性选择器样式;img[alt] 选择器通过前面的 img 元素限定只能选择图片对象,而根据属性选择器,只选择了第一个 img 元素,因为只有它才具有“alt”属性;p[align="center"] 选择器通过前面的 p 元素限定了只能选择段落对象,根据属性选择器则只能选择第一个 p 元素,因为只有它才具有 align 属性,且值为“center”。上述代码在在 Chrome 浏览器中的运行结果如图 2-20 所示。

image

至此,我们已学习了一些常用的基本选择器和复合选择器。下一节我们来总结一下这些选择器的使用方法。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,486评论 1 45
  • 学会使用CSS选择器熟记CSS样式和外观属性熟练掌握CSS各种选择器熟练掌握CSS各种选择器熟练掌握CSS三种显示...
    七彩小鹿阅读 6,314评论 2 66
  • 1.CSS 元素选择器 最常见的 CSS 选择器是元素选择器。换句话说,文档的元素就是最基本的选择器。如果设置 H...
    饥人谷_小侯阅读 863评论 0 1
  • HTML 5 HTML5概述 因特网上的信息是以网页的形式展示给用户的,因此网页是网络信息传递的载体。网页文件是用...
    阿啊阿吖丁阅读 3,887评论 0 0
  • 在这炙热的夏天 需要一场雪 来自身体的土壤 给无望的火焰 给饥渴的眼睛 给干枯的喉咙 给焦灼的翅膀 当致命的欲望 ...
    舒严阅读 227评论 0 0