HTML系列教程:12_HTML 表格 <table> 零基础详解

表格用来展示结构化数据 :成绩单、商品清单、课程表、报价单。 表格由:表格<table>、行<tr>、单元格<td>、表头<th>组合而成。

基础标签总览

标签 全称 作用
<table> table 整个表格的容器,包裹全部表格代码
<tr> table‑row 表格一行,一行写一组 tr
<td> table‑data 普通单元格,存放数据文字
<th> table‑header 表头单元格,默认文字加粗、居中,用于标题列 / 标题行

嵌套层级严格顺序: <table> → 里面放多个 <tr>(行) <tr> → 里面放多个 <td> / <th>(单元格)
❗不要把 td 直接写在 table 里面,td 必须包裹在 tr 里面。

最简单基础表格示例(2 行 3 列)

html 复制代码
<!DOCTYPE html>
<html lang="zh‑CN">
<head>
    <meta charset="UTF‑8">
    <title>基础表格</title>
</head>
<body>
    <h3>学生成绩表</h3>
    <table>
        <!-- 第一行 tr -->
        <tr>
            <th>姓名</th>
            <th>语文</th>
            <th>数学</th>
        </tr>
        <!-- 第二行 tr -->
        <tr>
            <td>小明</td>
            <td>90</td>
            <td>95</td>
        </tr>
    </table>
</body>
</html>

解释:

  1. <table>:整个表格外壳。
  2. 第一个<tr>代表第一行,里面 3 个<th>表头单元格。
  3. 第二个<tr>代表第二行,里面 3 个<td>普通单元格放数据。
  4. 默认浏览器表格没有边框,看不到格子线

给表格加边框属性 border

border="1" 给表格加上边框线(html 原生属性,简单测试用;正式项目边框推荐 CSS)

html 复制代码
<table border="1">
    <tr>
        <th>姓名</th>
        <th>语文</th>
    </tr>
    <tr>
        <td>小红</td>
        <td>88</td>
    </tr>
</table>

⚠原生 border 会出现双线边框,后面用 CSS 可以合并边框。

单元格合并:跨列 colspan、跨行 rowspan(表格重点难点)

  • colspan="n"跨列合并,横向占 n 个单元格宽度
  • rowspan="n"跨行合并,纵向占 n 个单元格高度

合并之后,被合并掉的单元格标签要删掉,不然会多出多余格子。

示例 1:colspan 跨列合并(横向合并)

第一行第一个单元格跨 2 列。

html 复制代码
<table border="1">
    <tr>
        <!-- colspan="2" 横向占2格,后面删掉一个td -->
        <td colspan="2">课程信息</td>
    </tr>
    <tr>
        <td>HTML</td>
        <td>CSS</td>
    </tr>
</table>

解释: <td colspan="2">课程信息</td>,这个单元格横向占据 2 格,所以本行不再写第二个<td>

示例 2:rowspan 跨行合并(纵向合并)

html 复制代码
<table border="1">
    <tr>
        <!-- rowspan="2" 纵向占2行,下面一行要删掉对应的td -->
        <td rowspan="2">学生</td>
        <td>语文</td>
    </tr>
    <tr>
        <!-- 这里原本第一个td被上面rowspan合并,直接不写 -->
        <td>数学</td>
    </tr>
</table>

综合合并例子:课程表

html 复制代码
<table border="1">
    <tr>
        <th rowspan="2">时间</th>
        <th colspan="3">星期</th>
    </tr>
    <tr>
        <th>周一</th>
        <th>周二</th>
        <th>周三</th>
    </tr>
    <tr>
        <td>上午</td>
        <td>HTML</td>
        <td>CSS</td>
        <td>JS</td>
    </tr>
</table>

表格补充标签 <thead><tbody><tfoot>

把表格语义化划分三部分:

  • <thead>:表头区域
  • <tbody>:表格主体数据(主要内容)
  • <tfoot>:表格底部汇总

写在 table 内部,包裹 tr,不会改变外观,提高代码可读性,方便 JS 操作表格

示例:

html 复制代码
<table border="1">
    <thead>
        <tr>
            <th>商品</th>
            <th>价格</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>键盘</td>
            <td>120</td>
        </tr>
        <tr>
            <td>鼠标</td>
            <td>60</td>
        </tr>
    </tbody>
    <tfoot>
        <tr>
            <td>合计</td>
            <td>180</td>
        </tr>
    </tfoot>
</table>

CSS 美化表格(实际开发用 CSS,不依赖 html 属性)

原生 table 的 border 不好看,双线边框,用 CSS 合并边框、设置宽高、背景色。 重点样式:

  • border-collapse: collapse; 合并表格双线边框,变成单线
  • width 设置表格总宽度
  • text‑align 单元格文字对齐

完整美化示例:

