HTML/CSS 
缩进 
每次缩进两个空格或者一个 Tab 制表符(一个 Tab 通过.editorconfig设置为 2 个空格)。
不要混合使用空格和Tab制表符。
::: codeStyle bad
<ul>
<li>Fantastic</li>
<li>Great</li>
</ul>
<style>
.example {
color: blue;
}
</style>:::
::: codeStyle good
<ul>
  <li>Fantastic</li>
  <li>Great</li>
</ul>
<style>
  .example {
    color: blue;
  }
</style>:::
大小写 
仅使用小写
HTML element 名称, 属性, 属性值 (除了 text/CDATA), CSS 选择器, 属性, 和属性值 (除了字符串).
::: codeStyle bad
<A HREF="/">Home</A>
<style>
  color: #E5E5E5;
</style>:::
::: codeStyle good
<a href="/">Home</a>
<style>
  color: #e5e5e5;
</style>:::
尾随空格 
删除不必要的空格
尾随空格是不必要的,并且会使差异复杂化。
::: codeStyle bad
<p>What? </p>:::
::: codeStyle good
<p>What?</p>:::
编码 
使用 UTF-8 编码
确保编辑器使用 UTF-8 作为字符编码,不使用字节顺序标记。
通过指定 HTML 模板和文档中的编码。不要指定样式表的编码,因为它们假设是 UTF-8。(关于编码以及何时以及如何指定它们的更多信息可以在处理 HTML 和 CSS 中的字符编码中找到。)
注释 
在必要的时候需要写注释,如: 逻辑复杂、结构复杂时候
TODO 
用 TODO 标记待办事项和行动项目。
只使用关键字 TODO 来突出显示 TODO,而不是其他常见的格式,如@@。
在括号中添加联系人(用户名或邮件列表),格式与 TODO(联系人)相同。
在冒号后添加操作项,如 TODO:操作项。
::: codeStyle good
<!-- TODO(songle): revisit centering -->
<center>Test</center>
<!-- TODO(songle): remove optional tags -->
<ul>
  <li>Apples</li>
  <li>Oranges</li>
</ul>:::
自闭合标签 
自闭合标签尾部加/
常见的自闭合标签: <meta />、<link />、<br />、<hr />、<img />、<input />
::: codeStyle bad
<br>
<hr>:::
::: codeStyle good
<br />
<hr />:::
语义化 
根据 HTML 的用途使用它。
将元素(有时被错误地称为“标签”)用于创建它们的目的。例如,使用 heading 元素作为标题,使用 p 元素作为段落,使用 a 元素作为锚,等等。
根据目的使用 HTML 对于可访问性、重用性和代码效率非常重要。
::: codeStyle bad
<div onclick="goToRecommendations();">All recommendations</div>:::
::: codeStyle good
<a href="recommendations/">All recommendations</a>:::
关注点分离 
分离结构、表示和行为。
严格地将结构(标记)、表示(样式)和行为(脚本)分开,并尽量将三者之间的交互保持在绝对最小。
也就是说,确保文档和模板只包含 HTML 和仅用于结构目的的 HTML。将所有表示的内容移到样式表中,将行为的内容移到脚本中。
此外,通过从文档和模板中链接尽可能少的样式表和脚本,使联系区域尽可能小。
从维护的角度来看,将结构、表示和行为分离非常重要。更改 HTML 文档和模板总是比更新样式表和脚本更昂贵。
::: codeStyle bad
<h1 style="font-size: 1em;">HTML sucks</h1>:::
::: codeStyle good
<h1 class="title">HTML sucks</h1>
<style>
  .title {
    font-size: 1em;
  }
