✍️ 作者:王文峰(外号:神秘小峯 / 山峯)|中国国学、传统文化与代码爱好者的程序人生,期待你的关注和支持!
HTML 入门到进阶:语义化标签、表单与多媒体
-
- [一、开篇:HTML 不是"会写 div"就行](#一、开篇:HTML 不是"会写 div"就行)
- [二、语义化标签:让 HTML 自己说话](#二、语义化标签:让 HTML 自己说话)
-
- [1. 页面骨架的标准姿势](#1. 页面骨架的标准姿势)
- [2. 常用语义标签速查表](#2. 常用语义标签速查表)
- [3. div 和语义标签怎么选?(高频面试题)](#3. div 和语义标签怎么选?(高频面试题))
- 三、表单:从"能提交"到"真的能用"
-
- [1. input type 家族(很多人只用过 5 个)](#1. input type 家族(很多人只用过 5 个))
- [2. 原生校验:能不写 JS 就不写 JS](#2. 原生校验:能不写 JS 就不写 JS)
- [3. 校验兜底:Constraint Validation API](#3. 校验兜底:Constraint Validation API)
- [4. 无障碍与体验三件套](#4. 无障碍与体验三件套)
- [四、多媒体:video / audio / Canvas](#四、多媒体:video / audio / Canvas)
-
- [1. video 标签的标准写法](#1. video 标签的标准写法)
- [2. Canvas vs SVG:位图和矢量怎么选](#2. Canvas vs SVG:位图和矢量怎么选)
- [五、别忽略的性能与 SEO 细节](#五、别忽略的性能与 SEO 细节)
- 六、实战:一个综合小页面
- [七、面试官追问 Top5](#七、面试官追问 Top5)
- 八、总结与自测清单
- [🎯 学习教程(传送门)](#🎯 学习教程(传送门))
- [🔥 往期文章](#🔥 往期文章)

📚 本文是「从入门到进阶」基础篇。后端同学也别跳过------HTML 写得专不专业,是前端基本功的照妖镜 。这篇把 HTML 最能拉开差距的三块掰开讲透:语义化标签、表单、多媒体,每块都带完整代码和避坑点。
一、开篇:HTML 不是"会写 div"就行
很多同学的 HTML 只有一个水平:满屏 div + 一把 class。后果很现实:
- 搜索引擎看不懂你的页面结构(SEO 差);
- 屏幕阅读器读不出来(无障碍不合格);
- 三年后没人敢动这段 HTML(维护性差);
- 表单只会 text + submit(用户体验差、校验全靠 JS)。
而 HTML5 给了我们一整套"结构即语义"的武器,这篇一次讲完。

二、语义化标签:让 HTML 自己说话
1. 页面骨架的标准姿势
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>HTML 入门到进阶 - 王文峰</title>
</head>
<body>
<header>
<nav aria-label="主导航">
<ul>
<li><a href="/">首页</a></li>
<li><a href="/archive">归档</a></li>
</ul>
</nav>
</header>
<main>
<article>
<h1>文章标题</h1>
<p>文章正文......</p>
<figure>
<img src="chart.png" alt="2026年语言趋势柱状图" loading="lazy">
<figcaption>图1:2026 年语言趋势</figcaption>
</figure>
</article>
<aside>
<h2>相关文章</h2>
<ul><li><a href="#">Spring Boot 启动流程</a></li></ul>
</aside>
</main>
<footer>
<p><small>© 2026 王文峰</small></p>
</footer>
</body>
</html>
2. 常用语义标签速查表
| 标签 | 语义 | 使用要点 |
|---|---|---|
header / footer |
页头/页脚 | 不限于整页,article 内部也可用 |
nav |
导航区 | 只包主要导航,面包屑不必用 |
main |
页面主内容 | 一个页面只能有一个 |
article |
独立完整的内容单元 | 一篇文章、一条评论、一个卡片 |
section |
主题分组 | 必须有标题,否则用 div 就行 |
aside |
侧边辅助内容 | 相关链接、目录、广告 |
figure / figcaption |
图表及题注 | 一张图配一句话说明的最佳拍档 |
details / summary |
可折叠内容 | 原生手风琴,零 JS 实现 FAQ |
mark / time |
高亮/时间 | time datetime="2026-10-19" 机器可读 |
strong / em |
重要/强调 | 有语义加重读音;b/i 只是样式 |
address |
联系信息 | 放在 footer 里最合适 |
3. div 和语义标签怎么选?(高频面试题)
| 场景 | 选择 |
|---|---|
| 纯布局/装饰(栅格、圆角容器) | div + span 不丢人 |
| 表达页面区块的结构含义 | header/nav/main/aside/footer |
| 表达一段自成一体的内容 | article |
| 只是主题分组 | section(记得带标题) |
| 样式钩子 | 优先用语义标签 + class,而不是造 div |
💡 口诀:能表达含义就不用 div,只是布局就别硬套语义。语义化不是不用 div,而是让 div"退居二线"。
语义化三大收益:SEO 权重更高(爬虫看得懂层级)、屏幕阅读器可导航(无障碍合规)、代码可维护(新人看标签就懂结构)。
三、表单:从"能提交"到"真的能用"
1. input type 家族(很多人只用过 5 个)
| type | 效果 | 备注 |
|---|---|---|
email / url / tel |
移动端弹对应键盘 + 内置格式校验 | tel 不校验格式,只换键盘 |
number |
数字输入 | 配 min/max/step |
range |
滑块 | 音量、评分控件 |
date / time / month / week |
原生日期时间选择器 | 免手写日历组件 |
color |
取色器 | 一行代码白嫖 |
search |
搜索框(带清除按钮) | 配合 type=search 样式微调 |
file |
文件上传 | multiple 多选,accept 限类型 |
radio / checkbox |
单选/多选 | 同组 name 必须相同 |
hidden |
隐藏域 | 提交 token、id 等静默数据 |
2. 原生校验:能不写 JS 就不写 JS
html
<form action="/register" method="post">
<label for="username">用户名</label>
<input type="text" id="username" name="username"
required minlength="2" maxlength="20"
placeholder="2~20 个字符" autocomplete="username">
<label for="phone">手机号</label>
<input type="tel" id="phone" name="phone" required
pattern="1[3-9]\d{9}" title="请输入 11 位大陆手机号">
<label for="birthday">生日</label>
<input type="date" id="birthday" name="birthday" max="2010-01-01">
<button type="submit">注册</button>
</form>
pattern直接写正则 ,title会在校验失败时作为提示展示;required、minlength/maxlength、min/max/step覆盖大部分场景;- 不想让浏览器拦截提交:
<form novalidate>,然后自己接管。
3. 校验兜底:Constraint Validation API
js
const input = document.getElementById('phone');
console.log(input.validity.valid); // 是否合法
console.log(input.validationMessage); // 不合法时的原因文案
// 自定义业务校验:校验通过必须传空串清除错误
if (input.value !== '13800001234') {
input.setCustomValidity('该手机号未注册');
} else {
input.setCustomValidity('');
}
input.reportValidity(); // 主动弹出提示
4. 无障碍与体验三件套
html
<fieldset>
<legend>性别</legend>
<input type="radio" id="m" name="sex" value="m"><label for="m">男</label>
<input type="radio" id="f" name="sex" value="f"><label for="f">女</label>
</fieldset>
<input type="text" id="search" aria-label="站内搜索" placeholder="搜索文章">
label的for必须对上控件id------点文字也能聚焦,命中面积翻倍;- 一组控件用
fieldset+legend包裹,屏幕阅读器才能读出"分组名"; - 没有可见文字时用
aria-label;必填项加aria-required="true"。
⚠️ 必背结论 :前端校验是"防呆不防恶",服务端必须再校验一遍,这是安全底线。
四、多媒体:video / audio / Canvas
1. video 标签的标准写法
html
<video controls poster="cover.jpg" preload="metadata" width="720" playsinline>
<source src="lesson.webm" type="video/webm">
<source src="lesson.mp4" type="video/mp4">
<track kind="captions" src="zh.vtt" srclang="zh" label="中文字幕" default>
你的浏览器不支持 video 标签
</video>
要点:
<source>按顺序降级:浏览器从上往下找第一个能播的格式(webm 体积小放前面,mp4 兼容王垫底);preload:metadata只预载时长/尺寸(省流量),auto预加载,none不加载;poster:首屏封面图,大幅降低跳出率;<track>挂字幕/标题(WebVTT 格式),无障碍和 SEO 双加分。
浏览器策略坑 :autoplay 想生效,必须同时加 muted(静音自动播放是被允许的):
html
<video autoplay muted loop playsinline src="bg.mp4"></video> <!-- 页面背景视频 -->
audio 同理,只是没有画面:<audio controls src="podcast.mp3"></audio>。
2. Canvas vs SVG:位图和矢量怎么选
| 维度 | Canvas | SVG |
|---|---|---|
| 本质 | 位图,逐像素绘制 | 矢量,DOM 元素 |
| 数量级 | 上万粒子/动画无压力 | 几百个元素内舒适 |
| 事件 | 需自己算坐标 | 每个图形都是元素,可直接绑事件 |
| 适合 | 图表、特效、图像处理、游戏 | 图标、Logo、交互式图形 |
js
// Canvas 十行画一个柱状图雏形
const ctx = document.getElementById('c').getContext('2d');
const data = [120, 200, 150, 80, 160];
data.forEach((v, i) => {
ctx.fillStyle = '#e34c26';
ctx.fillRect(30 + i * 60, 300 - v, 40, v);
});
html
<!-- SVG 内联写法:能被 CSS 染色、能加交互 -->
<svg viewBox="0 0 100 100" width="48" height="48" role="img" aria-label="设置图标">
<circle cx="50" cy="50" r="40" fill="#e34c26"/>
</svg>
💡 小图标优先 内联 SVG (无请求、可控制颜色),大屏动效和图表上 Canvas,这基本是业界默认答案。
五、别忽略的性能与 SEO 细节
| 细节 | 写法 | 收益 |
|---|---|---|
| 图片懒加载 | <img loading="lazy"> |
首屏加载量立减 |
| 响应式图片 | <picture> + srcset |
手机不下载 PC 大图 |
| 图片必填 alt | alt="2026年语言趋势图" |
SEO + 无障碍,别留空 |
| 视口声明 | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
移动端不缩放的根 |
| SEO 三件套 | <title>、description、OG 标签 |
分享卡片好看、排名友好 |
六、实战:一个综合小页面
语义化骨架 + 校验表单 + 视频播放,合体:
html
<body>
<header>
<h1>HTML 学习课</h1>
<nav aria-label="课程导航"><a href="#lesson">课程</a> <a href="#qa">问答</a></nav>
</header>
<main>
<article id="lesson">
<h2>第 1 课:语义化标签</h2>
<video controls poster="lesson1.jpg" preload="metadata">
<source src="lesson1.mp4" type="video/mp4">
<track kind="captions" src="lesson1.vtt" srclang="zh" label="中文字幕" default>
</video>
</article>
<section id="qa">
<h2>课后问答</h2>
<form action="/qa" method="post">
<fieldset>
<legend>本节课难度</legend>
<input type="radio" id="d1" name="level" value="1"><label for="d1">🙂 简单</label>
<input type="radio" id="d2" name="level" value="2"><label for="d2">🤔 一般</label>
<input type="radio" id="d3" name="level" value="3"><label for="d3">😰 太难</label>
</fieldset>
<label for="content">你的问题</label>
<textarea id="content" name="content" required minlength="5" rows="4"
placeholder="至少 5 个字"></textarea>
<button type="submit">提交</button>
</form>
</section>
</main>
<footer><p><small>© 2026 王文峰</small></p></footer>
</body>
结构干净到"看标签知结构",这就是语义化的回报。
七、面试官追问 Top5
| 问题 | 答题要点 |
|---|---|
| 语义化标签有什么好处? | SEO、无障碍、可维护性,三层递进 |
div、section、article 区别? |
布局 / 主题分组(要有标题)/ 独立完整内容 |
label 的作用? |
for 绑定 id,扩大命中区、提升无障碍 |
视频为什么加 source 多个? |
格式兼容降级,按顺序取第一个可播 |
| 前端校验能防住攻击吗? | 不能,防呆不防恶,服务端必须复校 |
八、总结与自测清单
- ✅ 页面骨架用
header/nav/main/article/aside/footer,div 退居布局二线; - ✅
section必须带标题,main一页只能有一个; - ✅ 表单记住三件套:
label[for]、原生校验属性、Constraint Validation API; - ✅
input type不止 text,date/color/range 都是白嫖的原生组件; - ✅
video用source降级 +poster+track字幕;autoplay 必配 muted; - ✅ 图标用内联 SVG,动效图表用 Canvas;
- ✅ 图片必写
alt和loading="lazy"; - ✅ 前端校验只是体验,服务端校验才是安全。
下一篇:《CSS 篇:盒模型、Flex 布局与 Grid 实战》------把布局三件套讲透,敬请关注!
🎯 学习教程(传送门)
| 序号 | 专栏 | 学习内容 | 当前状态 |
|---|---|---|---|
| 01 | JAVA | 从入门到进阶的系统知识 | 持续写作中...... |
| 02 | Oracle | 数据库从用法到实战 | 创作中...... |
| 03 | vbs脚本 | 手把手教你做脚本 | 完善中...... |
| 04 | IDEA | 牛逼哄哄的编程利器 | 编写中...... |
| 05 | 面试 | 吐血整理的面试技巧 | 更新中...... |

🔥 往期文章
🧭 精选往期好文,更多请移步 我的博客主页
- 📕 2026 Java+AI 面试题全解析
- 📗 Spring Boot 启动流程源码解析
- 📘 Spring Boot 自动配置原理揭秘
- 📙 Java开发-热点-热门问题精华核心总结-推荐
- 📚 往期文章大全......

👍 点赞 + ⭐ 收藏 + 💬 评论,一键三连走起!
你们的支持,是我持续创作的最大动力~

✨ 以上就是今天的全部内容,关注我,技术之路不迷路!
📖 本人详解
✍️ 作者:王文峰,参与 CSDN 2020 年度博客之星评选,《Java王大师王天师》,外号:神秘小峯 / 山峯
🏮 中国国学、传统文化与代码爱好者的程序人生,期待你的关注和支持!
🔗 转载说明:务必注明来源(注明:作者:王文峰哦)