html 复制代码
<!DOCTYPE html>
<html lang="zh‑CN">
<head>
    <meta charset="UTF‑8">
    <style>
        table {
            width:450px;
            border‑collapse: collapse; /*合并边框,消除双线*/
        }
        th,td {
            border:1px solid #333; /*单元格边框*/
            padding:8px; /*单元格内边距,文字离边框留点空隙*/
            text‑align:center; /*文字居中*/
        }
        th {
            background‑color:#eee; /*表头灰色背景*/
        }
    </style>
</head>
<body>
    <h3>商品清单</h3>
    <table>
        <thead>
            <tr>
                <th>商品名称</th>
                <th>单价</th>
                <th>数量</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>显示器</td>
                <td>899</td>
                <td>1</td>
            </tr>
            <tr>
                <td>耳机</td>
                <td>199</td>
                <td>2</td>
            </tr>
        </tbody>
    </table>
</body>
</html>

解释:

  1. border‑collapse: collapse; 最关键,把表格的双线边框合并成一条。
  2. padding:8px; 单元格内部留白,文字不会贴在边框上。
  3. th,td 同时选中表头和普通单元格,统一设置边框、对齐。

新手高频错误

错误 1:层级写乱,td 直接放在 table 里面

html 复制代码
<table>
    <td>内容</td>
</table>

✅ td 必须包在 tr:table > tr > td

错误 2:单元格合并之后,没有删除被合并的 td

合并单元格,那些被占掉位置的 td 标签一定要删掉,否则多出多余格子。

错误 3:只写 border,不写 CSS 的border‑collapse,出现难看双线格子。

测试可以用 html 的 border 属性;正式项目全部交给 CSS 处理。

错误 4:一行里面单元格数量参差不齐,表格错乱。

正常表格每一行单元格数量要一致,除非做了 colspan/rowspan 合并。

错误 5:把<h1> <p>直接写 table 里面,所有内容要放到 td 单元格内部。

完整综合练习代码,直接复制运行

html 复制代码
<!DOCTYPE html>
<html lang="zh‑CN">
<head>
    <meta charset="UTF‑8">
    <title>表格综合练习</title>
    <style>
        table{
            width:500px;
            border‑collapse:collapse;
        }
        th,td{
            border:1px solid #444;
            padding:10px;
            text‑align:center;
        }
        th{
            background‑color:#cce5ff;
        }
    </style>
</head>
<body>
    <h2>班级成绩单</h2>
    <table>
        <thead>
            <tr>
                <th>姓名</th>
                <th>语文</th>
                <th>数学</th>
                <th>备注</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>小明</td>
                <td>92</td>
                <td>88</td>
                <td rowspan="2">优秀学生</td>
            </tr>
            <tr>
                <td>小红</td>
                <td>95</td>
                <td>94</td>
                <!-- 本单元格被上面rowspan合并,不写td -->
            </tr>
            <tr>
                <td>小刚</td>
                <td>76</td>
                <td>80</td>
                <td>普通</td>
            </tr>
        </tbody>
    </table>
</body>
</html>

本篇知识点总结

  1. 表格标签关系:<table>表格容器 → <tr>行 → <td>普通单元格 / <th>表头单元格(默认加粗居中)。
  2. border="1"原生测试边框;正式开发用 CSS,border‑collapse:collapse合并双线边框。
  3. 单元格合并:
    • colspan="n"跨列,横向合并
    • rowspan="n"跨行,纵向合并 ⚠合并后要删除被占用的单元格标签。
  4. 语义标签:<thead>表头,<tbody>主体,<tfoot>表尾,只优化代码语义,不改外观。
  5. CSS:padding设置单元格内边距,text‑align:center文字居中。
  6. 表格所有文字、内容必须写在<td><th>单元格里面。

✍小练习:写一个 3 行 4 列表格,表头姓名、科目 1、科目 2、总分;CSS 美化单线边框;尝试一个单元格做 colspan 跨两列。

相关推荐
Betterme1 小时前
Vue3 竞态请求防护组合式hooks:useLatestRequest 设计思路
前端
_zhourui_h_1 小时前
一个 [ECS] 到底生成了多少代码?EasyECS 最核心的秘密都在这里
前端
梨想橙汁1 小时前
Git 分支详解:创建切换、合并分支、冲突解决实战
前端·git
雪芽蓝域zzs1 小时前
Vue3 defineProps` / `defineEmits` 是编译器宏,不需要手动 import 导入
前端·javascript·vue.js
whyweplay1 小时前
Elpis:从Json Schema 到 页面
前端·javascript
做萤石二次开发的哈哈2 小时前
海康班班通交互一体机技能接入实战:ISAPI透传+OTAP双协议封装,Web/App/小程序教学管理应用一站生成
前端·物联网·小程序·交互·萤石开放平台·蓝海aiot一站式工作台·aiot开发
计算机魔术师2 小时前
Anthropic一次性锁死十年算力,5170亿美元买什么
前端
IT_陈寒2 小时前
Redis的订阅丢失消息?你可能忘了这个配置
前端·人工智能·后端
头茬韭菜2 小时前
第 3 篇:「Pydantic 即 Schema」—— 工具生态三层解剖
前端·chrome·ai·openmanus