04列表与表格

有一堆并列的东西要摆出来?用列表。 有数据要按行列对齐?用表格。 这一章把 ul / ol / dl 三兄弟和 table 全家一次性讲透。

约 18 分钟 7 个动手实验 排列的艺术

一、无序列表:ul + li

「ul + li」是最常用的列表:并列、无先后的东西都归它管—— 导航菜单、商品特点、标签云。<ul>(unordered list)只认识一种孩子: <li>(list item)。

list-style-type 取值:决定项目符号长相(type 属性已废弃)
取值符号长相适用场景
disc实心圆点(默认)最普通、最常用的无序列表
circle空心圆次级列表、柔和一点的分组
square实心方块需要稍微「庄重」一点的列表
none无标记导航菜单最爱,用 CSS 自定义图标
把某个 ullist-style-type 从 circle 换成 square,看符号变化;换成 none 则消失
<ul> 里只能直接放 <li>, 直接塞文字或别的标签属于非法结构——浏览器虽然不报错,但语义全乱。

二、有序列表:ol

顺序有意义就用 <ol>(ordered list):排行榜、操作步骤、TOP 10。 它自带「编号系统」,不用自己敲 1. 2. 3.——增删条目时编号自动重排。

ol 属性逐项分析:编号系统的四种玩法
属性取值说明
start数字从几开始编号,如 start="3" 从 3 数起
type1 / a / A / i / I编号样式:数字 / 小写字母 / 大写字母 / 小写罗马 / 大写罗马
reversed布尔属性倒序编号(配合 start 效果更佳)
li 的 value数字把某项编号直接设为某值,后面的项接着它数
把第一个 olstart="3" 改成 start="1",编号立刻从字母 A 重新开始
选择口诀:顺序有讲究用 ol,顺序无所谓用 ul。 「安装步骤」用 ul 会让用户不知道先做哪个,属语义事故。

三、嵌套列表:两级导航菜单

li 里面可以再放一个 ul / ol,形成多级列表—— 电商分类、下拉菜单的多级结构就是这么长出来的。 记住嵌套位置:子列表必须包在某个 li 里面,不能和 li 平级。

两级导航菜单:往里再加一层 <ul> 到「课程」下就是三级
错误写法:<ul><li>…</li><ul>…</ul></ul> (子 ul 与 li 平级)。浏览器照样渲染,但结构树是错的,样式和 JS 遍历都会出幺蛾子。

四、定义列表:dl + dt + dd

第三种列表专管「名词解释」:<dl>(definition list)里, <dt>(term)是被解释的术语,<dd>(description)是解释本身。 一个词可以有多条解释,一个词也可以跟多个词共享段落。

术语表(dt 加粗红棕,dd 缩进解释):再给「前端三件套」补一条 <dd>,看它成对追加
dl 的常见舞台:术语表、FAQ(dt 问、dd 答)、商品参数、页脚的联系方式。 凡是「标题 + 说明」成对出现的地方都可以想它。

五、表格骨架:table / tr / th / td / caption

表格是「行优先」的世界:<table> 是整张表, <tr>(table row)是一行,行里面装格子—— <th>(header)是表头格子,<td>(data)是数据格子, <caption> 是表格标题。

表格五兄弟:谁是谁
元素角色记忆点
table表格容器一切格子的大宅子
caption表格标题默认显示在表格上方
tr一行table row,横向思维
th表头单元格默认加粗且居中,不用写 CSS
td数据单元格默认常规字重、左对齐
表头 th 默认加粗居中、td 常规左对齐:给状态列再加一行,看结构怎么延伸
表格只用来放数据,不要拿来排版页面——「用 table 摆布局」是上个时代的老手艺, 现在布局是 CSS 的职责(第 03 章布局模块里会细讲)。

六、结构化分组:thead / tbody / tfoot

表一长,就该把行分组:<thead> 表头区、<tbody> 数据区、 <tfoot> 汇总区。好处是语义清晰,CSS/JS 可以整组操作 (比如滚动的长表里「只让 tbody 滚、表头钉住」)。

三个分组区:表头 / 数据 / 汇总
分组全称放什么注意事项
theadtable header表头行(放 th)一个表格可有多个
tbodytable body主体数据行没写浏览器会自动补一个
tfoottable footer汇总行(合计)无论写在哪,渲染时都被搬到表格末尾
thead 表头 / tbody 数据 / tfoot 合计(tfoot 会加粗浅底):往 tbody 里再加一行 8 月的数据,合计不会自动变——你自己算
浏览器的两个「热心肠」:没写 tbody 会自动帮你补一个; 把 tfoot 写在 thead 前面,渲染时也会被自动搬到表格末尾。 所以顺序错了页面不一定坏,但代码可读性会坏——按 thead → tbody → tfoot 写。

七、合并单元格:colspan 与 rowspan

课程表里「体育连堂两节」「午休占一整行」,靠的就是合并: colspan 横着吞并几列,rowspan 竖着吞并几行。 写在被保留的那个格子上。

colspan / rowspan:横吞列、竖吞行
属性取值说明
colspan数字(默认 1)横跨几列:colspan="2" 一格占两格宽
rowspan数字(默认 1)纵跨几行:rowspan="2" 一格占两格高
colspan 横跨两列 + rowspan 纵跨两行(米色格子即被合并的):把 HTML 精讲的 colspan="2" 改成 1,右边立刻多出一个空格
合并口诀:「谁合并谁留下,被吃掉的格子删掉」—— colspan="2" 就删掉同行右边 1 个格子,rowspan="2" 就删掉下一行同列 1 个格子。 数不清时画方格图,一列一列对齐着写。

八、本章小结

  • 并列无序用 ul + li;顺序有意义用 ol(start / type / reversed / li value)。
  • 改项目符号找 CSS 的 list-style-type,别用废弃的 type 属性。
  • 嵌套列表:子列表必须包在 li 里,不能与 li 平级。
  • 名词解释用 dl + dt + dd,一个 dt 可配多个 dd。
  • 表格行优先:tr 是行,th 默认加粗居中,td 常规左对齐,caption 是标题。
  • 长表用 thead / tbody / tfoot 分组,浏览器会自动补 tbody、纠正 tfoot 位置。
  • colspan 横跨列、rowspan 纵跨行,关键是删掉被吞并的格子。
动手练习:先写一个两级嵌套的「美食分类导航」(如 川菜→麻婆豆腐), 再手绘一张自己的周课程表,至少用上一次 colspan、一次 rowspan、caption 和 thead。