Skip to content

HTML 进阶(一) ​

本页对应 HTML 进阶,共 7 段视频,约 1 小时 0 分。

学习目标 ​

  1. 能区分无序列表、有序列表、定义列表的语义与典型使用场景,并根据页面效果选择正确的列表类型。
  2. 能独立编写 ul > li、ol > li、dl > dt + dd 结构,并在浏览器中验证默认圆点、数字序号及定义列表的展示效果。
  3. 能说明列表嵌套规则:ul/ol 的直接子元素只能是 li,li 内可包含链接、标题、段落等标签,并能判断和改正错误嵌套。
  4. 能使用 Emmet 语法快速生成列表结构,如 ul>li*4、ol>li*4、dl>dt+dd*4>a,并完成对应内容填充。
  5. 能独立完成“友情链接”“四大名著”“小米底部自定义列表”等案例,保证结构清晰、内容排列符合效果图。
  6. 能概括列表、表格、表单在网页中的典型用途,并说明列表主要用于内容排列整齐的区域。

知识点 ​

列表总览 ​

列表用于布局内容排列整齐的区域。转写稿中反复强调:判断要不要用列表,先看内容是否“排列整齐”。列表分三类:无序列表、有序列表、定义列表。学习时先记结论:无序列表最常用,是重点;定义列表常用于网站底部;有序列表了解即可,实际页面中有些“看起来有序”的区域也可能用div或表格实现。

无序列表 ​

为什么需要:页面上大量区域只需要排列整齐,并不要求规定先后顺序,例如导航、友情链接、商品分类。此时用无序列表最合适。转写稿中打开小米等页面检查结构,看到成排的ul和li,说明这是布局中的高频写法。

怎么想:先判断“有没有顺序”。没有顺序,就优先想ul包li;每个li是一个条目,条目内部还可以放标题、段落、链接等内容。

怎么做:标签是ul嵌套li,ul是无序列表,li是列表条目。

html
<ul>
  <li>第一项</li>
  <li>第二项</li>
  <li>第三项</li>
  ……
</ul>

转写稿中的调试过程可这样理解:在编辑器输入ul后回车,内部生成li;在li中放h3和文字,保存后每个条目默认出现小圆点。快捷写法ul>li*4表示ul里包含4个li;若每个li里还要放链接,可写ul>li*4>a。案例“友情链接”要求写百度、新浪、搜狐、网易,结构应是li包a,不是a包li。

易错点:ul标签里面只能包裹li标签;li标签里面可以包裹任何内容。转写稿中的面试题提醒:ul里不能直接放p;a里不要再套a,因为一个链接应对应一个跳转地址。写案例时若把链接文字放错层级,要撤销并放回a中。

有序列表 ​

为什么需要:当内容需要规定顺序,例如步骤、排名,才考虑有序列表。转写稿中说明:有序就是“谁在前谁就必须在前”,不能随意颠倒。

怎么想:先问“顺序是否影响含义”。影响含义,用ol;不影响,仍优先用ul。实际开发中有序列表使用相对少。

怎么做:标签是ol嵌套li,ol是有序列表,li是列表条目。

html
<ol>
  <li>第一项</li>
  <li>第二项</li>
  <li>第三项</li>
  ……
</ol>

转写稿演示ol>li*4后保存,页面默认出现1、2、3、4序号。案例中“熊大、熊二、光头强、翠花”按顺序排列,说明有序列表会自带编号。

易错点:ol标签里面只能包裹li标签;li标签里面可以包裹任何内容。不要因为看到网页上有1234就断定一定是有序列表,转写稿中检查搜狐、微博热搜等区域时,发现有的用表格或div实现,所以结构判断要看源码,不能只看外观。

定义列表 ​

为什么需要:当内容是一个标题下面带多个说明项时,无序和有序都不太合适。网站底部“购物指南、服务中心、关注我们”这类“标题+若干描述”的结构,用定义列表更贴切。

怎么想:先找“标题”和“描述”的对应关系。一个dt是定义列表的标题,多个dd是描述/详情;布局时不要把很多组硬塞进一个dl,转写稿建议拆成多个dl,后面用CSS排到一行更容易。

