跳到主要内容

HTML 规范

遵循这些 HTML 开发规范将帮助:

  • 编写符合 Web 标准的代码
  • 提高代码可维护性和可读性
  • 确保更好的可访问性
  • 减少跨浏览器兼容性问题
  • 提升用户体验

1. 文档结构基础

文档类型声明

所有 HTML 文档必须以 HTML5 文档类型声明开始,并保持小写格式。

建议 👍
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>页面标题</title>
</head>
<body>
<!-- 页面内容 -->
</body>
</html>
不建议 👎
<!DOCTYPE HTML>
<HTML>
<HEAD>
<TITLE>页面标题</TITLE>
</HEAD>

必需的文档结构元素

确保所有HTML文档包含必需的结构元素:<html><head><body>

建议 👍
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>完整的文档结构</title>
</head>
<body>
<main>
<h1>主要内容</h1>
</main>
</body>
</html>
不建议 👎
<!doctype html>
<meta charset="utf-8">
<title>缺少结构元素</title>
<h1>内容</h1>

2. 语言和字符编码

语言属性设置

在根 HTML 元素上指定语言属性,帮助屏幕阅读器和翻译工具正确处理内容。

建议 👍
<html lang="zh-CN">
<!-- 中文内容 -->
</html>

<html lang="en">
<!-- 英文内容 -->
</html>
不建议 👎
<html>
<!-- 缺少语言声明 -->
</html>

字符编码声明

在文档头部明确声明 UTF-8 字符编码,确保内容正确渲染。

建议 👍
<head>
<meta charset="utf-8">
<title>正确的字符编码</title>
</head>
不建议 👎
<head>
<title>缺少字符编码声明</title>
</head>

3. 代码格式规范

缩进和空格

使用 2 个空格进行缩进,嵌套元素应当缩进一次。

建议 👍
<div class="container">
<header>
<h1>网站标题</h1>
<nav>
<ul>
<li><a href="#home">首页</a></li>
<li><a href="#about">关于</a></li>
</ul>
</nav>
</header>
</div>
不建议 👎
<div class="container">
<header>
<h1>网站标题</h1>
<nav>
<ul>
<li><a href="#home">首页</a></li>
</ul>
</nav>
</header>
</div>

标签命名规范

所有HTML标签使用小写字母,包括文档类型声明。

建议 👍
<section>
<article>
<header>
<h2>文章标题</h2>
</header>
<p>文章内容</p>
</article>
</section>
不建议 👎
<SECTION>
<Article>
<HEADER>
<H2>文章标题</H2>
</HEADER>
</Article>
</SECTION>

4. 属性规范

属性引号使用

所有属性值必须使用双引号包围。

建议 👍
<img src="images/logo.png" alt="公司标志" class="logo">
<input type="email" placeholder="请输入邮箱地址">
不建议 👎
<img src='images/logo.png' alt=公司标志 class="logo">
<input type=email placeholder='请输入邮箱地址'>

属性排序规范

HTML属性应按以下顺序排列:

  1. class
  2. id, name
  3. data-*
  4. src, for, type, href, value
  5. title, alt
  6. role, aria-*
  7. tabindex
  8. style
建议 👍
<a class="btn btn-primary" id="submit-btn" data-toggle="modal" href="#modal" title="提交表单" role="button">
提交
</a>
<input class="form-control" type="email" name="email" placeholder="邮箱地址" required>
不建议 👎
<a href="#modal" class="btn btn-primary" title="提交表单" id="submit-btn">
提交
</a>

布尔属性处理

布尔属性不需要声明值,属性存在即表示true

建议 👍
<input type="checkbox" checked>
<input type="text" disabled>
<script src="app.js" defer></script>
<audio controls>
<source src="audio.mp3" type="audio/mpeg">
</audio>
不建议 👎
<input type="checkbox" checked="true">
<input type="text" disabled="disabled">
<script src="app.js" defer="defer"></script>

重复属性禁止

避免在同一元素上出现重复属性。

建议 👍
<div class="container main-content" data-role="main">
内容
</div>
不建议 👎
<div class="container" class="main-content" data-role="main">
内容
</div>

5. 元素使用规范

自闭合元素处理

HTML5自闭合元素不需要尾部斜杠。

建议 👍
<img src="image.jpg" alt="描述">
<input type="text" name="username">
<meta charset="utf-8">
<link rel="stylesheet" href="style.css">
<hr>
<br>
不建议 👎
<img src="image.jpg" alt="描述" />
<input type="text" name="username" />
<meta charset="utf-8" />
<hr />
<br />

闭合标签完整性

非空元素必须有对应的闭合标签,包括可选的闭合标签。

建议 👍
<ul>
<li>项目一</li>
<li>项目二</li>
<li>项目三</li>
</ul>
<p>这是一个段落。</p>
<p>这是另一个段落。</p>
不建议 👎
<ul>
<li>项目一
<li>项目二
<li>项目三
</ul>
<p>这是一个段落。
<p>这是另一个段落。

元素嵌套规范

确保元素正确嵌套,遵循 HTML 语义化规则。

建议 👍
<article>
<header>
<h1>文章标题</h1>
</header>
<section>
<h2>章节标题</h2>
<p>段落内容</p>
</section>
</article>
不建议 👎
<p>
<div>段落内不能包含块级元素</div>
</p>
<h1>
<h2>标题不能嵌套其他标题</h2>
</h1>

6. 标题层级结构

标题逻辑层级

确保标题按逻辑层级正确使用,不要跳过级别。

