类>元素的优先级,以及案例里给标题区挑元素的做法">
Skip to content

上一节给日期上样式时,span { color: #b2b2b2; } 里的 span 就是选择器。这一篇把它讲透:页面元素那么多,样式到底怎么"点"到你要改的那一个身上。

选择器的作用 ​

CSS 选择器是用来选取需要设置样式的元素(标签)的。

写样式的套路永远是两步:

css
选择器 {        /* ① 选谁 */
  属性: 值;     /* ② 改成什么样 */
}
  • 选择器:先"点名",选出页面上要改的元素;
  • 声明块:给选中的元素加上一条条属性。

名点得越准,样式就越不会"误伤"别的元素——这就是这一篇要练的手感。

六类选择器 ​

PPT 给了一张完整的选择器表:

选择器写法示例示例说明
元素选择器元素名称 {...}h1 {...}选择页面上所有的 <h1> 标签
类选择器.class属性值 {...}.cls {...}选择页面上所有 class 属性为 cls 的标签
id 选择器#id属性值 {...}#hid {...}选择页面上 id 属性为 hid 的标签
分组选择器选择器1,选择器2 {...}h1,h2 {...}选择页面上所有的 <h1> 和 <h2> 标签
属性选择器元素名称[属性] {...}input[type] {...}选择页面上有 type 属性的 <input> 标签
元素名称[属性名="值"] {...}input[type="text"] {...}选择页面上 type 属性为 text 的 <input> 标签
后代选择器元素1 元素2 {...}form input {...}选择 <form> 标签内的所有 <input> 标签

一行行对照着看,六类选择器各自的规则与对应的 HTML 长这样:

① 元素选择器——把页面上所有 <h2> 都变红:

html
<style>
  h2 { color: red; }   /* 页面上有几个 h2,就有几个被选中 */
</style>
<h2>所有 h2 都被选中</h2>

② 类选择器——只选 class="cls" 的元素(可以有很多个,也可以挂在不同的标签上):

html
<style>
  .cls { color: #ff0000; }   /* 注意开头有一个点 */
</style>
<p class="cls">class 为 cls 的段落</p>
<span class="cls">class 为 cls 的文字</span>

③ id 选择器——只选 id="hid" 的那一个元素(一个页面里 id 不能重复):

html
<style>
  #hid { color: #b2b2b2; }   /* 开头是井号 */
</style>
<span id="hid">id 为 hid 的元素</span>

④ 分组选择器——一条规则同时点两拨元素,选择器之间用逗号隔开:

html
<style>
  h1, h2 { color: #0000ff; }   /* 所有 h1 和所有 h2 一起改 */
</style>

⑤ 属性选择器——按"有没有某个属性 / 属性等不等于某个值"来选(表单里特别常用):

html
<style>
  input[type] { color: red; }          /* 只要写了 type 属性的 input 都选中 */
  input[type="text"] { color: gray; }  /* 只选 type 等于 text 的 input */
</style>

⑥ 后代选择器——只选"某个祖先里面的"元素,两个选择器之间用空格隔开:

html
<style>
  form input { color: red; }   /* 只改 form 里面的 input,页面别处的 input 不动 */
</style>

TIP

分清两个"分隔符":逗号是"分组"(各选各的,一起应用同一条规则),空格是"后代"(先找到前一个,再在它里面找后一个)。h1,h2 是选所有 h1 和 h2;h1 h2 是选"h1 里面的 h2"。

最常用的三类:元素、类、id ​

PPT 专门用一页提问"最为常见的三类选择器的写法",因为它们占了日常写样式的绝大多数:

选择器写法例子特点
元素选择器标签名 {...}span {...}一网打尽,页面上所有该标签都改
类选择器.class属性值 {...}.cls {...}谁加了 class="cls" 谁被选中,可复用(多个元素共用一套样式)
id 选择器#id属性值 {...}#time {...}精准到唯一的一个元素(id 在一个页面里不能重复)

用哪个取决于"要改几个元素":

  • 全都要改 → 元素选择器(最省事);
  • 一批同类元素都要改 → 类选择器(比如所有"日期"都变灰);
  • 就要改某一个 → id 选择器(比如全页面只有一处的标题)。

案例实战:给标题区挑元素 ​

标题区里要改的就是那行日期。课程文件 05. 央视新闻-标题-样式(选择器).html 把上一节的元素选择器换成了 id 选择器:

html
<head>
  <style>
    /* 元素选择器 */
    /* span {
      color: #b2b2b2;
    } */

    /* 类选择器 */
    /* .cls {
      color: #ff0000;
    } */

    /* ID选择器 */
    #time {
      color: #b2b2b2;
    }

    a {
      /* 去除超链接下方的下划线 */
      text-decoration: none;
    }
  </style>
</head>

<body>
  <!-- 定义一个标题, 标题内容: 【新思想引领新征程】推进长江十年禁渔 谱写长江大保护新篇章 -->
  <h1>【新思想引领新征程】推进长江十年禁渔 谱写长江大保护新篇章</h1>

  <!-- 定义一个超链接, 里面展示 央视网 -->
  <a href="https://www.cctv.com" target="_blank">央视网</a>

  <!-- 日期:同时挂了 class 和 id,方便用不同方式选中它 -->
  <span class="cls" id="time">2024年05月15日 20:07</span>
</body>

案例里待选中的元素图:#time 选中的就是这一行日期(<span> 里的内容),而 a 选中了"央视网"这个链接

这段代码里有三个值得注意的地方:

  1. #time 比 span 更精准:span 会改掉页面上所有 <span>,#time 只改挂了 id="time" 的那一个。元素上同时写了 class="cls" 和 id="time",就是留给不同选择器点的——class 负责"一批",id 负责"唯一"。
  2. a { text-decoration: none; } 是元素选择器:把页面上所有超链接下面的下划线去掉,让"央视网"看起来像正文的一部分——这是我们第一次给"选中元素"写新属性(text-decoration 管文字修饰线)。
  3. 注释掉的规则不是废话:span、.cls 两条留着,换一种选法只要把注释放开——这也说明同一条样式可以用不同选择器来写。

IMPORTANT

class 和 id 都不是给用户看的,而是给"选择器"用的"门牌号"。所以先把名字挂在标签上(class="cls" id="time"),再用选择器按名字找它(.cls / #time)。

优先级:谁说了算 ​

同一个元素被多条规则命中时,优先级高的赢。PPT 给的顺序:

优先级:id 选择器 → 类选择器 → 元素选择器

也就是说 #time 的规则会盖过 .cls 的规则,.cls 的规则会盖过 span 的规则。在案例里把三种都放开,最后生效的一定是 #time 那条。

两条补充规则(PPT 没展开,写代码时会碰到):

  • 优先级相同时,写在后面的覆盖写在前面的——这就是"层叠样式表"里"层叠"的意思;
  • 行内样式(写在标签 style 属性上的那种,见 06 篇)优先级比上面这些选择器都高:它是直接贴在元素身上的,选择器再精准也盖不过它。

TIP

优先级冲突是"样式怎么不生效"的头号原因。排查顺序:先看有没有更高优先级的规则赢了(浏览器开发者工具里被划掉的样式就是被覆盖的),再检查属性名拼写和分号。

选择器命名建议 ​

选择器写起来容易,起名才是长期成本。工程里通行的做法:

  • 用英文、全小写,多个单词用连字符连接(news-title、news-date),别用中文、空格、数字开头;
  • 见名知义,描述"是什么"而不是"长什么样"——news-date 好过 gray-text(颜色以后可能会改,名字就过期了);
  • 类名可以复用,多个元素、甚至同一个元素都可以有多个类名(class="news-date important",用空格隔开);
  • id 在一个页面里必须唯一:它既是选择器的门牌号,也是后面 JavaScript 找元素的抓手。

小结 ​

要点内容
选择器的作用选取需要设置样式的元素(标签),写法是 选择器 { 属性: 值; }
六类选择器元素(h1)、类(.cls)、id(#hid)、分组(h1,h2)、属性(input[type="text"])、后代(form input)
最常用三类元素选择器:标签名 {...};类选择器:.class属性值 {...};id 选择器:#id属性值 {...}
优先级id 选择器 → 类选择器 → 元素选择器;优先级相同时后写的生效;行内样式优先级最高
案例里的用法#time 选中日期(唯一)、a 选中所有超链接去掉下划线

相关 ​

练习题 ​

一、知识回顾(读完直接做下面的实践题) ​

  1. CSS 选择器是用来选取需要设置样式的元素(标签)的;样式规则的标准写法是 选择器 { 属性: 值; }
  2. 元素选择器:写法 元素名称 {...},示例 h1 {...}——选择页面上所有的 <h1> 标签
  3. 类选择器:写法 .class属性值 {...},示例 .cls {...}——选择页面上所有 class 属性为 cls 的标签,可以复用(多个元素共用一套样式)
  4. id 选择器:写法 #id属性值 {...},示例 #hid {...}——选择页面上 id 属性为 hid 的那一个标签(id 在页面里必须唯一)
  5. 分组选择器:写法 选择器1,选择器2 {...},示例 h1,h2 {...}——选择页面上所有的 <h1> 和 <h2> 标签(用逗号分隔)
  6. 属性选择器:写法 元素名称[属性] {...}(如 input[type],选有 type 属性的 <input>)和 元素名称[属性名="值"] {...}(如 input[type="text"],选 type 属性为 text 的 <input>)
  7. 后代选择器:写法 元素1 元素2 {...},示例 form input {...}——选择 <form> 标签内的所有 <input> 标签(两个选择器之间用空格分隔)
  8. 优先级:id 选择器 → 类选择器 → 元素选择器;优先级相同时,写在后面的覆盖写在前面的;行内样式(标签 style 属性)的优先级比这些选择器都高
  9. 最常用的三类选择器写法:元素选择器 标签名 {...}、类选择器 .class属性值 {...}、id 选择器 #id属性值 {...}
  10. 案例里的两条规则:#time { color: #b2b2b2; } 把唯一的日期调成浅灰;a { text-decoration: none; } 把页面上所有超链接的下划线去掉

二、裸写题 ​

  • - 提示(先自己想,实在想不出再点开)

    一级 · 思路:好几个同类元素要一起改——这是"元素选择器"最擅长的场景 二级 · 方法:元素选择器写标签名;去掉文字修饰线用属性 text-decoration,值 none三级 · 骨架:____ { text-decoration: ____; }

    - 参考答案(做完再点开)

    css
    /* 元素选择器:页面上所有超链接 */
    a {
      /* 去除超链接下方的下划线 */
      text-decoration: none;
    }

    对照课程 05. 央视新闻-标题-样式(选择器).html:这里就是把 a { text-decoration: none; } 抄了一遍。它选的是页面上所有 <a>——正合需求。

    1. 第一条摘要的文字用深蓝
    2. 第二条摘要用深红
    3. 两条规则的名字要能看懂是干什么的,而且以后再加摘要时可以直接复用 (练习文件 test_07_类选择器.html 里有这两段摘要,样式写在 head 的样式区。)

    - 提示(先自己想,实在想不出再点开)

    一级 · 思路:要分别选中"两条不同的内容"——点一整类标签(元素选择器)会一起改,得给它们各自挂个名字 二级 · 方法:类选择器:.class属性值 { ... };名字用英文加连字符,如 .news-blue(见名知义);颜色可以用关键字、rgb 或十六进制 三级 · 骨架:.___ { color: ____; } / .___ { color: ____; },同时要在标签上写 class="____"

    - 参考答案(做完再点开)

    html
    <style>
      /* 第一条摘要:深蓝 */
      .news-a {
        color: #000080;
      }
      /* 第二条摘要:深红 */
      .news-b {
        color: #800000;
      }
    </style>
    <body>
      <p class="news-a">第一条摘要……</p>
      <p class="news-b">第二条摘要……</p>
    </body>

    检查两点:① 两条规则不能都写同一个类名,否则后一条会覆盖前一条;② 标签上必须挂上对应的 class 属性,只写 CSS 不写名字是选不中的。

  • - 提示(先自己想,实在想不出再点开)

    一级 · 思路:要"精准到唯一一个元素"——元素选择器会改一片,类选择器会改一批,只有一种选择器是唯一命中的 二级 · 方法:id 选择器:#id属性值 {...};先给那一处时间写 id="time"三级 · 骨架:<标签 id="____">时间</标签> + #____ { color: #b2b2b2; }

    - 参考答案(做完再点开)

    html
    <style>
      #time {
        color: #b2b2b2;
      }
    </style>
    <body>
      <!-- 只给这一处时间挂 id -->
      <span id="time">2024年05月15日 20:07</span>
      ...
      另外两处保持原样
    </body>

    对照课程 05. 央视新闻-标题-样式(选择器).html:案例里 <span class="cls" id="time"> 就是这样做的。注意 id 一个页面只能出现一次——如果三处时间都要变灰,正确做法是给它们挂同一个 class,用类选择器(.date { color: #b2b2b2; })。

  • - 提示(先自己想,实在想不出再点开)

    一级 · 思路:两个都是同一种输入元素,靠"标签名"分不开;但它们身上有个属性不一样——这正是属性选择器要解决的 二级 · 方法:元素名称[属性名="值"] { ... },属性的值就是"单行文本"的类型名 text三级 · 骨架:input[____="____"] { color: ____; }

    - 参考答案(做完再点开)

    css
    /* 属性选择器:只选 type 属性为 text 的 input */
    input[type="text"] {
      color: gray;
    }

    对照 PPT 的属性选择器示例 input[type="text"] {...}。补充:input[type] 是"只要有 type 属性就选中"(两个输入框都会被选中),input[type="text"] 才限定到具体值。

三、综合题 ​

    1. 让页面上所有超链接都去掉下划线(一条规则)
    2. 把两处日期都调成浅灰 #b2b2b2,要求只写一条规则、名字可复用
    3. 只让正文区里的段落行高 2 倍、首行缩进 2 个字符;侧边栏里的段落不受影响
    4. 做完后想一想并动手验证:第 2 步那条规则和第 1 步的规则撞上同一个元素时,谁生效?把两条规则的顺序换一换,效果变不变? (练习文件 test_07_综合_标题区样式.html 里有页面内容与写作区。)

    - 提示(先自己想,实在想不出再点开)

    一级 · 思路:按"要改几个/在哪一片"来选选择器:全部→元素;一批同类→类;"某个区域里面的"→后代 二级 · 方法:a { text-decoration: none; };两处日期共用一个类名如 .date { color: #b2b2b2; };正文区用后代选择器 .content p { line-height: 2; text-indent: 2em; }三级 · 骨架:____ { text-decoration: none; } / .____ { color: #b2b2b2; } / .____ ____ { line-height: ____; text-indent: ____em; }

    - 参考答案(做完再点开)

    html
    <style>
      /* 1. 元素选择器:所有超链接去掉下划线 */
      a {
        text-decoration: none;
      }
    
      /* 2. 类选择器:两处日期共用一套样式(名字见名知义、可复用) */
      .date {
        color: #b2b2b2;
      }
    
      /* 3. 后代选择器:只选"正文区 div 里面"的段落 */
      .content p {
        line-height: 2;
        text-indent: 2em;
      }
    </style>
    <body>
      <h1>【新思想引领新征程】推进长江十年禁渔 谱写长江大保护新篇章</h1>
      <a href="https://www.cctv.com" target="_blank">央视网</a>
    
      <span class="date">2024年05月15日 20:07</span>
    
      <div class="content">
        <p>央视网消息(新闻联播):……</p>
        <img src="img/1.gif" width="80%">
        <p>行走在长江沿线,科研人员发现很多可喜现象。</p>
      </div>
    
      <div class="sidebar">
        <p>侧边栏:相关阅读推荐。</p>
      </div>
    
      <span class="date">2026年09月29日 更新</span>
    </body>

    第 4 步的答案:a 是元素选择器、.date 是类选择器,类选择器优先级更高——日期的规则不会被元素规则盖掉。把两条规则的顺序换一换不影响结果(优先级不同时,顺序不起作用;只有优先级相同时才是"后写的生效")。