怎么做:标签是dl嵌套dt和dd,dl是定义列表,dt是定义列表的标题,dd是定义列表的描述/详情。

html
<dl>
  <dt>列表标题</dt>
  <dd>列表描述 / 详情</dd>
   ……
</dl>

定义列表结构示意图

转写稿案例“购物指南”可写成dl>dt+dd*4>a:dt放“购物指南”,4个dd里分别放链接。写完后用Tab缩进、Shift+Tab反缩进整理结构;若链接文字放错位置,同样要撤销后放进a。

易错点:dl里面只能包含dt和dd;dt和dd里面可以包含任何内容。转写稿面试题中,dl里不能放li。一般一个dt可对应多个dd,dd个数不限;定义列表默认竖着独占一行,想横排要等CSS处理。

表格的用途与整体认识 ​

网页表格效果示例

网页中的表格与 Excel 表格类似,主要用来展示数据。为什么需要:当信息本身具有“行、列、表头、数据项”的关系时,用表格表达比一堆普通段落更清楚。怎么想:先看数据有几行几列,再判断第一行是不是表头,最后决定用 table、tr、td/th 搭建结构。怎么做:外层写 table,每一行写 tr,行里的单元格写 td;表头单元格可用 th。易错点:不要一上来就写 td,td/th 必须放在 tr 里,tr 再放在 table 里;表格默认没有边框线,需要按笔记提示用 border 属性加边框。

基本使用:table 嵌套 tr,tr 嵌套 td / th ​

表格基本结构示意图

标签关系是:table 嵌套 tr,tr 嵌套 td / th。

table、tr、td/th 嵌套关系图

为什么需要:表格数据必须按“表格→行→单元格”的层级组织,浏览器才能正确排版。怎么想:转写稿里反复强调“先分析结构,结构要保证别乱”,表格也一样:先数行,再数每行单元格,表头用 th,普通数据用 td。怎么做:先写 table,里面按行写 tr,每个 tr 内写对应数量的 td 或 th;需要边框时加 border="1"。易错点:border 是笔记中用于演示边框的属性,不是表格内容标签;每行单元格数量要按数据对齐,否则表格会错位。

html
<table border="1">
  <tr>
    <th>姓名</th>
    <th>语文</th>
    <th>数学</th>
    <th>总分</th>
  </tr>
  <tr>
    <td>张三</td>
    <td>99</td>
    <td>100</td>
    <td>199</td>
  </tr>
  <tr>
    <td>李四</td>
    <td>98</td>
    <td>100</td>
    <td>198</td>
  </tr>
  <tr>
    <td>总结</td>
    <td>全市第一</td>
    <td>全市第一</td>
    <td>全市第一</td>
  </tr>
</table>

表格结构标签:thead、tbody、tfoot(了解) ​

表格结构标签分区示意图

为什么需要:用结构标签把表头、数据主体、表尾总结划分区域,让表格结构更清晰,语义更清晰。怎么想:表头区域放 thead,主要数据放 tbody,总结行放 tfoot;这些标签内部仍然要放 tr。怎么做:在 table 内分别包住对应的 tr 结构。易错点:笔记提示“表格结构标签可以省略”,但一旦使用,就要保持分区合理;后面合并单元格时不能跨 thead、tbody、tfoot 合并。

合并单元格:rowspan 与 colspan ​

合并单元格效果示意图

为什么需要:当多行或多列表达的是同类信息时,合并单元格可以避免重复内容,让表格更简洁。怎么想:先明确合并目标,再判断是跨行还是跨列。怎么做:按笔记步骤——1. 明确合并目标;2. 保留最左最上的单元格,添加属性,取值是数字,表示需要合并的单元格数量;跨行合并保留最上单元格,加 rowspan;跨列合并保留最左单元格,加 colspan;3. 删除其他被合并的单元格。易错点:不能跨表格结构标签合并单元格,例如不能跨 thead、tbody、tfoot 合并;删除单元格时只删被合并掉的,保留带 rowspan/colspan 的那个。