建议 👍
<h1>主标题</h1>
<h2>二级标题</h2>
<h3>三级标题</h3>
<h3>另一个三级标题</h3>
<h2>另一个二级标题</h2>
<h3>三级标题</h3>
不建议 👎
<h1>主标题</h1>
<h3>跳过了h2直接使用h3</h3>
<h5>从h3跳到h5</h5>

7. 表单可访问性

表单标签关联

所有表单输入元素必须有适当的标签关联。

建议 👍
<label for="username">用户名:</label>
<input type="text" id="username" name="username">

<label>
邮箱地址:
<input type="email" name="email">
</label>

<fieldset>
<legend>性别选择</legend>
<label><input type="radio" name="gender" value="male"></label>
<label><input type="radio" name="gender" value="female"></label>
</fieldset>
不建议 👎
<input type="text" placeholder="用户名">
<input type="email" placeholder="邮箱">

<input type="radio" name="gender" value="male">
<input type="radio" name="gender" value="female">

8. 图片和媒体元素

图片替代文本

所有图片必须提供适当的替代文本。

建议 👍
<img src="chart.png" alt="2023年销售额增长图表,显示同比增长15%">
<img src="decorative-border.png" alt="">
<img src="logo.png" alt="ABC公司">
不建议 👎
<img src="chart.png">
<img src="important-graph.png" alt="图片">

媒体元素地图

图像地图必须有有效的名称和区域定义。

建议 👍
<img src="worldmap.png" alt="世界地图" usemap="#worldmap">
<map name="worldmap">
<area shape="rect" coords="0,0,100,100" href="/asia" alt="亚洲地区">
<area shape="circle" coords="150,150,50" href="/europe" alt="欧洲地区">
</map>
不建议 👎
<img src="worldmap.png" usemap="#worldmap">
<map name="worldmap">
<area shape="rect" coords="0,0,100,100" href="/asia">
</map>

9. 链接和引用

外部资源引用

CSS 和 JavaScript 文件引用不需要指定 type 属性,使用相对或绝对路径。

建议 👍
<link rel="stylesheet" href="styles/main.css">
<link rel="stylesheet" href="//cdn.example.com/bootstrap.css">
<script src="scripts/app.js"></script>
不建议 👎
<link rel="stylesheet" type="text/css" href="styles/main.css">
<script type="text/javascript" src="scripts/app.js"></script>

子资源完整性

对于来自 CDN 的外部资源,建议添加完整性验证。

建议 👍
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" 
integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
crossorigin="anonymous"></script>

10. 语义化和可访问性

ARIA 属性使用

适当使用 ARIA 属性增强可访问性,但不要滥用。

建议 👍
<button aria-expanded="false" aria-controls="menu" id="menu-button">
菜单
</button>
<ul id="menu" aria-labelledby="menu-button" hidden>
<li><a href="/home">首页</a></li>
<li><a href="/about">关于</a></li>
</ul>

<main role="main">
<article>
<h1>文章标题</h1>
<p>文章内容</p>
</article>
</main>
不建议 👎
<div role="button" onclick="openMenu()">菜单</div>
<div role="main">
<div role="article">
<div role="heading">文章标题</div>
<div>文章内容</div>
</div>
</div>

多主要内容处理

一个页面只能有一个 main 元素,除非其他 main 元素被隐藏。

建议 👍
<body>
<header><!-- 页头内容 --></header>
<main>
<h1>主要内容标题</h1>
<article>文章内容</article>
</main>
<footer><!-- 页脚内容 --></footer>
</body>
不建议 👎
<body>
<main>第一个主要内容区域</main>
<main>第二个主要内容区域</main>
</body>

11. ID 和引用完整性

唯一 ID 约束

确保页面中所有 ID 值唯一,被引用的 ID 必须存在。

建议 👍
<form>
<label for="email">邮箱:</label>
<input type="email" id="email" name="email">

<label for="password">密码:</label>
<input type="password" id="password" name="password">
</form>

<a href="#section1">跳转到第一节</a>
<section id="section1">
<h2>第一节内容</h2>
</section>
不建议 👎
<div id="content">内容区域1</div>
<div id="content">内容区域2</div> <!-- 重复ID -->

<a href="#nonexistent">跳转链接</a> <!-- 目标不存在 -->

12. 脚本和样式安全

内联脚本规范

避免在 HTML 中直接使用内联事件处理程序,优先使用外部 JavaScript。

建议 👍
<button id="submit-btn" class="btn-primary">提交</button>
<script src="scripts/form-handler.js"></script>
不建议 👎
<button onclick="submitForm()" class="btn-primary">提交</button>

13. 字符引用规范

HTML 实体使用

对于预留的 XML 字符和特殊字符,适当使用 HTML 实体。

建议 👍
<p>价格:&lt; 100元 &amp; 免费配送</p>
<p>版权所有 &copy; 2023 公司名称</p>
<p>使用破折号—无需HTML实体</p>
不建议 👎
<p>价格:< 100元 & 免费配送</p>
<p>版权所有 © 2023 公司名称</p>

14. 减少冗余标记

标记简化原则

尽可能避免不必要的父元素,保持 HTML 结构简洁。

建议 👍
<img class="avatar" src="user.jpg" alt="用户头像">
<h1 class="page-title">页面标题</h1>
不建议 👎
<span class="avatar">
<img src="user.jpg" alt="用户头像">
</span>
<div class="title-wrapper">
<h1>页面标题</h1>
</div>