</style>:::
HTML 引号 
当引用属性值时,使用双引号。
使用双引号("")而不是单引号(")包围属性值。
::: codeStyle bad
<a class='maia-button maia-button-secondary'>Sign in</a>:::
::: codeStyle good
<a class="maia-button maia-button-secondary">Sign in</a>:::
Class 与 ID 
class 应以功能或内容命名,不以表现形式命名
class 与 id 单词字母小写,多个单词组成时,采用中划线-分隔
使用唯一的 id 作为 Javascript hook, 同时避免创建无样式信息的 class
::: codeStyle bad
<div class="j-hook left contentWrapper"></div>
<div class="page_demo"></div>:::
::: codeStyle good
<div id="j-hook" class="sidebar content-wrapper"></div>
<div class="page-demo"></div>:::
属性顺序 
HTML 属性应该按照特定的顺序出现以保证易读性。
- id
- class
- name
- data-xxx
- src, for, type, href
- title, alt
- aria-xxx, role
- event
HTML 嵌套 
a标签不允许嵌套div这种约束属于语义嵌套约束,与之区别的约束还有严格嵌套约束,比如a不允许嵌套a。
严格嵌套约束在所有的浏览器下都不被允许,而语义嵌套约束,浏览器大多会容错处理,生成的文档树可能相互不太一样。
语义嵌套约束 
- <li>用于- <ul>或- <ol>下
- <dd>,- <dt>用于- <dl>下
- <thead>,- <tbody>,- <tfoot>,- <tr>,- <td>用于- <table>下
严格嵌套约束 
inline-Level 元素,仅可以包含文本或其它 inline-Level 元素
- <a>里不可以嵌套交互式元素- <a>、- <button>、- <select>等
- <p>里不可以嵌套块级元素- <div>、- <h1>~<h6>、- <p>、- <ul>/- <ol>/- <li>、- <dl>/- <dt>/- <dd>、- <form>等。
类型选择器 
避免使用类型选择器限定 ID 和类名。
除非必要(例如 helper 类),不要将元素名与 id 或类一起使用。
由于性能原因,避免不必要的祖先选择器是有用的。
::: codeStyle bad
ul#example {
}
div.error {
}:::
::: codeStyle good
#example {
}
.error {
}:::
简写属性 
尽可能使用简写属性。
CSS 提供了各种应尽可能使用的简写属性(如字体),即使在只有一个显式设置值的情况下也是如此。
使用简写属性有助于提高代码效率和易于理解。
::: codeStyle bad
.demo {
  border-top-style: none;
  font-family: palatino, georgia, serif;
  font-size: 100%;
  line-height: 1.6;
  padding-bottom: 2em;
  padding-left: 1em;
  padding-right: 1em;
  padding-top: 0;
}:::
::: codeStyle good
.demo {
  border-top: 0;
  font: 100%/1.6 palatino, georgia, serif;
  padding: 0 1em 2em;
}:::
0 的单位 
在“0”值之后省略单元说明,除非需要。
除非必要,否则不要在 0 值后使用单位。
::: codeStyle good
.demo {
  flex: 0px; /* This flex-basis component requires a unit. */
  flex: 1 1 0px; /* Not ambiguous without the unit, but needed in IE11. */
  margin: 0;
  padding: 0;
}:::
小数前边 0 
必须把 0 放在-1 和 1 之间的值或长度前面。
::: codeStyle bad
.demo {
  font-size: .8em;
}:::
::: codeStyle good
.demo {
  font-size: 0.8em;
}:::
十六进制计数法 
尽可能使用 6 个字符的十六进制表示法。不要使用 3 个字符
::: codeStyle bad
.demo {
  color: #ebc;
}:::
::: codeStyle good
.demo {
  color: #eebbcc;
}:::
CSS 属性声明顺序 
用字母表示声明。
将声明按字母顺序排列,以便以易于记忆和维护的方式实现代码的一致性。
为了排序,忽略特定于供应商的前缀。然而,对于特定的 CSS 属性,多个特定于供应商的前缀应该保持有序(例如-moz 前缀出现在-webkit 之前)。
::: codeStyle good
.demo {
  background: fuchsia;
  border: 1px solid;
  -moz-border-radius: 4px;
  -webkit-border-radius: 4px;
  border-radius: 4px;
  color: black;
  text-align: center;
  text-indent: 2em;
}:::
CSS 声明结束符 
在每个声明后面使用分号。
为了一致性和可扩展性,每个声明都用分号结尾。
::: codeStyle bad
.test {
  display: block;
  height: 100px
}:::
::: codeStyle good
.test {
  display: block;
  height: 100px;
}:::
CSS 属性名结束符 
在属性名的冒号后面使用空格。
为了保持一致性,property 和 value 之间总是使用一个空格(property 和冒号之间不使用空格)。
::: codeStyle bad
h3 {
  font-weight:bold;
  color :#ccccc;
}:::
::: codeStyle good
h3 {
  font-weight: bold;
  color: #ccccc;
}:::
CSS 声明块分离 
在最后一个选择器和声明块之间使用一个空格。
在最后一个选择器和声明块的开始大括号之间总是使用一个空格。
在给定的规则中,左大括号应该与最后一个选择器在同一行。
::: codeStyle bad
/*  missing space */
#video{
  margin-top: 1em;
}
/*  unnecessary line break */
#video
{
  margin-top: 1em;
}:::
::: codeStyle good
#video {
  margin-top: 1em;
}:::
选择器和声明分离 
用新行分隔选择器和声明。
总是为每个选择器和声明开始一个新行。
::: codeStyle bad
a:focus, a:active {
  position: relative; top: 1px;
}:::
::: codeStyle good
a:focus,
a:active {
  position: relative;
  top: 1px;
}
h1,
h2,
h3 {
  font-weight: normal;
  line-height: 1.2;
}:::
规则分离 
用新行分隔规则。
总是在规则之间放一个空行(两个换行符)。
::: codeStyle good
html {
  background: #fff;
}
body {
  margin: auto;
  width: 50%;
}:::
CSS 引号 
对属性选择器和属性值使用单引号(")而不是双引号("")。
不要在 URI 值(url())中使用引号。
例外情况:如果您确实需要使用@charset 规则,请使用双引号——单引号是不允许的。
::: codeStyle bad
@import url("https://www.google.com/css/maia.css");
html {
  font-family: "open sans", arial, sans-serif;
}:::
::: codeStyle good
@import url(https://www.google.com/css/maia.css);
html {
  font-family: 'open sans', arial, sans-serif;
}:::