规范的唯一判定方式是:保证正确性的同时,让人一看就是一个人写的~一致性。
HTML5:
展开说几点:
1. HTML5 DOCTYPE
<!DOCTYPE html>
2. 语言属性
2 <!-- ... -->
3 </html>
3. IE兼容模式
<meta>
标签来确定绘制当前页面所应该采用的 IE 版本。除非有强烈的特殊需求,否则最好是设置为 edge mode,从而通知 IE 采用其所支持的最新的模式。从IE8 出现文档兼容性。
浏览器模式(browser mode):用于切换IE针对该网页的默认文档模式、对不同版本浏览器的条件备注解析、发送给网站服务器的用户代理(User-Agent)字符串的值。网 站可以根据浏览器返回的不同用户代理字符串判断浏览器的版本和安装的功能,这样就可以向不同的浏览器返回不同的页面内容。
默认情况下,IE8的浏览器模式为IE8。用户可以通过单击地址栏旁边的兼容性视图按钮来手动切换到不同的浏览器模式。在IE8中,IE8兼容性视图会以IE7文档模式来显示网页,同时会向服务器发送IE7的用户代理字符串。
文档模式(document mode):用于指定IE的页面排版引擎(Trident)以哪个版本的方式来解析并渲染网页代码。切换文档模式会导致网页被刷新,但不会更改用户代理字 符串中的版本号,也不会从服务器重新下载网页。切换浏览器模式的同时,浏览器也会自动切换到相应的文档模式。
简而言之:浏览器模式的改变,能够改变请求中User Agent的值,让服务器获取后,能够按照UA的值进行对应处理(如果服务器上有这个处理功能)。而文档模式的改变只反映在本地的浏览器解析HTML上, 对客户端显示会有影响,而对服务器透明。同时,修改浏览器模式会影响文档模式,反之却不成立。
使用文档兼容性的方法比较容易,就是在我们要反馈给客户端的HTML代码中的head中添加一个meta元素,用来描述当前的文档需要使用何种浏览器版本来解释当前文档。
<
meta
http-equiv
=
"X-UA-Compatible"
content
=
"IE=EmulateIE7"
>
举几个例子:
IE=edge | 这个设置是让IE使用当前的最高版本进行文档的解析,官方文档指明,edge模式仅适用在测试环境,不建议在生产环境中使用 |
IE=7 | 使用标准IE7来处理 |
IE=EmulateIE7 | 模拟IE7来处理,遵循 <!DOCTYPE> 指令,如果文档有当前有一个合法的<!DOCTYPE>,就使用IE7模式,否者使用Quirks模式(Internet Explorer 5 Quirks),对于大部分网站来说,这是首选的兼容性模式 |
4. 字符编码
5. 引入js和css
type
属性,因为 text/css
和 text/javascript
分别是它们的默认值。6. 实用性
7. 布尔型
<label><input type=checkbox checked name=cheese disabled> Cheese</label>
<label><input type=checkbox checked=checked name=cheese disabled=disabled> Cheese</label>
<label><input type='checkbox' checked name=cheese disabled=""> Cheese</label>
8.减少标签数量:
<span class="avatar">
<img src="...">
</span>
<!-- Better -->
<img class="avatar" src="...">
CSS:
1. 声明顺序
相关的属性声明应当归为一组,并按照下面的顺序排列:
- Positioning
- Box model
- Typographic
- Visual
由于定位(positioning)可以从正常的文档流中移除元素,并且还能覆盖盒模型(box model)相关的样式,因此排在首位。盒模型排在第二位,因为它决定了组件的尺寸和位置。
其他属性只是影响组件的内部(inside)或者是不影响前两组属性,因此排在后面。
2 /* Positioning */
3 position: absolute;
4 top: 0;
5 right: 0;
6 bottom: 0;
7 left: 0;
8 z-index: 100;
9
10 /* Box-model */
11 display: block;
12 float: right;
13 width: 100px;
14 height: 100px;
15
16 /* Typography */
17 font: normal 13px "Helvetica Neue", sans-serif;
18 line-height: 1.5;
19 color: #333;
20 text-align: center;
21
22 /* Visual */
23 background-color: #f5f5f5;
24 border: 1px solid #e5e5e5;
25 border-radius: 3px;
26
27 /* Misc */
28 opacity: 1;
29 }
2. 不要使用@import
与 <link>
标签相比,@import
指令要慢很多,不光增加了额外的请求次数,还会导致不可预料的问题。替代办法有以下几种:
- 使用多个
<link>
元素 - 通过 Sass 或 Less 类似的 CSS 预处理器将多个 CSS 文件编译为一个文件
- 通过 Rails、Jekyll 或其他系统中提供过 CSS 文件合并功能
2 .element-avatar { ... }
3 .element-selected { ... }
4
5 @media (min- 480px) {
6 .element { ...}
7 .element-avatar { ... }
8 .element-selected { ... }
9 }
4. 带前缀的属性
2 .selector {
3 -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.15);
4 box-shadow: 0 1px 2px rgba(0,0,0,.15);
5 }
5. 单行规则声明
方便定位错误。
2 .span1 { width: 60px; }
3 .span2 { width: 140px; }
4 .span3 { width: 220px; }
5
6 /* Multiple declarations, one per line */
7 .sprite {
8 display: inline-block;
9 width: 16px;
10 height: 15px;
11 background-image: url(../img/sprite.png);
12 }
13 .icon { background-position: 0 0; }
14 .icon-home { background-position: 0 -20px; }
15 .icon-account { background-position: 0 -40px; }
引申:如何调试CSS,定位CSS中的报错?
6. 限制使用简写的属性声明
padding
margin
font
background
border
border-radius
过度使用简写形式的属性声明会导致代码混乱,并且会对属性值带来不必要的覆盖从而引起意外的副作用。
2 .element {
3 margin: 0 0 10px;
4 background: red;
5 background: url("image.jpg");
6 border-radius: 3px 3px 0 0;
7 }
8
9 /* Good example */
10 .element {
11 margin-bottom: 10px;
12 background-color: red;
13 background-image: url("image.jpg");
14 border-top-left-radius: 3px;
15 border-top-right-radius: 3px;
16 }
7. Less和Sass中的嵌套
2 .table > thead > tr > th { … }
3 .table > thead > tr > td { … }
4
5 // With nesting
6 .table > thead > tr {
7 > th { … }
8 > td { … }
9 }
8. class命名
- class 名称中只能出现小写字符和破折号(dashe)(不是下划线,也不是驼峰命名法)。破折号应当用于相关 class 的命名(类似于命名空间)(例如,
.btn
和.btn-danger
)。 - 避免过度任意的简写。
.btn
代表 button,但是.s
不能表达任何意思。 - class 名称应当尽可能短,并且意义明确。
- 使用有意义的名称。使用有组织的或目的明确的名称,不要使用表现形式(presentational)的名称。
- 基于最近的父 class 或基本(base) class 作为新 class 的前缀。
- 使用
.js-*
class 来标识行为(与样式相对),并且不要将这些 class 包含到 CSS 文件中。
2 .t { ... }
3 .red { ... }
4 .header { ... }
5
6 /* Good example */
7 .tweet { ... }
8 .important { ... }
9 .tweet-header { ... }
9. 选择器
- 对于通用元素使用 class ,这样利于渲染性能的优化。
- 对于经常出现的组件,避免使用属性选择器(例如,
[class^="..."]
)。浏览器的性能会受到这些因素的影响。 - 选择器要尽可能短,并且尽量限制组成选择器的元素个数,建议不要超过 3 。
- 只有在必要的时候才将 class 限制在最近的父元素内(也就是后代选择器)(例如,不使用带前缀的 class 时 -- 前缀类似于命名空间)。
2 span { ... }
3 .page-container #stream .stream-item .tweet .tweet-header .username { ... }
4 .avatar { ... }
5
6 /* Good example */
7 .avatar { ... }
8 .tweet-header .username { ... }
9 .tweet .avatar { ... }
10. 代码组织
- 以组件为单位组织代码段。
- 制定一致的注释规范。
- 使用一致的空白符将代码分隔成块,这样利于扫描较大的文档。
- 如果使用了多个 CSS 文件,将其按照组件而非页面的形式分拆,因为页面会被重组,而组件只会被移动。