|
|
# HTML代码规范
|
|
|
|
|
|
## 文档类型
|
|
|
使用 HTML5 的文档类型声明: <!DOCTYPE html>。建议使用 text/html 格式的 HTML。避免使用 XHTML。XHTML 以及它的属性,比如 application/xhtml+xml 在浏览器中的应用支持与优化空间都十分有限。
|
|
|
|
|
|
HTML 中最好不要将无内容元素的标签闭合,例如:使用 <br> 而非 <br />。
|
|
|
|
|
|
*ps:无内容元素标签包括:`area`,`base`, `br`, `col`, `command`, `embed`,` hr`, `img`, `input`, `keygen`, `link`, `meta`, `param`, `source`, `track`, `wbr`*
|
|
|
|
|
|
## 语义化
|
|
|
根据元素(有时被错误地称作“标签”)被创造出来时的初始意义来使用它。打个比方,用heading元素来定义头部标题,p元素来定义文字段落,用a元素来定义链接锚点,等等。
|
|
|
有根据有目的地使用 HTML 元素,对于可访问性、代码重用、代码效率来说意义重大。
|
|
|
|
|
|
//GOOD
|
|
|
<!-- The page header should go into a header element -->
|
|
|
<header>
|
|
|
<!-- As this title belongs to the page structure it's a heading and h1 should be used -->
|
|
|
<h1>My page title</h1>
|
|
|
</header>
|
|
|
|
|
|
<!-- All navigation should go into a nav element -->
|
|
|
<nav class="top-navigation">
|
|
|
<!-- A listing of elements should always go to UL (OL for ordered listings) -->
|
|
|
<ul>
|
|
|
<li class="nav-item"><a href="#home">Home</a></li>
|
|
|
<li class="nav-item"><a href="#news">News</a></li>
|
|
|
<li class="nav-item"><a href="#about">About</a></li>
|
|
|
</ul>
|
|
|
</nav>
|
|
|
|
|
|
<!-- The main part of the page should go into a main element (also use role="main" for accessibility) -->
|
|
|
<main class="news-page" role="main">
|
|
|
<!-- A section of a page should go into a section element. Divide a page into sections with semantic elements. -->
|
|
|
<section class="page-section news">
|
|
|
<!-- A section header should go into a section element -->
|
|
|
<header>
|
|
|
<!-- As a page section belongs to the page structure heading elements should be used (in this case h2) -->
|
|
|
<h2 class="title">All news articles</h2>
|
|
|
</header>
|
|
|
|
|
|
<!-- If a section / module can be seen as an article (news article, blog entry, products teaser, any other
|
|
|
re-usable module / section that can occur multiple times on a page) a article element should be used -->
|
|
|
<article class="news-article">
|
|
|
<!-- An article can contain a header that contains the summary / introduction information of the article -->
|
|
|
<header>
|
|
|
<!-- As a article title does not belong to the overall page structure there should not be any heading tag! -->
|
|
|
<div class="article-title">Good article</div>
|
|
|
<!-- Small can optionally be used to reduce importance -->
|
|
|
<small class="intro">Introduction sub-title</small>
|
|
|
</header>
|
|
|
|
|
|
<!-- For the main content in a section or article there is no semantic element -->
|
|
|
<div class="content">
|
|
|
<p>This is a good example for HTML semantics</p>
|
|
|
</div>
|
|
|
<!-- For content that is represented as side note or less important information in a given context use aside -->
|
|
|
<aside class="article-side-notes">
|
|
|
<p>I think I'm more on the side and should not receive the main credits</p>
|
|
|
</aside>
|
|
|
<!-- Articles can also contain footers. If you have footnotes for an article place them into a footer element -->
|
|
|
<footer class="article-foot-notes">
|
|
|
<!-- The time element can be used to annotate a timestamp. Use the datetime attribute to specify ISO time
|
|
|
while the actual text in the time element can also be more human readable / relative -->
|
|
|
<p>This article was created by David <time datetime="2014-01-01 00:00" class="time">1 month ago</time></p>
|
|
|
</footer>
|
|
|
</article>
|
|
|
|
|
|
<!-- In a section, footnotes or similar information can also go into a footer element -->
|
|
|
<footer class="section-footer">
|
|
|
<p>Related sections: Events, Public holidays</p>
|
|
|
</footer>
|
|
|
</section>
|
|
|
</main>
|
|
|
|
|
|
<!-- Your page footer should go into a global footer element -->
|
|
|
<footer class="page-footer">
|
|
|
Copyright 2014
|
|
|
</footer>
|
|
|
|
|
|
//BAD
|
|
|
<b>My page title</b>
|
|
|
<div class="top-navigation">
|
|
|
<div class="nav-item"><a href="#home">Home</a></div>
|
|
|
<div class="nav-item"><a href="#news">News</a></div>
|
|
|
<div class="nav-item"><a href="#about">About</a></div>
|
|
|
</div>
|
|
|
|
|
|
<div class="news-page">
|
|
|
<div class="page-section news">
|
|
|
<div class="title">All news articles</div>
|
|
|
<div class="news-article">
|
|
|
<h2>Bad article</h2>
|
|
|
<div class="intro">Introduction sub-title</div>
|
|
|
<div class="content">This is a very bad example for HTML semantics</div>
|
|
|
<div class="article-side-notes">I think I'm more on the side and should not receive the main credits</div>
|
|
|
<div class="article-foot-notes">
|
|
|
This article was created by David <div class="time">2014-01-01 00:00</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<div class="section-footer">
|
|
|
Related sections: Events, Public holidays
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<div class="page-footer">
|
|
|
Copyright 2014
|
|
|
</div>
|
|
|
|
|
|
## 多媒体回溯
|
|
|
对页面上的媒体而言,像图片、视频、canvas 动画等,要确保其有可替代的接入接口。图片文件我们可采用有意义的备选文本(alt),视频和音频文件我们可以为其加上说明文字或字幕。
|
|
|
|
|
|
//GOOD
|
|
|
<img src="luke-skywalker.jpg" alt="Luke skywalker riding an alien horse">
|
|
|
|
|
|
//BAD
|
|
|
<img src="luke-skywalker.jpg">
|
|
|
|
|
|
## 关注点分离
|
|
|
严格地保证**结构HTML**、**表现CSS**、**行为JS**三者分离。
|
|
|
|
|
|
清晰的分层意味着:
|
|
|
不使用超过一到两张样式表
|
|
|
不使用超过一到两个脚本(学会用合并脚本)
|
|
|
不使用行内样式
|
|
|
不在元素上使用 style 属性
|
|
|
不使用行内脚本
|
|
|
不使用表象元素(`b`, `u`, `center`, `font`, `b` ... )
|
|
|
不使用表象 class 名(i.e. red, left, center)
|
|
|
|
|
|
//GOOD
|
|
|
<!DOCTYPE html>
|
|
|
<html>
|
|
|
<head>
|
|
|
<!-- Concatinate your style sheets into a single one -->
|
|
|
<link rel="stylesheet" href="main.css">
|
|
|
</head>
|
|
|
<body>
|
|
|
<!-- Don't use style attributes but assign sensible classes and apply styles in the stylesheet -->
|
|
|
<h1 class="title"></h1>
|
|
|
<!-- Don't use presentational elements and assign sensible classes -->
|
|
|
<div class="sub-title">I'm a subtitle and I'm bold!</div>
|
|
|
<!-- Maybe your comments get centered in your presentation but that decision is up to the stylesheet -->
|
|
|
<span class="comment">Dare you center me!</span>
|
|
|
<!-- You wanted to make it red because it's important so then also name the class important and decide in the stylesheet
|
|
|
what you want to do with it -->
|
|
|
<div class="important">I'm important!</div>
|
|
|
|
|
|
<!-- Put all your scripts into files and concatinate them into a single one -->
|
|
|
<script async src="main.js"></script>
|
|
|
</body>
|
|
|
</html>
|
|
|
|
|
|
|
|
|
//BAD
|
|
|
<!DOCTYPE html>
|
|
|
<html>
|
|
|
<head>
|
|
|
<link rel="stylesheet" href="base.css">
|
|
|
<link rel="stylesheet" href="grid.css">
|
|
|
<link rel="stylesheet" href="type.css">
|
|
|
<link rel="stylesheet" href="modules/teaser.css">
|
|
|
</head>
|
|
|
<body>
|
|
|
<h1 style="font-size: 3rem"></h1>
|
|
|
<b>I'm a subtitle and I'm bold!</b>
|
|
|
<center>Dare you center me!</center>
|
|
|
<script>
|
|
|
alert('Just dont...');
|
|
|
</script>
|
|
|
<div class="red">I'm important!</div>
|
|
|
</body>
|
|
|
</html>
|
|
|
|
|
|
## HTML 内容至上
|
|
|
不要让非内容信息污染了你的HTML。HTML就应该只关注内容,HTML标签的目的,就是为了不断地展示内容信息。
|
|
|
|
|
|
* 不要引入一些特定的 HTML 结构来解决一些视觉设计问题
|
|
|
* 不要将 img 元素当做专门用来做视觉设计的元素
|
|
|
## HTML 引号
|
|
|
使用双引号(" ") 而不是单引号(' ') 。
|
|
|
|
|
|
//GOOD
|
|
|
<!-- That's clean markup! -->
|
|
|
<span class="text-box">
|
|
|
See the square next to me?
|
|
|
</span>
|
|
|
## 标签闭合
|
|
|
在自动闭合标签后不要使用斜线`/`。
|
|
|
|
|
|
/* We use a :before pseudo element to solve the design problem of placing a colored square in front of the text content */
|
|
|
.text-box:before {
|
|
|
content: "";
|
|
|
display: inline-block;
|
|
|
width: 1rem;
|
|
|
height: 1rem;
|
|
|
background-color: red;
|
|
|
}
|
|
|
## 属性顺序
|
|
|
HTML属性应该按照特定顺序出现在标签内
|
|
|
|
|
|
//BAD
|
|
|
<!-- We should not introduce an additional element just to solve a design problem -->
|
|
|
<span class="text-box">
|
|
|
<span class="square"></span>
|
|
|
See the square next to me?
|
|
|
</span>
|
|
|
* id
|
|
|
* class
|
|
|
* name
|
|
|
* data-
|
|
|
* src, for, type, href
|
|
|
* title, alt
|
|
|
* aria-*, role
|
|
|
|
|
|
.text-box > .square {
|
|
|
display: inline-block;
|
|
|
width: 1rem;
|
|
|
height: 1rem;
|
|
|
background-color: red;
|
|
|
}
|
|
|
## boolean属性
|
|
|
不需要为boolean属性添加取值,存在表示true,不存在则表示false。比如:selected,disabled等。
|
|
|
|
|
|
图片和SVG能被引入到HTML中的唯一理由是它们呈现出了与内容相关的一些信息。
|
|
|
## 减少不必要的标签嵌套
|
|
|
|
|
|
//GOOD
|
|
|
<!-- That's clean markup! -->
|
|
|
<span class="text-box">
|
|
|
See the square next to me?
|
|
|
</span>
|
|
|
|
|
|
/* We use a :before pseudo element with a background image to solve the problem */
|
|
|
.text-box:before {
|
|
|
content: "";
|
|
|
display: inline-block;
|
|
|
width: 1rem;
|
|
|
height: 1rem;
|
|
|
background: url(square.svg) no-repeat;
|
|
|
background-size: 100%;
|
|
|
}
|
|
|
<img class="avatar" src="..." alt="...">
|
|
|
|
|
|
//BAD
|
|
|
<!-- Content images should never be used for design elements! -->
|
|
|
<span class="text-box">
|
|
|
<img src="square.svg" alt="Square" />
|
|
|
See the square next to me?
|
|
|
<span class="avatar">
|
|
|
<img src="..." alt="...">
|
|
|
</span>
|
|
|
|
|
|
## type属性
|
|
|
省略样式表与脚本上的type属性。鉴于HTML5中以上两者默认的type值就是text/css和text/javascript,所以type属性一般是可以忽略掉的。甚至在老旧版本的浏览器中这么做也是安全可靠的。
|
|
|
|
|
|
//GOOD
|
|
|
<link rel="stylesheet" href="main.css">
|
|
|
<script src="main.js"></script>
|
|
|
|
|
|
//BAD
|
|
|
<link rel="stylesheet" href="main.css" type="text/css">
|
|
|
<script src="main.js" type="text/javascript"></script>
|
|
|
|
|
|
## 格式化规则
|
|
|
在每一个块状元素,列表元素和表格元素后,加上一新空白行,并对其子孙元素进行缩进。内联元素写在一行内,块状元素还有列表和表格要另起一行。
|
|
|
|
|
|
//GOOD
|
|
|
<blockquote>
|
|
|
<p><em>Space</em>, the final frontier.</p>
|
|
|
</blockquote>
|
|
|
|
|
|
<ul>
|
|
|
<li>Moe</li>
|
|
|
<li>Larry</li>
|
|
|
<li>Curly</li>
|
|
|
</ul>
|
|
|
|
|
|
<table>
|
|
|
<thead>
|
|
|
<tr>
|
|
|
<th scope="col">Income</th>
|
|
|
<th scope="col">Taxes</th>
|
|
|
</tr>
|
|
|
</thead>
|
|
|
<tbody>
|
|
|
<tr>
|
|
|
<td>$ 5.00</td>
|
|
|
<td>$ 4.50</td>
|
|
|
</tr>
|
|
|
</tbody>
|
|
|
</table>
|
|
|
|
|
|
## HTML 引号
|
|
|
使用双引号(" ") 而不是单引号(' ') 。
|
|
|
## class和id命名
|
|
|
* 保持小写以及中划线`-`分隔
|
|
|
* 命名简短但是也要明确指示角色和意图
|
|
|
* 必要时可以使用父节点的class作为前缀
|
|
|
|
|
|
|
|
|
[参考](http://www.css88.com/archives/5364) |
|
|
\ No newline at end of file |
|
|
[参考资料1](http://alloyteam.github.io/code-guide/#html)
|
|
|
[参考资料2](http://www.css88.com/archives/5364) |
|
|
\ No newline at end of file |
...
|
...
|
|