html
<table border="1">
  <thead>
    <tr>
      <th>姓名</th>
      <th>语文</th>
      <th>数学</th>
      <th>总分</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>张三</td>
      <td>99</td>
      <td rowspan="2">100</td>
      <td>199</td>
    </tr>
    <tr>
      <td>李四</td>
      <td>98</td>
      <!-- <td>100</td> -->
      <td>198</td>
    </tr>
  </tbody>
  <tfoot>
    <tr>
      <td>总结</td>
      <td colspan="3">全市第一</td>
      <!-- <td>全市第一</td>
      <td>全市第一</td> -->
    </tr>
  </tfoot>
</table>

注意:不能跨表格结构标签合并单元格(thead、tbody、tfoot)。

表单的作用与使用场景 ​

作用:收集用户信息。转写稿里用“办银行卡填单子”类比:单子上能填写、能勾选,网页表单也是把输入框、单选框、多选框等控件收集到的信息交给服务器。转写稿还把“列表、表格、表单”并列提醒:表单不是用来排版的列表,而是输入/选择控件区域。

为什么需要:登录、注册、搜索都要让用户填信息;怎么想:先判断是否需要用户输入或选择,再选控件;怎么做:用 form 包住表单控件,常见于登录页、注册页、搜索区域;易错点:控件和按钮要放在表单区域内,按钮才有提交/重置行为。

input 标签与占位文本 ​

input 标签的 type 属性值不同,功能不同。

为什么需要:一个标签要覆盖文本、密码、单选、文件等多种输入;怎么想:按“要收集什么数据”选 type;怎么做:写 input 并设置 type,占位文本用 placeholder 提示;易错点:placeholder 是提示信息,不是默认值,文本框和密码框都可使用。

input 标签不同 type 示意图

html
<input type="..." >
<input type="..." placeholder="提示信息">

单选框 ​

为什么需要:性别等只能选一项;怎么想:一组互斥选项要归为一组;怎么做:同一组 radio 设置相同 name,checked 表示默认选中;易错点:name 不同会变成多组,可能都能选;name 属性值可自定义。

单选框常用属性图

html
<input type="radio" name="gender" checked> 男
<input type="radio" name="gender"> 女

上传文件与多选框 ​

为什么需要:上传文件、多选爱好等;怎么想:文件多选用 multiple,多选框默认选中用 checked;怎么做:按下面代码写;易错点:multiple 是文件多选,不是多选框;多选框也叫复选框。

html
<input type="file" multiple>
<input type="checkbox" checked> 敲前端代码

下拉菜单 ​

为什么需要:选项多时节省空间;怎么想:整体用 select,每一项用 option;怎么做:selected 实现默认选中;易错点:默认显示第一项,selected 一般只给一个选项。

下拉菜单结构图

html
<select>
  <option>北京</option>
  <option>上海</option>
  <option>广州</option>
  <option>深圳</option>
  <option selected>武汉</option>
</select>

文本域 ​

为什么需要:多行输入文本;怎么想:多行内容不要用单行文本框;怎么做:用 textarea,标签内写默认提示文字;易错点:实际开发中用 CSS 设置尺寸,一般禁用右下角拖拽功能。

文本域示意图

html
<textarea>默认提示文字</textarea>

label 标签 ​

为什么需要:让文字和表单控件关联,增大点击范围;怎么想:文字点不动时用 label 绑定控件;怎么做:写法一让 for 等于控件 id,写法二用 label 包裹文字和控件;易错点:for 值必须和 id 一致;包裹写法不需要属性。

label 说明文本图

label 增大点击范围图

html
<input type="radio" id="man">
<label for="man">男</label>

<label><input type="radio"> 女</label>

按钮与 form 表单区域 ​

为什么需要:提交、重置、普通按钮功能不同;怎么想:用 type 区分;怎么做:form 的 action 写发送数据地址,按钮放表单内;易错点:省略 type 默认是提交;按钮需配合 form 才能实现对应功能。

按钮 type 示意图

