码上问学问代码之理,学编程之道

单元四 · CSS3 基础

现在才给页面「化妆」。本单元对应教材单元四(10 学时):样式规则与三种引入方式、样式优先级;基本选择器(标记 / 类 / id / 通配符)与复合选择器(交集 / 并集 / 后代);链接伪类与样式面板;表格样式。 CSS 的最大坑是「优先级」——同样是红色,谁赢?本单元讲透它。

本单元目标:掌握三种引入方式;能写基本选择器(标记 / 类 / id / 通配符)与复合选择器(交集 / 并集 / 后代);理解优先级(id > class > 标记)与「就近/后写覆盖」;会美化表格与链接。

一、知识准备:三种引入方式

  • 行内:style="color:red" 写在标签上——最具体、优先级最高,但难维护,仅调试用。
  • 内部:<style> 写在 <head>——单页够用,本课程小例子常用。
  • 外部:<link rel="stylesheet" href="x.css">——多页共享,生产首选。
  • 生活类比:优先级

    行内样式像「贴在你身上的即时贴」(最强);id 像身份证号(唯一、权重高);class 像工牌(一类人通用);标记像「人类」这种大类(最弱)。同一属性多人管,按 id > class > 标记,同级看谁后写。

    选择器写法权重感
    标记p { }低
    类.card { }中
    id#top { }高
    交集(复合)p.hl { }叠加
    并集(复合)h1, h2 { }各自独立
    后代(复合)nav a { }叠加
    通配符* { }最低
    伪类a:hover { }类级

    二、复合选择器:交集 · 并集 · 后代

    选择器优先级:谁更「具体」谁说了算(行内 > id > 类 > 标签)行内 style="…"id 选择器 #box类/伪类/属性 .card标签/伪元素 p通配/继承 *记忆:行内(1000) > id(100) > 类(10) > 标签(1)——比数字大小,平级比先后(后者覆盖)!important 一票否决,但尽量别用(把优先级游戏玩坏,后期没法维护)

    基本选择器只能「点一类人」,实际写样式时往往还要再加条件。把两个及以上选择器拼起来用的写法,教材统称 复合选择器;最常用的三种全靠连接符号区分——符号换一个,命中的元素就完全不同。

    名称连接符号写法含义命中范围
    交集选择器直接连写,无空格p.hl同时满足全部条件才命中更小:条件越多越精确
    并集选择器英文逗号 ,h1, h2, h3任意一个命中即可,也叫分组选择器更大:几组元素合并
    后代选择器空格nav a前者内部的元素,不限层级按层级限定范围
    selectors.html
    <style>
      /* ① 交集:连写、中间没有空格 —— 既是 p、又带 hl 才命中 */
      p.hl { color:#A8451F; font-weight:700; }
    
      /* ② 并集:逗号分隔 —— 三个标题共用同一套声明 */
      h1, h2, h3 { font-family:"PingFang SC", sans-serif; }
    
      /* ③ 后代:空格分隔 —— nav 里面所有层级的 a 都算 */
      nav a { color:#b04a2c; }
    </style>
    
    <p class="hl">我是 p 且带 hl → 命中 ①</p>
    <div class="hl">我是 div 带 hl → 不命中 ①(不是 p)</div>
    <nav><ul><li><a href="#">导航里的链接 → 命中 ③</a></li></ul></nav>
    效果预览运行结果
    显示:第一段变红棕色加粗;同样是 hl 的 div 不受影响;导航里的链接变蓝,外面的链接不变。
    最容易错的一格空格:p.hl 是交集(连写、无空格),p .hl 是后代(多了一个空格)。前者要求「同时是 p 且带 hl」,后者选的是「p 里面所有带 hl 的元素」——一个空格之差,命中范围完全不同,查错先查这里。

    三、实战演练:美化一个卡片

    文件: u4/card.html(内部样式)
    card.html
    <style>
      .card { border:1px solid #e7ddca; border-radius:12px; padding:16px;
              box-shadow:0 2px 8px rgba(0,0,0,.06); }
      .card h3 { color:#b04a2c; }
      a:hover { color:#b06a24; }   /* 鼠标悬停变橙 */
    </style>
    
    <div class="card">
      <h3>静夜思</h3>
      <p>床前明月光,疑是地上霜。</p>
      <a href="#">查看详情</a>
    </div>
    效果预览运行结果
    显示:带圆角与阴影的白卡,标题蓝、链接悬停变橙。
    故意写错:在 <head> 里写 p{color:red} 又在 class 里写 .card p{color:blue}——学生常疑惑「为什么红的不生效」。答案是后代选择器(属于复合选择器)权重更高——.card p 是「类 10 分 + 标记 1 分 = 11 分」,压过单独的 p 那 1 分。这就是优先级实战。

    四、强化训练

    1外部样式和内部样式同时写了 h1{color},谁生效?为什么优先用外部样式?
    2#nav a.current 和 a:hover 谁权重高?写出从低到高的选择器排序。
    3:hover 属于哪类选择器?它常配合哪类元素做交互反馈?
    4p.hl 和 p .hl 命中的元素一样吗?各写一句话说明它们分别选中了什么。
    5要把 h1、h2、h3 的字体统一成黑体,用哪种复合选择器最省事?写出这条规则。
    6nav a 与 nav > a 有什么区别?什么时候必须用后者?

    五、课后实训

    作业:把单元三的 layout.html 抽一个 style.css 出来,给 header 加底部分隔线、nav 链接 hover 变蓝、main 限宽居中、表格加斑马纹。用外部 <link> 引入。要求至少用上一种复合选择器(如后代 nav a 或并集 h1, h2),并在样式表里写注释说明为什么选它。

    本单元小结

    ← 上一单元单元三 · HTML5 新增标签

    📝 本节自测

    做完点「检查本节」看解析与得分;做错可重做。