HTML(HyperText Markup Language)是构建网页的基石。无论你是刚入门的前端新人,还是有经验的开发者想要夯实基础,这篇文章都将带你系统梳理 HTML 的核心知识——从文档结构到语义化标签,再到可访问性实践。
一、HTML 文档结构
一个标准的 HTML5 文档骨架如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="页面描述,用于 SEO">
<title>页面标题</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<!-- 页面可见内容 -->
<header>...</header>
<main>...</main>
<footer>...</footer>
<script src="app.js"></script>
</body>
</html>| 元素 | 作用 | 说明 |
|---|---|---|
<!DOCTYPE html> |
声明文档类型 | 必须是第一行,告诉浏览器使用 HTML5 标准模式 |
<html> |
根元素 | lang 属性帮助屏幕阅读器和搜索引擎理解页面语言 |
<head> |
元数据容器 | 不可见内容:编码、标题、样式、SEO 信息等 |
<body> |
可见内容容器 | 所有用户能看到的内容都放在这里 |
实用建议:
<script>放在</body>之前,避免阻塞页面渲染。如果必须放在<head>中,加上defer或async属性。
二、常用标签分类:块级 vs 行内
块级元素(Block)
块级元素独占一行,可以设置宽高、内外边距。常见的有:
<div>、<p>、<h1>~<h6>、<ul>/<ol>/<li>、
<section>、<article>、<header>、<footer>、<nav>行内元素(Inline)
行内元素与其他元素共享一行,宽高由内容决定:
<span>、<a>、<strong>、<em>、<img>、<code>、<label>行内块元素(Inline-Block)
通过 display: inline-block 可以获得行内元素的排列特性 + 块级元素的盒模型:
.button {
display: inline-block;
width: 120px;
height: 40px;
padding: 8px 16px;
}| 特性 | Block | Inline | Inline-Block |
|---|---|---|---|
| 独占一行 | ✅ | ❌ | ❌ |
| 可设宽高 | ✅ | ❌ | ✅ |
| 可设内外边距 | ✅ | 仅水平方向 | ✅ |
| 典型元素 | div, p, h1 |
span, a, strong |
button, input |
三、语义化标签
HTML5 引入了一系列语义化标签,让页面结构更加清晰,同时有利于 SEO 和可访问性。
<body>
<header>
<nav>
<a href="/">首页</a>
<a href="/blog">博客</a>
<a href="/about">关于</a>
</nav>
</header>
<main>
<article>
<h1>文章标题</h1>
<p>文章正文内容...</p>
<section>
<h2>小节标题</h2>
<p>小节内容...</p>
</section>
</article>
<aside>
<h3>相关推荐</h3>
<ul>
<li><a href="#">相关文章1</a></li>
<li><a href="#">相关文章2</a></li>
</ul>
</aside>
</main>
<footer>
<p>© 2024 我的博客. All rights reserved.</p>
</footer>
</body>| 标签 | 语义 | 使用场景 |
|---|---|---|
<header> |
页眉 / 区块头部 | 站点 Logo、导航栏、文章标题区域 |
<nav> |
导航链接区域 | 主导航、面包屑、分页 |
<main> |
页面主要内容 | 每个页面只有一个,包裹核心内容 |
<article> |
独立的内容块 | 博客文章、新闻、评论(可独立分发) |
<section> |
文档中的节 | 有标题的主题分组 |
<aside> |
侧边栏 / 附加内容 | 广告、相关链接、作者信息 |
<footer> |
页脚 / 区块尾部 | 版权信息、联系方式、相关链接 |
实用建议:不要为了语义化而语义化——如果你只是需要一个容器来做样式,用
<div>就好。语义化标签的核心目的是表达内容含义,而不是替代<div>。
四、表单元素
表单是用户与网站交互的核心渠道,HTML5 提供了丰富的表单控件:
<form action="/submit" method="POST" novalidate>
<!-- 文本输入 -->
<label for="username">用户名:</label>
<input type="text" id="username" name="username"
placeholder="请输入用户名" required
minlength="3" maxlength="20">
<!-- 邮箱 -->
<label for="email">邮箱:</label>
<input type="email" id="email" name="email" required>
<!-- 下拉选择 -->
<label for="city">城市:</label>
<select id="city" name="city">
<option value="">请选择</option>
<optgroup label="华北">
<option value="beijing">北京</option>
<option value="tianjin">天津</option>
</optgroup>
</select>
<!-- 单选 -->
<fieldset>
<legend>性别:</legend>
<input type="radio" id="male" name="gender" value="male">
<label for="male">男</label>
<input type="radio" id="female" name="gender" value="female">
<label for="female">女</label>
</fieldset>
<!-- 多选 -->
<label>
<input type="checkbox" name="agree" required>
我同意用户协议
</label>
<!-- 文本域 -->
<label for="bio">个人简介:</label>
<textarea id="bio" name="bio" rows="4"></textarea>
<button type="submit">提交</button>
</form>| 输入类型 | 用途 | HTML5 新增验证 |
|---|---|---|
type="email" |
邮箱地址 | 自动校验 @ 符号 |
type="url" |
网址 | 自动校验协议 |
type="number" |
数字 | min/max/step |
type="tel" |
电话号码 | 移动端弹出数字键盘 |
type="date" |
日期 | 浏览器原生日期选择器 |
type="range" |
滑块 | min/max/step |
实用建议:
- 每个
<input>都搭配<label>,点击 label 可以聚焦到对应输入框(提升移动端体验)。- 使用
required、pattern、minlength等原生验证,减少 JavaScript 工作量。autocomplete属性帮助浏览器自动填充,提升表单填写效率。
五、表格
<table>
<caption>2024 年季度销售数据</caption>
<thead>
<tr>
<th scope="col">季度</th>
<th scope="col">销售额(万元)</th>
<th scope="col">同比增长</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Q1</th>
<td>120</td>
<td>+15%</td>
</tr>
<tr>
<th scope="row">Q2</th>
<td>148</td>
<td>+23%</td>
</tr>
</tbody>
<tfoot>
<tr>
<th scope="row">合计</th>
<td>268</td>
<td>—</td>
</tr>
</tfoot>
</table>实用建议:
scope="col"和scope="row"对屏幕阅读器至关重要,它们帮助关联表头和数据单元格。同时使用<caption>来描述表格内容。
六、多媒体元素
<!-- 图片:始终提供 alt 属性 -->
<img src="hero.jpg"
alt="日出的海景照片,橙红色天空与深蓝海水形成对比"
loading="lazy"
width="800" height="400">
<!-- 响应式图片:根据屏幕宽度加载不同尺寸 -->
<picture>
<source media="(min-width: 768px)" srcset="hero-large.jpg">
<source media="(min-width: 480px)" srcset="hero-medium.jpg">
<img src="hero-small.jpg" alt="日出的海景照片">
</picture>
<!-- 视频 -->
<video controls width="640" poster="thumbnail.jpg">
<source src="demo.mp4" type="video/mp4">
<source src="demo.webm" type="video/webm">
<track src="subtitles-zh.vtt" kind="subtitles" srclang="zh" label="中文">
您的浏览器不支持 video 标签
</video>
<!-- 音频 -->
<audio controls>
<source src="podcast.mp3" type="audio/mpeg">
<source src="podcast.ogg" type="audio/ogg">
</audio>| 属性 | 作用 | 建议 |
|---|---|---|
loading="lazy" |
延迟加载图片 | 对首屏以外的图片使用,提升性能 |
alt |
图片替代文本 | 必须有,描述图片内容而非 "图片" 二字 |
width / height |
图片固有尺寸 | 防止布局抖动(CLS) |
poster |
视频封面 | 视频加载前显示的占位图 |
<track> |
字幕/章节 | 提升可访问性 |
七、Meta 标签与 SEO
<head>
<!-- 字符编码:必须第一行 -->
<meta charset="UTF-8">
<!-- 视口:响应式必备 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- SEO 核心 -->
<meta name="description" content="150 字以内的页面描述,搜索引擎摘要">
<meta name="keywords" content="HTML, 前端, 语义化">
<meta name="author" content="作者名">
<!-- Open Graph(社交分享) -->
<meta property="og:title" content="HTML 基础知识系列">
<meta property="og:description" content="从标签到语义化的全面指南">
<meta property="og:image" content="https://example.com/og-image.jpg">
<meta property="og:url" content="https://example.com/html-basics">
<meta property="og:type" content="article">
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="HTML 基础知识系列">
<!-- 搜索引擎索引控制 -->
<meta name="robots" content="index, follow">
<!-- Canonical URL:避免重复内容问题 -->
<link rel="canonical" href="https://example.com/html-basics">
</head>八、可访问性(Accessibility)
基础规则
<!-- 1. 使用语义化标签(前面已讲) -->
<!-- 2. 图片提供 alt -->
<img src="chart.png" alt="2024 年季度销售柱状图,Q1 120万,Q2 148万">
<!-- 3. 图标按钮提供标签 -->
<button aria-label="关闭对话框">
<span aria-hidden="true">×</span>
</button>
<!-- 4. 表单关联 label -->
<label for="search">搜索:</label>
<input type="search" id="search" aria-describedby="search-hint">
<span id="search-hint">输入关键词后按回车搜索</span>
<!-- 5. ARIA 地标角色(当 HTML5 语义标签不够用时) -->
<div role="banner"> <!-- 等价于 <header> -->
<div role="navigation"> <!-- 等价于 <nav> -->
<div role="main"> <!-- 等价于 <main> -->
<!-- 6. 动态内容区域 -->
<div aria-live="polite" aria-atomic="true">
<!-- 这里的更新会被屏幕阅读器播报 -->
</div>
<!-- 7. 跳过导航链接 -->
<a href="#main-content" class="skip-link">跳到主要内容</a>| ARIA 属性 | 用途 |
|---|---|
aria-label |
为非文本元素提供可访问的名称 |
aria-labelledby |
引用其他元素作为标签 |
aria-describedby |
引用补充描述 |
aria-hidden |
对辅助技术隐藏元素 |
aria-live |
动态内容变化的播报策略 |
role |
明确元素语义角色 |
实用建议:优先使用原生 HTML 语义,ARIA 只是在语义不够用时的补充。坏 ARIA 比没有 ARIA 更糟糕。
九、最佳实践速查
| 实践 | 说明 |
|---|---|
| ✅ 使用 HTML5 语义标签 | <header>, <main>, <nav>, <footer> |
✅ 图片始终写 alt |
装饰性图片用 alt="" |
| ✅ label 关联 input | for 属性或嵌套结构 |
| ✅ 合理使用 heading 层级 | h1 → h2 → h3,不要跳级 |
| ✅ 压缩 HTML / 懒加载资源 | 提升性能 |
❌ 不要用 <div> 替代按钮 |
用 <button>,原生支持键盘和 ARIA |
❌ 不要用 <br> 控制间距 |
用 CSS margin/padding |
❌ 不要省略 lang 属性 |
影响屏幕阅读器发音和翻译工具 |
结语
HTML 看似简单,但写出语义清晰、可访问、SEO 友好的 HTML 需要持续练习和思考。记住核心原则:HTML 负责结构和语义,CSS 负责样式,JavaScript 负责行为。三者各司其职,才能构建出健壮的 Web 应用。
下一篇我们将深入 CSS 核心知识,敬请期待!