html
<button type="">按钮</button>
html
<!-- form 表单区域 -->
<!-- action="" 发送数据的地址 -->
<form action="">
  用户名:<input type="text">
  <br><br>
  密码:<input type="password">
  <br><br>

  <!-- 如果省略 type 属性,功能是 提交 -->
  <button type="submit">提交</button>
  <button type="reset">重置</button>
  <button type="button">普通按钮</button>
</form>

调试时可按笔记示例验证:点“提交”看是否触发表单提交,点“重置”看控件是否恢复;若按钮无反应,先检查按钮是否在 form 内。转写稿本节主要讲列表,未展开表单控件调试,这里不虚构额外步骤。

课件图示 ​

课件第4页:列表 作用:布局内容排列整齐的区域。 列表分类:无序列表、有序列表、定义列表。

课件第5页:无序列表 作用:布局排列整齐的不需要规定顺序的区域。 标签:ul 嵌套 li,u

课件第9页:有序列表 作用:布局排列整齐的需要规定顺序的区域。 标签:ol 嵌套 li,ol

课件第10页:定义列表 标签:dl 嵌套 dt 和 dd,dl 是定义列表,dt 是定义列表的

课件第13页:标签:table 嵌套 tr,tr 嵌套 td / th。 提示:在网页中,表格

课件第14页:作用:用表格结构标签把内容划分区域,让表格结构更清晰,语义更清晰。 提示: •

课件第16页:作用:将多个单元格合并成一个单元格,以合并同类信息。 合并单元格的步骤: 1.

课件第18页:作用:收集用户信息。 使用场景: • 登录页面 • 注册页面 • 搜索区域 表单

代码示例 ​

代码一:无序列表(四大名著案例) ​

html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>四大名著 - 无序列表</title>
  <style>
    body { font-family: "Microsoft YaHei", sans-serif; }
  </style>
</head>
<body>
  <!-- 上面一块:大标题 -->
  <h3>四大名著</h3>

  <!-- 下面一块:ul 嵌套 li,li 里再放 h3 + p -->
  <ul>
    <li>
      <h3>水浒传</h3>
      <p>作者:施耐庵</p>
    </li>
    <li>
      <h3>三国演义</h3>
      <p>作者:罗贯中</p>
    </li>
    <li>
      <h3>西游记</h3>
      <p>作者:吴承恩</p>
    </li>
    <li>
      <h3>红楼梦</h3>
      <p>作者:曹雪芹</p>
    </li>
  </ul>
</body>
</html>

关键行与易错点

  • 结构先拆两块:上面一个大标题(h1~h6 都行),下面一个 ul,ul 里放 4 个 li,每个 li 里再放 h3(书名)和 p(简介)。
  • ul 里只能包裹 li,不能直接塞 p、div 等其他标签;而 li 里面可以包裹任何内容,所以 li > h3 + p 完全合法。
  • dt/dd 之外同理:这是"父子关系",ul > li 用大于号,h3 和 p 在 li 里是"兄弟关系"。
  • Emmet 快捷写法:ul>li*4>h3+p,> 表示包含,*4 表示生成 4 份,+ 表示并列。
  • 无序列表默认每项前面有一个小圆点,且默认竖排、独占一行,想横排需要后面学 CSS 处理。

代码二:定义列表(网站底部"购物指南") ​

html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>定义列表 - 购物指南</title>
  <style>
    body { font-family: "Microsoft YaHei", sans-serif; }
  </style>
</head>
<body>
  <!-- 第一组 -->
  <dl>
    <dt>购物指南</dt>
    <dd><a href="#">手机</a></dd>
    <dd><a href="#">电视</a></dd>
    <dd><a href="#">笔记本</a></dd>
    <dd><a href="#">平板</a></dd>
  </dl>

  <!-- 第二组 -->
  <dl>
    <dt>服务中心</dt>
    <dd><a href="#">售后</a></dd>
    <dd><a href="#">线下门店</a></dd>
    <dd><a href="#">服务网点</a></dd>
  </dl>

  <!-- 第三组 -->
  <dl>
    <dt>关注我们</dt>
    <dd><a href="#">新浪微博</a></dd>
    <dd><a href="#">官方微博</a></dd>
    <dd><a href="#">联系我们</a></dd>
  </dl>
