HTML5编码规范
google的HTML5编码规范
General Style Rules
- 协议protocol
省略图片、样式、脚本以及其他媒体文件 URL 的协议部分(http:,https:),除非文件在两种协议下都不可用。这种方案称为 protocol-relative URL,好处是无论你是使用 HTTPS 还是 HTTP 访问页面,浏览器都会以相同的协议请求页面中的资源,同时可以节省一部分字节。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- Not recommended -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<!-- Recommended -->
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<!-- Not recommended -->
.example {
background: url(https://www.google.com/images/example);
}
<!-- Recommended -->
.example {
background: url(//www.google.com/images/example);
}
General Formatting Rules
- Indentation
Indent by 2 spaces at a time.
Don’t use tabs or mix tabs and spaces for indentation.
1
2
3
4
<ul>
<li>Fantastic
<li>Great
</ul>
.example {
color: blue;
}
[建议] 每行不得超过 120 个字符
疑问,使用 4 个空格做为一个缩进层级真的是错误的???
- Capitalization
Use only lowercase.
[强制] 以下都应该用小写:HTML 元素名称,属性,属性值(除非 text/CDATA),CSS 选择器,属性,属性值。
[强制] class 必须单词全字母小写,单词间以 - 分隔
[强制] 同一页面,应避免使用相同的 name 与 id
1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- Not recommended -->
<A HREF="/">Home</A>
<table cellSpacing="0">...</table>
<!-- Recommended -->
<img src="google.png" alt="Google">
<table cellspacing="0">...</table>
/* Not recommended */
color: #E5E5E5;
/* Recommended */
color: #e5e5e5;
- 结尾空格-Trailing Whitespace
Remove trailing white spaces.
1
2
3
4
<!-- Not recommended -->
<p>What?_
<!-- Recommended -->
<p>Yes please.
General Meta Rules
- Encoding
Use UTF-8 (no BOM).
在 HTML 中通过 指定编码方式,CSS 中不需要指定,因为默认是 UTF-8。
[强制] 页面必须使用精简形式,明确指定字符编码。指定字符编码的 meta 必须是 head 的第一个直接子元素。
- lang
[建议] 在 html 标签上设置正确的 lang 属性
有助于提高页面的可访问性,如:让语音合成工具确定其所应该采用的发音,令翻译工具确定其翻译语言等。
1
2
<html lang="en">
<html lang="zh-CN">
- meta IE
[建议] 启用 IE Edge 模式
1
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
更多定义文档兼容性参考
https://msdn.microsoft.com/zh-cn/library/cc288325(v=vs.85).aspx
- 注释-Comments
使用注释来解释代码:包含的模块,功能以及优点。
- 任务项-Action Items
Highlight todos by using the keyword TODO only, not other common formats like @@.
1
2
3
4
5
6
7
8
{# TODO(john.doe): revisit centering #}
<center>Test</center>
<!-- TODO: remove optional tags -->
<ul>
<li>Apples</li>
<li>Oranges</li>
</ul>
HTML Style Rules
- Document Type
[强制]Use HTML5.
HTML5 (HTML syntax) is preferred for all HTML documents: <!DOCTYPE html>.
- HTML Validity
尽可能使用正确的 HTML
1
2
3
4
5
6
7
8
9
<!-- Not recommended -->
<title>Test</title>
<article>This is only a test.
<!-- Recommended -->
<!DOCTYPE html>
<meta charset="utf-8">
<title>Test</title>
<article>This is only a test.</article>
- Semantics
根据使用场景选择正确的 HTML 元素(有时被错误的称为“标签”)。例如,使用 h1 元素创建标题,p 元素创建段落,a 元素创建链接等等。正确的使用 HTML 元素对于可访问性、可重用性以及编码效率都很重要。
1
2
3
4
5
<!-- Not recommended -->
<div onclick="goToRecommendations();">All recommendations</div>
<!-- Recommended -->
<a href="recommendations/">All recommendations</a>
- 孤立标签void elements
[强制] 对 HTML5 中规定允许省略的闭合标签,不允许省略闭合标签
最知名的空元素是:
1
<meta> <link> <br> <hr> <img> <input>
鲜为人知的是:
1
<area> <base> <col> <command> <embed> <keygen> <param> <source> <track> <wbr>
[强制] 对于无需自闭合的标签,不允许自闭合
1
2
3
4
5
<!-- good -->
<input type="text" name="title">
<!-- bad -->
<input type="text" name="title" />
更多空标签
http://ourjs.com/detail/531b2ce89144f4934f00000b
- can omit endtag
可以省略结束标记的元素:
1
li、dt、dd、p、rt、rp、optgroup、option、colgroup、thead、tbody、tfoot、tr、td、th
1
2
3
4
5
6
7
8
9
10
11
<!-- good -->
<ul>
<li>first</li>
<li>second</li>
</ul>
<!-- bad -->
<ul>
<li>first
<li>second
</ul>
- can omit alltag
可以省略全部标记的元素有
1
html、head、body、colgroup、tbody
- Multimedia Fallback
多媒体元素降级
对于像图片、视频、canvas 动画等多媒体元素,确保提供其他可访问的内容。图片可以使用替代文本(alt),视频和音频可以使用文字版本。
1
2
3
4
5
<!-- Not recommended -->
<img src="spreadsheet.png">
<!-- Recommended -->
<img src="spreadsheet.png" alt="Spreadsheet screenshot.">
- Separation of Concerns
关注分离
标记、样式和脚本分离,确保相互耦合最小化。
- Entity References
实体引用
如果团队中文件和编辑器使用同样的编码方式,就没必要使用实体引用,如 —, ”,☺,除了一些在 HTML 中有特殊含义的字符(如 < 和 &)以及不可见的字符(如空格)。
1
2
3
4
5
<!-- Not recommended -->
The currency symbol for the Euro is “&eur;”.
<!-- Recommended -->
The currency symbol for the Euro is “€”.
- type Attributes
[建议] 在引用样式表和脚本时,不要指定 type 属性,除非不是 CSS 或 JavaScript。因为 HTML5 中已经默认指定样式变的 type 是 text/css,脚本的type 是 text/javascript。
[强制] 引入 CSS 时必须指明 rel=”stylesheet”
1
2
3
4
5
6
7
8
9
10
11
<!-- Not recommended -->
<link rel="stylesheet" href="//www.google.com/css/maia.css" type="text/css">
<!-- Recommended -->
<link rel="stylesheet" href="//www.google.com/css/maia.css">
<!-- Not recommended -->
<script src="//www.google.com/js/gweb/analytics/autotrack.js" type="text/javascript"></script>
<!-- Recommended -->
<script src="//www.google.com/js/gweb/analytics/autotrack.js"></script>
[建议] 在 head 中引入页面需要的所有 CSS 资源。
在页面渲染的过程中,新的CSS可能导致元素的样式重新计算和绘制,页面闪烁。
[建议] JavaScript 应当放在页面末尾,或采用异步加载。
将 script 放在页面中间将阻断页面的渲染。出于性能方面的考虑,如非必要,请遵守此条建议。
HTML Formatting Rules
- HTML Quotation Marks
属性值用双引号【强制】
1
2
3
4
5
6
7
8
<!-- Not recommended -->
<a class='maia-button maia-button-secondary'>Sign in</a>
<script src='esl.js'></script>
<script src=esl.js></script>
<!-- Recommended -->
<a class="maia-button maia-button-secondary">Sign in</a>
<script src="esl.js"></script>
思考
URL()中有用引号的必要吗?
/* Example #1: */ background-image: url(image.png);
/* Example #2: */ background-image: url("image.png");
/* Example #3: */ background-image: url('image.png');
解决方案1:
最好是加上。html标签的属性也同理。
解决方案2:
最好还是加上引号
解决方案3:
我个人一直不加,但是firebug里显示加上引号的,so,不知道哪个效率更高一点
解决方案4:
vs写asp.net加了会报错
解决方案5:
w3c下 加不加无所谓~
解决方案6:
如果路径里面有空格,老IE是认不出来的,所以我一般都加上,单引号。
解决方案7:
从安全角度来讲是要加上的…
否则容易被xss
因为”“意味着是字符串…但是不加引号的话..传过来的万一是);url(“http://www.xss.xss”) 就把cookie什么的可能泄露出去了…
CSS3推荐不要在url()里对引用资源加引号
HTML属性顺序推荐写法
- class
- id, name
- data-*
- src, for, type, href
- title, alt
- aria-*, role
class 用于标识高度可复用组件,因此应该排在首位。id 用于标识具体组件,应当谨慎使用(例如,页面内的书签),因此排在第二位
1
2
3
4
5
6
7
<a class="..." id="..." data-modal="toggle" href="#">
Example link
</a>
<input class="form-control" type="text">
<img src="..." alt="...">
- General Formatting
为每个块级元素或表格元素标签新起一行,并且对每个子元素进行缩进
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<blockquote>
<p><em>Space</em>, the final frontier.</p>
</blockquote>
<ul>
<li>Moe
<li>Larry
<li>Curly
</ul>
<table>
<thead>
<tr>
<th scope="col">Income
<th scope="col">Taxes
<tbody>
<tr>
<td>$ 5.00
<td>$ 4.50
</table>
优化标签。有些标签是不需要用到的,能少就少。哪些标签是必须的,哪些又是多余的。
更多可以省略的标签
https://html.spec.whatwg.org/multipage/syntax.html#syntax-tag-omission
- boolean Attributes
布尔(boolean)型属性
布尔型属性可以在声明时不赋值。XHTML 规范要求为其赋值,但是 HTML5 规范不需要。
1
2
3
4
5
6
7
8
9
10
<!-- Not recommended -->
<input type="text" readonly="readonly" />
<input type="text" disabled="disabled" />
<!-- Recommended -->
<input type="text" disabled>
<input type="checkbox" value="1" checked>
<select>
<option value="1" selected>1</option>
</select>
Elements Semantics
结构性元素
- p 表示段落. 只能包含内联元素, 不能包含块级元素;
- div 本身无特殊含义, 可用于布局. 几乎可以包含任何元素;
- br 表示换行符;
- hr 表示水平分割线;
- h1-h6 表示标题. 其中 h1 用于表示当前页面最重要的内容的标题;
- blockquote 表示引用, 可以包含多个段落. 请勿纯粹为了缩进而使用 blockquote, 大部分浏览器默认将 blockquote 渲染为带有左右缩进;
- pre 表示一段格式化好的文本;
[强制] 标签使用必须符合标签嵌套规则。
HTML5: 嵌套规则
- 不推荐inline元素包含block元素;
- 不允许交叉嵌套;
- 不允许非法的子元素嵌套
头部元素
- title 每个页面必须有且仅有一个 title 元素;–[强制]
- base 可用场景:首页、频道等大部分链接都为新窗口打开的页面;
- link用于引入 css 资源时, 可省去 media(默认为all) 和 type(默认为text/css) 属性;–[强制] 引入 CSS 时必须指明 rel=”stylesheet”
- style type 默认为 text/css, 可以省去;
- script type 属性可以省去; 不赞成使用lang属性; 不要使用古老的<!– //–>这种hack脚本, 它用于阻止第一代浏览器(Netscape 1和Mosaic)将脚本显示成文字;
- noscript 在用户代理不支持 JavaScript 的情况下提供说明;
文本元素
- a a 存在 href 属性时表示链接, 无 href 属性但有 name 属性表示锚点;
- em,strong em 表示句意强调, 加与不加会引起语义变化, 可用于表示不同的心情或语调; strong 表示重要性强调, 可用于局部或全局, strong强调的是重要性, 不会改变句意;
- abbr 表示缩写;
- sub,sup 主要用于数学和化学公式, sup还可用于脚注;
- span 本身无特殊含义;
- ins,del 分别表示从文档中增加(插入)和删除
媒体元素
img 请勿将img元素作为定位布局的工具, 不要用他显示空白图片; 给img元素增加alt属性;
[强制] 禁止 img 的 src 取值为空。延迟加载的图片也要增加默认的 src。
src 取值为空,会导致部分浏览器重新加载一次当前页面
[建议] 为重要图片添加 alt 属性。
可以提高图片加载失败时的用户体验。
[建议] 避免为 img 添加不必要的 title 属性。
多余的 title 影响看图体验,并且增加了页面尺寸
[建议] 添加 width 和 height 属性,以避免页面抖动。
[建议] 有下载需求的图片采用 img 标签实现,无下载需求的图片采用 CSS 背景图实现。
1,产品 logo、用户头像、用户产生的图片等有潜在下载需求的图片,以 img 形式实现,能方便用户下载。
2,无下载需求的图片,比如:icon、背景、代码使用的图片等,尽可能采用 css 背景图实现。
object 可以用来插入Flash;
列表元素
- dl 表示关联列表, dd是对dt的解释; dt和dd的对应关系比较随意: 一个dt对应多个dd、多个dt对应一个dd、多个dt对应多个dd, 都合法; 可用于名词/单词解释、日程列表、站点目录;
- ul 表示无序列表;
- ol 表示有序列表, 可用于排行榜等;
- li 表示列表项, 必须是ul/ol的子元素;
表单元素
- 推荐使用 button 代替 input, 但必须声明 type;
- 推荐使用 fieldset, legend 组织表单
- 表单元素的 name 不能设定为 action, enctype, method, novalidate, target, submit 会导致表单提交混乱
form
[强制] 有文本标题的控件必须使用 label 标签将其与其标题相关联。
有两种方式:
1,将控件置于 label 内。
2,label 的 for 属性指向控件的 id。
推荐使用第一种,减少不必要的 id。如果 DOM 结构不允许直接嵌套,则应使用第二种。
示例:
1
2
3
<label><input type="checkbox" name="confirm" value="on"> 我已确认上述条款</label>
<label for="username">用户名:</label> <input type="textbox" name="username" id="username">
button
[强制] 使用 button 元素时必须指明 type 属性值。
button 元素的默认 type 为 submit,如果被置于 form 元素中,点击后将导致表单提交。为显示区分其作用方便理解,必须给出 type 属性。
示例:
1
2
<button type="submit">提交</button>
<button type="button">取消</button>
[建议] 尽量不要使用按钮类元素的 name 属性。
由于浏览器兼容性问题,使用按钮的 name 属性会带来许多难以发现的问题。详见http://w3help.org/zh-cn/causes/CM2001
文档模板
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>Sample page</title>
<link rel="stylesheet" href="css_example_url" />
</head>
<body>
<div id="page">
<div id="header">
页头
</div>
<div id="content">
主体
</div>
<div id="footer">
页尾
</div>
</div>
<script src="js_example_url"></script>
<script>
// 你的代码
</script>
</body>
</html>