Appearance
HTML
HTML 不是“写几个标签”这么简单。
HTML 负责的是:
- 页面内容的结构表达
- 文档语义的组织
- 浏览器解析页面时的基础骨架
- 搜索引擎和无障碍工具理解页面的入口
如果 CSS 决定“怎么展示”,JavaScript 决定“怎么交互”,那 HTML 决定的就是:
页面到底是什么。
1. HTML 在解决什么问题
HTML 的核心价值,主要有三层:
- 用结构把内容组织起来
- 用语义告诉浏览器和开发者“这一块是什么”
- 为样式和脚本提供稳定的挂载基础
所以 HTML 真正重要的地方,不在于你会多少个标签,而在于:你是否知道某一段内容为什么应该用这个标签,而不是另一个标签。
2. 一份页面为什么必须先有 HTML
浏览器看到一个页面时,并不是看到样式和交互,而是先拿到一份 HTML 文档。
这份文档至少要回答几件事:
- 页面标题是什么
- 页面有哪些结构块
- 文本、链接、图片、表单分别在哪里
- 哪些资源需要继续加载
看一条非常简化的主线:
mermaid
flowchart TD
A[浏览器拿到 HTML 文本] --> B[解析标签与属性]
B --> C[构建 DOM 结构]
C --> D[继续加载 CSS JS 图片等资源]
D --> E[页面完成结构展示]这条图最值得记住的不是术语,而是:HTML 是页面的起点。
3. 一份标准 HTML 文档长什么样
看一个最基础的例子:
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 Demo</title>
</head>
<body>
<h1>Hello HTML</h1>
<p>这是一个最基础的页面骨架。</p>
</body>
</html>这里几个关键点分别在做什么:
<!doctype html>:告诉浏览器按现代 HTML 标准模式解析页面<html>:整个文档的根节点<head>:放页面元信息、标题、资源声明,不直接承载正文内容<body>:放页面真正可见的主体内容lang="zh-CN":告诉浏览器和辅助工具当前文档的语言
3.1 head 和 body 的边界
这两个标签很容易看起来只是“固定模板的一部分”,但职责非常不同。
head更偏文档说明和资源声明body更偏页面可见内容本身
常见放在 head 中的内容有:
titlemetalinkstyle- 某些需要尽早声明的
script
常见放在 body 中的内容有:
- 标题和段落
- 图片和列表
- 表单
- 页面结构容器
4. 语义化到底在解决什么问题
语义化不是为了把标签写得“更像规范示例”,而是为了让标签本身就表达结构含义。
例如:
- 导航区域用
nav - 主要内容区用
main - 文章主体用
article - 侧边补充区域用
aside - 页眉和页脚分别用
header、footer
语义化的价值主要在三层:
- 代码结构更清楚,团队协作更轻松
- 搜索引擎更容易理解页面内容
- 屏幕阅读器等辅助工具更容易正确解析页面
也就是说,语义化解决的不是“标签好不好看”,而是:页面结构能不能被人和工具同时更准确地理解。
4.1 常见语义标签可以怎么用
html
<header>
<h1>技术笔记</h1>
<nav>
<a href="/frontend">前端</a>
<a href="/backend">后端</a>
</nav>
</header>
<main>
<article>
<h2>HTML 是什么</h2>
<p>HTML 负责页面结构和语义。</p>
</article>
<aside>
<p>相关阅读推荐</p>
</aside>
</main>
<footer>
<p>Copyright</p>
</footer>5. 常见文本与结构标签怎么理解
HTML 里很多标签虽然常见,但职责并不一样。
5.1 标题与段落
最基础也最常见的是:
h1到h6p
要注意的点是:
- 标题标签表示内容层级,不只是字体大小
p更适合承载一段完整文本
5.2 列表
列表最常见的是:
ul:无序列表ol:有序列表li:列表项
如果内容本身存在顺序关系,例如步骤说明,更适合用 ol。
5.3 链接和强调
常见包括:
astrongemspan
这里最值得注意的是:
a用来表达可跳转的超链接strong更偏重要性强调em更偏语义上的强调语气span是更中性的局部包裹标签
6. 块级元素、行内元素、行内块元素怎么理解
这是 HTML 和 CSS 交界处最容易混的一组概念。
把这层分工记住:
- 块级元素:默认更像一个结构块,通常独占一行
- 行内元素:默认和文本排在同一行,更适合包裹局部内容
- 行内块元素:不独占一行,但又可以控制宽高
常见例子:
- 块级元素:
div、p、h1、ul - 行内元素:
span、a、strong - 行内块元素:
img、input、button
要注意的是:
- 块级元素更适合结构分区
- 行内元素更适合局部文本语义
- 行内块元素常用于横向排列但又需要尺寸控制的场景
7. 表单为什么是 HTML 的重要主线
很多前端交互最后都会落到“用户输入数据”这件事上,所以表单不是边角知识,而是 HTML 的核心能力之一。
常见表单标签包括:
forminputtextareaselectoptionbuttonlabel
7.1 一个基础表单示例
html
<form action="/login" method="post">
<div>
<label for="username">用户名</label>
<input id="username" name="username" type="text" />
</div>
<div>
<label for="password">密码</label>
<input id="password" name="password" type="password" />
</div>
<button type="submit">登录</button>
</form>这里几个关键点要注意:
form定义一组提交数据的边界name会影响表单提交时字段名label和控件关联后,可点击范围更自然,也更利于无障碍button type="submit"会触发表单提交
7.2 常见输入类型
input 并不是只有文本框。
常见类型包括:
textpasswordemailnumbercheckboxradiofiledate
不同类型不只是“UI 不同”,还会影响:
- 浏览器默认校验方式
- 移动端输入法表现
- 用户输入体验
7.3 表单原生能力不要忽略
HTML 表单本身已经提供了一些很实用的能力,例如:
requiredplaceholderdisabledreadonlymaxlength
这些能力不一定能替代完整业务校验,但它们能提供第一层输入约束和更好的交互反馈。
8. 图片、多媒体和嵌入内容怎么理解
HTML 不只承载文本,也承载多媒体内容。
8.1 图片
最常见的是 img:
html
<img src="/images/avatar.png" alt="用户头像" />这里最容易被忽略的是 alt。
alt 不是装饰性属性,而是:
- 图片加载失败时的替代说明
- 屏幕阅读器理解图片含义的文本入口
- 页面可访问性的重要组成部分
8.2 音视频
HTML5 提供了原生:
audiovideo
例如:
html
<video controls width="480">
<source src="/videos/demo.mp4" type="video/mp4" />
</video>这类标签让浏览器具备了更直接的多媒体播放能力,而不需要完全依赖第三方插件。
8.3 嵌入内容
有时还会看到:
iframeembedobject
其中 iframe 最常见,但也要特别注意:
- 它会引入一个独立文档上下文
- 对样式、交互、性能和安全都有额外影响
9. src 和 href 的区别
这两个属性很容易看起来差不多,但含义并不一样。
可以直接把它看成:
src更像“把资源本体引进来使用”href更像“和某个外部资源建立引用关系”
例如:
| 场景 | 常见属性 |
|---|---|
| 图片、脚本、音视频 | src |
| 超链接、样式表、站内跳转 | href |
所以:
img、script常用srca、link常用href
10. script、defer、async 的区别
script 标签不只是“引 JS 文件”,它还直接影响 HTML 解析和脚本执行顺序。
把这三种加载方式放在一起看:
- 普通
script:下载和执行都会阻塞 HTML 解析 async:脚本异步下载,下载完就立即执行,不保证多个脚本顺序defer:脚本异步下载,但会等 HTML 解析完成后按顺序执行
如果压缩成一句话:
async更适合彼此无依赖的独立脚本defer更适合有顺序要求的业务脚本
10.1 为什么这件事和 HTML 有关
因为浏览器解析 HTML 时,会一边读文档,一边决定:
- 哪些资源要继续加载
- 哪些脚本会阻塞后续解析
- 页面结构什么时候能先建立起来
所以资源声明方式本身,就是 HTML 主线的一部分。
11. SEO 和无障碍为什么都离不开 HTML
很多人会把 SEO 和无障碍理解成“额外优化项”,但它们很多时候首先是 HTML 结构问题。
11.1 SEO 和 HTML 的关系
搜索引擎首看到的,是文档结构。
更合理的 HTML 通常意味着:
- 标题层级更清楚
- 主要内容更明确
- 链接关系更自然
- 元信息更完整
11.2 无障碍为什么值得在 HTML 阶段就考虑
无障碍不是“后面再补几个属性”的问题,它很多时候从 HTML 结构阶段就已经决定了。
最基础也最常见的做法包括:
- 使用正确的语义标签
- 图片补上合适的
alt - 表单控件和说明文字建立关联
- 让页面支持键盘操作
- 必要时使用
aria-*属性补充语义
真正要先立住的是:无障碍首先依赖正确的结构和语义,其次才是额外属性补充。
12. 工程上最容易踩的坑
12.1 用一堆 div 代替本该有语义的标签
这样页面虽然也能显示,但结构表达会越来越差。
12.2 把标题标签只当成“大号字体”
标题层级不仅影响样式,也影响页面结构和 SEO 理解。
12.3 表单里只写输入框,不写 label
这会让可访问性和可操作性都变差。
12.4 图片省略 alt
这通常会直接损失页面可访问性表达。
12.5 不了解脚本加载方式就随意写 script
这很容易导致解析阻塞或执行顺序问题。
13. 一份检查清单
写一份 HTML 页面时,至少可以自查下面这些问题:
- 页面骨架是否完整
- 标题层级是否自然
- 结构标签是否有语义
- 表单是否正确关联
label - 图片是否补了合适的
alt - 脚本加载方式是否符合依赖顺序
- 是否为 SEO 和无障碍保留了必要结构信息
14. 小结
如果把 HTML 压缩成一句话,可以记住:HTML 负责定义页面内容的结构和语义,是整个前端页面的骨架。
如果继续往下读,最自然的下一步是进入 CSS,因为有了页面骨架之后,接下来就该看它怎么被布局和展示。