</body>
</html>

关键行与易错点

  • 定义列表结构:dl 是定义列表整体,dt 是定义标题,dd 是描述/详情。dt 和 dd 是兄弟(并列)关系,谁都不包含谁。
  • dl 里面只能包含 dt 和 dd,不能塞 li、p 等其他标签;而 dt 和 dd 里面可以包含任何内容(本例 dd 里放的是 a 链接)。
  • 是 dd 包 a,不是 a 包 dd,方向别套反。
  • 网页底部这类"上面一个标题、下面一串说明"的效果,用 dl 最合适,用 ul/ol 反而不合适(它们表达不了标题 + 描述的层级)。
  • 布局时按"组"拆:页面上有几组就写几个 dl,一组里通常是一个 dt 配多个 dd,拆得越细后面写 CSS 越好排。
  • 定义列表默认也是竖排、一行一个,想横排要等 CSS 阶段处理。
  • 链接的跳转地址先用 # 占位即可。

代码三:表格与合并单元格 ​

html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>表格 - 合并单元格</title>
  <style>
    body { font-family: "Microsoft YaHei", sans-serif; }
  </style>
</head>
<body>
  <table border="1">
    <thead>
      <tr>
        <th>姓名</th>
        <th>语文</th>
        <th>数学</th>
        <th>总分</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>张三</td>
        <td>99</td>
        <td rowspan="2">100</td>
        <td>199</td>
      </tr>
      <tr>
        <td>李四</td>
        <td>98</td>
        <!-- <td>100</td> -->
        <td>198</td>
      </tr>
    </tbody>
    <tfoot>
      <tr>
        <td>总结</td>
        <td colspan="3">全市第一</td>
        <!-- <td>全市第一</td>
        <td>全市第一</td> -->
      </tr>
    </tfoot>
  </table>
</body>
</html>

关键行与易错点

  • 表格是 table 嵌套 tr(行),tr 嵌套 td(普通单元格)/ th(表头单元格)。
  • 网页中表格默认没有边框线,必须加 border="1" 属性才看得到线。
  • 合并单元格三步:① 明确合并目标;② 保留最左最上的单元格并加属性;③ 删除被合并的其他单元格。
    • 跨行合并:保留最上面的单元格,加 rowspan="数量"(本例数学成绩 rowspan="2",所以第二行对应的 <td>100</td> 要删掉/注释掉)。
    • 跨列合并:保留最左边的单元格,加 colspan="数量"(本例"全市第一"占 3 列,所以后面两个 <td> 要删掉)。
  • 属性值都是数字,表示要合并的单元格数量,不是"合并到第几列/行"。
  • 结构标签 thead、tbody、tfoot 用来划分区域,可以省略,但一旦使用,不能跨结构标签合并单元格。
  • 写完一定要数一下每行的单元格总数是否一致,删漏一个整张表就会错位。

常见错误 ​

  1. ul 里直接塞 div、p 或纯文字 现象:浏览器照样能显示,但代码一检查就"脏",后续用 CSS 排版时对不齐。 原因:把 ul 当成普通"盒子"用,忘了它只认 li。 修法:ul/ol 内只留 li,把要放的内容整体搬进某个 li 内部。

  2. 合并单元格后表格错位、行列对不上 现象:表格右侧多出空白格,或某行整体向左挤。 原因:加了 rowspan/colspan 却没删掉被合并掉的 td。 修法:先定位"最左/最上"那个单元格并加属性,再删掉其余被合并的 td,最后逐行核对"该行 td 数 + 被上方 rowspan 占掉的位置 = 总列数"。

  3. 跨 thead/tbody/tfoot 合并单元格 现象:合并后行高异常、边框断裂。 原因:结构标签是相互独立的分组,不能互相"吃"单元格。 修法:合并只在同一个结构标签内部做;需要整表合并时,就别拆结构标签。

  4. 一组单选框能同时选中两个 现象:男、女两个都能亮。 原因:两个 input 的 name 写成了不同的值,或其中一个漏写 name。 修法:同组单选的 name 必须完全一致,值可以不同。

  5. 点文字选不中控件(label 失效) 现象:点"男"字没反应,只能点小圆点。 原因:for 的值和控件的 id 不一致、控件根本没写 id,或者把 for 写成了 name。 修法:for = 控件的 id(一字不差);或者改用 <label> 直接把控件包起来,不写任何属性。

  6. 按钮点了页面刷新 / 什么都不发生 现象:点"提交"整页重载,或点按钮毫无反应。 原因:按钮不在 form 内;或省略 type,默认就是提交。 修法:把控件和按钮一起放进 form,并显式写 type="submit|reset|button"。

  7. 下拉菜单默认选中不生效 现象:永远显示第一项,selected 好像没用。 原因:selected 写在了 select 上,或同一组 option 写了多个 selected。 修法:selected 写在目标 option 上,且只保留一个。

  8. 文本域里写 value 或用单标签闭合 现象:默认提示文字不显示,或后面的内容被吞掉。 原因:textarea 的值写在标签对之间,不是属性。 修法:写成 <textarea>提示文字</textarea>,内容放中间。

练习 ​

练习 1(无序列表 · 结构 + 链接) 做"四大名著"块:一个标题 + 一个无序列表,列表四项分别是四大名著书名,每项内包含书名标题和一句简介,书名要能点击跳转。全程用 Emmet 一次性生成骨架,再替换文字。

练习 2(定义列表 · 仿站底部) 还原小米底部三组信息:购物指南、服务中心、关注我们。每组下面的每一条都要是链接(用 # 占位)。要求先说清楚"用几个 dl、每个 dl 里放什么",再写代码。

练习 3(表格 · 合并单元格) 做一个成绩表:表头为姓名/语文/数学/总分,两行学生数据(数学成绩两人相同需跨行合并),最后一行"总结"跨列显示评语。要求带 thead/tbody/tfoot,并逐行数一遍 td 数量是否对得上。

练习 4(表单 · 综合) 做一个注册表单:用户名(占位文本提示)、密码、性别单选(默认选男)、爱好多选(默认勾一项)、城市下拉(默认选中某一项)、头像上传(可多选文件)、个人简介文本域,最后是提交和重置按钮。要求每个控件的说明文字都能点击选中控件。

练习 5(找错题) 下面这段代码有 4 处问题,找出来并说明理由、给出改法:

html
<ul>
  <p>友情链接</p>
  <li><a href="#">百度</a></li>
  <li><a href="#">新浪</a></li>
</ul>
<input type="radio" name="gender" checked> 男
<label for="female">女</label><input type="radio" name="sex" id="female">
<textarea value="请输入简介"></textarea>

原视频对照 ​

#视频时长
1反馈复习和今日内容08:47
2无序列表15:06
3四大名著案例06:42
4四大名著实现03:55
5有序列表09:22
6定义列表12:05
7自定义案例04:53

小结 ​

  1. 选列表先问两个问题:要不要顺序(有序/无序)、是不是"标题 + 一堆说明"的关系(定义列表)。判据不清就写代码,一定返工。
  2. 无序列表是布局主力,有序列表实际使用场景很少,定义列表常见于页脚与分组信息——投入练习的时间按这个比例分配。
  3. 三种列表默认都竖排独占一行,横排是 CSS 的事,现在不要试图用标签解决。
  4. 表格的定位只有一条:展示数据。用表格搭页面结构是过时做法。
  5. 合并单元格的固定顺序是"定目标 → 最左最上留属性 → 删其余",删那一步最容易漏,也最容易造成错位。
  6. 表单里两个关键属性各管一件事:name 管分组(单选能不能互斥)、id + for 管点击范围(label 有没有用),两者不能互相替代。
  7. 按钮必须待在 form 里才有功能,且 type 永远显式写,别依赖默认值。
  8. Emmet 只负责敲得快,结构分析在前、代码生成在后;先想清楚"谁包谁",再敲 > 和 *。