【前端技术文档】HTML编码规范

整    理:晋哲、徐秀

时    间:2015-10-15

说    明:HTML编码规范


----- 目录 -----

1 前言

2 代码风格

    2.1 缩进与换行

    2.2 命名

    2.3 标签

    2.4 属性

3 通用

    3.1 DOCTYPE

    3.2 编码

    3.3 CSS和JavaScript引入

4 head

    4.1 title

    4.2 favicon(网页icon图标)

    4.3 viewport

5 图片

6 表单

    6.1 控件标题

    6.2 按钮

    6.3 可访问性 (A11Y)

7 多媒体


----- 正文 -----

1 前言

HTML作为描述网页结构的超文本标记语言,本文档的目标是使HTML代码风格保持一致,容易被理解和被维护。


2 代码风格


2.1 缩进与换行


[强制] 设置 4 个空格做为一个缩进层级,不允许使用 2 个空格 或 tab 字符与空格的混合。


[建议] 使用编辑器换行自动缩进,避免手动输入空格,不得不手动缩进时按Tab键。

示例:

<ul>

    <li>first</li>

    <li>second</li>

</ul>


[建议] 每行不得超过 120 个字符。

解释:
过长的代码不容易阅读与维护。但是考虑到 HTML 的特殊性,不做硬性要求。


2.2 命名


[强制] class 必须单词全字母小写,单词间以 - 分隔。


[强制] class 必须代表相应模块或部件的内容或功能,不得以样式信息进行命名。

示例:

<!-- good -->

<div class="sidebar"></div>

<!-- bad -->

<div class="left"></div>


[强制] 元素 id 必须保证页面唯一。

解释:
同一个页面中,不同的元素包含相同的 id,不符合 id 的属性含义。并且使用 document.getElementById 时可能导致难以追查的问题。


[建议] id 必须单词全字母小写,多个单词使用“下划线”连接。同项目必须保持风格一致,方便后端人员阅读。


[建议] id、class 命名,在避免冲突并描述清楚的前提下尽可能短。

示例:

<!-- good -->

<div id="nav"></div>

<!-- bad -->

<div id="navigation"></div>


<!-- good -->

<p class="comment"></p>

<!-- bad -->

<p class="com"></p>


<!-- good -->

<span class="author"></span>

<!-- bad -->

<span class="red"></span>


[强制] 禁止为了 hook 脚本,创建无样式信息的 class。

解释:
不允许 class 只用于让 JavaScript 选择某些元素,class 应该具有明确的语义和样式。否则容易导致 css class 泛滥。

使用 id、属性选择作为 hook 是更好的方式。


[强制] 同一页面,应避免使用相同的 name 与 id。

解释:
IE 浏览器会混淆元素的 id 和 name 属性, document.getElementById 可能获得不期望的元素。所以在对元素的 id 与 name 属性的命名需要非常小心。

一个比较好的实践是,为 id 和 name 使用不同的命名法。

示例:

<input name="foo">

<div id="foo"></div>

<script>

// IE6 将显示 INPUT

alert(document.getElementById('foo').tagName);

</script>


2.3 标签


[强制] 标签名必须使用小写字母。
示例:

<!-- good -->

<p>Hello StyleGuide!</p>

<!-- bad -->

<P>Hello StyleGuide!</P>


[强制] 所有标签必须闭合。

每个标签都要有开始和结束,非成对标记必须以“/>”结尾,且“/”前必须有一个空格,如<img />、<input />、<br />等

解释:
常见自闭合标签有input、img、br、hr等。
虽然有些标记没有要求必须关闭,但是为了避免出错的几率,要求必须全部关闭,省去判断某标记是否需要关闭的时间


[强制] 对 HTML5 中规定允许省略的闭合标签,不允许省略闭合标签。

解释:
对代码体积要求非常严苛的场景,可以例外。比如:第三方页面使用的投放系统。

示例:

<!-- good -->

<ul>

    <li>first</li>

    <li>second</li>

</ul>


<!-- bad -->

<ul>

    <li>first

    <li>second

</ul>


[强制] 标签使用必须符合标签嵌套规则。

解释:

内联元素不能嵌套块元素。比如 div 不得置于 p 中,tbody 必须置于 table 中。

详细的标签嵌套规则参见HTML DTD中的 Elements 定义部分。


[建议] HTML 标签的使用应该遵循标签的语义。

解释:

下面是常见标签语义

p - 段落

h1,h2,h3,h4,h5,h6 - 层级标题

strong,em - 强调

ins - 插入

del - 删除

abbr - 缩写

code - 代码标识

cite - 引述来源作品的标题

q - 引用

blockquote - 一段或长篇引用

ul - 无序列表

ol - 有序列表

dl,dt,dd - 定义列表

示例:

<!-- good -->

<p>Esprima serves as an important <strong>building block</strong> for some JavaScript language tools.</p>


<!-- bad -->

<div>Esprima serves as an important <span class="strong">building block</span> for some JavaScript language tools.</div>


[建议] 在 CSS 可以实现相同需求的情况下不得使用表格进行布局。

解释:
在兼容性允许的情况下应尽量保持语义正确性。对网格对齐和拉伸性有严格要求的场景允许例外,如多列复杂表单。


[建议] 标签的使用应尽量简洁,减少不必要的标签。

示例:

<!-- good -->

<img class="avatar" src="image.png">

<!-- bad -->

<span class="avatar">

    <img src="image.png">

</span>


2.4 属性


[强制] 属性名必须使用小写字母。

示例:

<!-- good -->

<table cellspacing="0">...</table>


<!-- bad -->

<table cellSpacing="0">...</table>


[强制] 属性值必须用双引号包围。

解释:
不允许使用单引号,不允许不使用引号。

示例:

<!-- good -->

<script src="esl.js"></script>


<!-- bad -->

<script src='esl.js'></script>

<script src=esl.js></script>


[建议] 布尔类型的属性,建议不添加属性值。

示例:

<input type="text" disabled>

<input type="checkbox" value="1" checked>


[建议] 自定义属性建议以 xxx- 为前缀,推荐使用 data-。

解释:
使用前缀有助于区分自定义属性和标准定义的属性。

示例:

<ol data-ui-type="Select"></ol>


3 通用


3.1 DOCTYPE


[强制] 使用 HTML5 的 doctype 来启用标准模式,建议使用大写的 DOCTYPE。

示例:

<!DOCTYPE html>


[建议] 启用 IE Edge 模式。

示例:

<meta http-equiv="X-UA-Compatible" content="IE=Edge">


[建议] 在 html 标签上设置正确的 lang 属性。

解释:
有助于提高页面的可访问性,如:让语音合成工具确定其所应该采用的发音,令翻译工具确定其翻译语言等。

示例:

<html lang="zh-CN">


3.2 编码


[强制] 页面必须使用精简形式,明确指定字符编码。指定字符编码的 meta 必须是 head 的第一个直接子元素。

解释:
见《HTML5 Charset能用吗》一文。

示例:

<html>

<head>

    <meta charset="UTF-8">

    ......

</head>

<body>

    ......

</body>

</html>


[建议] HTML 文件使用无 BOM 的 UTF-8 编码。

解释:
UTF-8 编码具有更广泛的适应性。BOM 在使用程序或工具处理文件时可能造成不必要的干扰。


3.3 CSSJavaScript引入


[强制] 引入 CSS 时必须指明 rel="stylesheet"。

示例:

<link rel="stylesheet" src="page.css">


[建议] 引入 CSS 和 JavaScript 时无须指明 type 属性。

解释:
text/css 和 text/javascript 是 type 的默认值。


[建议] 展现定义放置于外部 CSS 中,行为定义放置于外部 JavaScript 中。

解释:
结构-样式-行为的代码分离,对于提高代码的可阅读性和维护性都有好处。

[建议] 在 head 中引入页面需要的所有 CSS 资源。

解释:
在页面渲染的过程中,新的CSS可能导致元素的样式重新计算和绘制,页面闪烁。


[建议] JavaScript 应当放在页面末尾(</body>标签之前),或采用异步加载。

解释:
将 script 放在页面中间将阻断页面的渲染。出于性能方面的考虑,如非必要,请遵守此条建议。

示例:

<body>

<!-- a lot of elements -->

<script src="init-behavior.js"></script>

</body>


[建议] 移动环境或只针对现代浏览器设计的 Web 应用,如果引用外部资源的 URL 协议部分与页面相同,建议省略协议前缀。

解释:
使用 protocol-relative URL 引入 CSS,在 IE7/8 下,会发两次请求。是否使用 protocol-relative URL 应充分考虑页面针对的环境。

示例:

<script src="//s1.bdstatic.com/cache/static/jquery-1.10.2.min_f2fb5194.js"></script>


4 head


4.1 title


[强制] 页面必须包含 title 标签声明标题。


[强制] title 必须作为 head 的直接子元素,并紧随 charset 声明之后。

解释:
title 中如果包含 ascii 之外的字符,浏览器需要知道字符编码类型才能进行解码,否则可能导致乱码。

示例:

<head>

    <meta charset="UTF-8">

    <title>页面标题</title>

</head>


4.2 favicon(网页icon图标)


[强制] 保证 favicon 可访问。

解释:
在未指定 favicon 时,大多数浏览器会请求 Web Server 根目录下的 favicon.ico 。为了保证favicon可访问,避免404,必须遵循以下两种方法之一:

在 Web Server 根目录放置 favicon.ico 文件。

使用 link 指定 favicon。

示例:

<link rel="shortcut icon" href="path/to/favicon.ico">


4.3 viewport


[建议] 若页面欲对移动设备友好,需指定页面的 viewport。

解释:
viewport meta tag可以设置可视区域的宽度和初始缩放大小,避免在移动设备上出现页面展示不正常。

比如,在页面宽度小于 980px 时,若需 iOS 设备友好,应当设置 viewport 的 width 值来适应你的页面宽度。同时因为不同移动设备分辨率不同,在设置时,应当使用 device-width 和 device-height 变量。

另外,为了使 viewport 正常工作,在页面内容样式布局设计上也要做相应调整,如避免绝对定位等。关于 viewport 的更多介绍,可以参见 Safari Web Content Guide的介绍


5 图片


[强制] 禁止 img 的 src 取值为空。延迟加载的图片也要增加默认的 src。

解释:
src 取值为空,会导致部分浏览器重新加载一次当前页面,参考:https://developer.yahoo.com/performance/rules.html#emptysrc

[建议] 避免为 img 添加不必要的 title 属性。

解释:
多余的 title 影响看图体验,并且增加了页面尺寸。


[建议] 为重要图片添加 alt 属性。

解释:
可以提高图片加载失败时的用户体验。


[建议] 添加 width 和 height 属性,以避免页面抖动。


[建议] 有下载需求的图片采用 img 标签实现,无下载需求的图片采用 CSS 背景图实现。

解释:
产品 logo、用户头像、用户产生的图片等有潜在下载需求的图片,以 img 形式实现,能方便用户下载。

无下载需求的图片,比如:icon、背景、代码使用的图片等,尽可能采用 css 背景图实现。


6 表单


6.1 控件标题


[强制] 有文本标题的控件必须使用 label 标签将其与其标题相关联。

解释:

有两种方式:

1、将控件置于 label 内。

2、label 的 for 属性指向控件的 id。

推荐使用第一种,减少不必要的 id。如果 DOM 结构不允许直接嵌套,则应使用第二种。

示例:

<label><input type="checkbox" name="confirm" value="on"> 我已确认上述条款</label>

<label for="username">用户名:</label> <input type="textbox" name="username" id="username">


6.2 按钮


[强制] 使用 button 元素时必须指明 type 属性值。

解释:
button 元素的默认 type 为 submit,如果被置于 form 元素中,点击后将导致表单提交。为显示区分其作用方便理解,必须给出 type 属性。

示例:

<button type="submit">提交</button>

<button type="button">取消</button>


[建议] 尽量不要使用按钮类元素的 name 属性。

解释:
由于浏览器兼容性问题,使用按钮的 name 属性会带来许多难以发现的问题。具体情况可参考此文。


6.3 可访问性 (A11Y)


[建议] 负责主要功能的按钮在 DOM 中的顺序应靠前。

解释:
负责主要功能的按钮应相对靠前,以提高可访问性。如果在 CSS 中指定了 float: right 则可能导致视觉上主按钮在前,而 DOM 中主按钮靠后的情况。

示例:

<!-- good -->

<style>

.buttons .button-group {

    float: right;

}

</style>


<div class="buttons">

    <div class="button-group">

        <button type="submit">提交</button>

        <button type="button">取消</button>

    </div>

</div>


<!-- bad -->

<style>

.buttons button {

    float: right;

}

</style>


<div class="buttons">

    <button type="button">取消</button>

    <button type="submit">提交</button>

</div>


[建议] 当使用 JavaScript 进行表单提交时,如果条件允许,应使原生提交功能正常工作。

解释:
当浏览器 JS 运行错误或关闭 JS 时,提交功能将无法工作。如果正确指定了 form 元素的 action 属性和表单控件的 name 属性时,提交仍可继续进行。

示例:

<form action="/login" method="post">

    <p><input name="username" type="text" placeholder="用户名"></p>

    <p><input name="password" type="password" placeholder="密码"></p>

</form>


[建议] 在针对移动设备开发的页面时,根据内容类型指定输入框的 type 属性。

解释:
根据内容类型指定输入框类型,能获得能友好的输入体验。

示例:

<input type="date">


7 多媒体


[建议] 当在现代浏览器中使用 audio 以及 video 标签来播放音频、视频时,应当注意格式。

解释:

音频应尽可能覆盖到如下格式:

MP3

WAV

Ogg


视频应尽可能覆盖到如下格式:

MP4

WebM

Ogg


[建议] 在支持 HTML5 的浏览器中优先使用 audio 和 video 标签来定义音视频元素。


[建议] 使用退化到插件的方式来对多浏览器进行支持。

示例:

<audio controls>

    <source src="audio.mp3" type="audio/mpeg">

    <source src="audio.ogg" type="audio/ogg">

    <object width="100" height="50" data="audio.mp3">

        <embed width="100" height="50" src="audio.swf">

    </object>

</audio>


<video width="100" height="50" controls>

    <source src="video.mp4" type="video/mp4">

    <source src="video.ogg" type="video/ogg">

    <object width="100" height="50" data="video.mp4">

        <embed width="100" height="50" src="video.swf">

    </object>

</video>

[建议] 只在必要的时候开启音视频的自动播放。


[建议] 在 object 标签内部提供指示浏览器不支持该标签的说明。

示例:

<object width="100" height="50" data="something.swf">DO NOT SUPPORT THIS TAG</object>


参考出处:

《HTML编码规范》
https://github.com/ecomfe/spec/blob/master/html-style-guide.md#user-content-1-%E5%89%8D%E8%A8%80

《HTML/CSS开发规范指南》
https://github.com/doyoe/html-css-guide


注:该文档在参考文档基础上有部分修改、删除,已本文档为主。若遇文档中外链处可在参考文档中找到链接。

【前端技术文档】CSS编码规范

整理:曹燕、肖雅君

时间:2015-10-15

说明:CSS编码规范

 

1 前言

2 代码风格

    2.1 文件

    2.2 缩进

    2.3 空格

    2.4 行长度

    2.5 选择器

    2.6 属性

    2.7 注释

    2.8命名

3 通用

    3.1 选择器

    3.2 属性缩写

    3.3 属性书写顺序

    3.4 清除浮动

    3.5 !important

4 值与单位

    4.1 文本

    4.2 数值

    4.3 url()

    4.4 长度

    4.5 颜色

    4.6 2D 位置

5 文本编排

    5.1 字体族

    5.2 字号

    5.3 字体风格

    5.4 行高

6 响应式

7 兼容性

    7.1 属性前缀

    7.2 Hack

    7.3 Expression

 

1 前言

本文档的目标是使CSS代码风格保持一致,容易被理解和被维护。


2 代码风格

2.1 文件

[建议] CSS 文件使用无 BOM 的 UTF-8 编码。

解释:

UTF-8 编码具有更广泛的适应性。BOM 在使用程序或工具处理文件时可能造成不必要的干扰。

 

2.2 缩进

[强制] 使用 4 个空格作为一个缩进层级,不允许使用 2 个空格 或 tab 字符。

示例:

.selector {

    margin: 0;

    padding: 0;

}

 

2.3 空格

[强制] 选择器 与 { 之间必须包含空格。

示例:

.selector {

}

[强制] 属性名 与之后的 : 之间不允许包含空格, : 与 属性值 之间必须包含空格。

示例:

margin: 0;

[强制] 列表型属性值 书写在单行时,, 后必须跟一个空格。

示例:

font-family: Arial, sans-serif;

 

2.4 行长度

[强制] 每行不得超过 120 个字符,除非单行不可分割。

解释:

常见不可分割的场景为URL超长。

[建议] 对于超长的样式,在样式值的 空格 处或 , 后换行,建议按逻辑分组。

示例:

/* 不同属性值按逻辑分组 */

background:

    transparent url(aVeryVeryVeryLongUrlIsPlacedHere)

    no-repeat 0 0;

/* 可重复多次的属性,每次重复一行 */

background-image:

    url(aVeryVeryVeryLongUrlIsPlacedHere)

    url(anotherVeryVeryVeryLongUrlIsPlacedHere);

/* 类似函数的属性值可以根据函数调用的缩进进行 */

background-image: -webkit-gradient(

    linear,

    left bottom,

    left top,

    color-stop(0.04, rgb(88,94,124)),

    color-stop(0.52, rgb(115,123,162))

);

 

2.5 选择器

[强制] 当一个 rule 包含多个 selector 时,每个选择器声明必须独占一行。

示例:

/* good */

.post,

.page,

.comment {

    line-height: 1.5;

}

/* bad */

.post, .page, .comment {

    line-height: 1.5;

}

[强制] >、+、~ 选择器的两边各保留一个空格。

示例:

/* good */

main > nav {

    padding: 10px;

}

label + input {

    margin-left: 5px;

}

input:checked ~ button {

    background-color: #69C;

}

/* bad */

main>nav {

    padding: 10px;

}

label+input {

    margin-left: 5px;

}

input:checked~button {

    background-color: #69C;

}

[强制] 属性选择器中的值必须用双引号包围。

解释:

不允许使用单引号,不允许不使用引号。

 

示例:

/* good */

article[character="juliet"] {

    voice-family: "Vivien Leigh", victoria, female

}

/* bad */

article[character='juliet'] {

    voice-family: "Vivien Leigh", victoria, female

}

[强制]不要使用id来定义样式

解释:

id在JS是唯一的,不能多次使用,而使用class类选择器可以重复使用;并且id的优先级优先与class,所以id应该按需使用,而不能滥用。

示例:

/*good*/

.box{

    color:#e30;

}

/*bad*/

#box{

    color:#e30;

}

 

2.6 属性

[强制] 属性定义必须另起一行。

示例:

/* good */

.selector {

    margin: 0;

    padding: 0;

}

/* bad */

.selector { margin: 0; padding: 0; }

[强制] 属性定义后必须以分号结尾。

示例:

/* good */

.selector {

    margin: 0;

}

/* bad */

.selector {

    margin: 0

}

 

2.7 注释

[强制]注释格式为:/* 注释文字 */

示例:

/* Header */

/* End Header */

 

2.8命名

[强制]选择器、属性和值的命名都使用小写字母

[强制]长名称或词组使用连字符'-'来为选择器命名,不建议使用下划线或驼峰式来命名CSS选择器

示例:

/*good*/

main-title{

    color:#e3c

}

/*bad*/

main_title{

    color:#e3c

}

mainTitle{

    color:#e3c

}

[强制]命名应该使用有意义或通用的单词,在保证短的同时要让人一目了然。(尽量不缩写,除非一看就明白的单词,例如常用的英文缩写advertisement简写成adv等)

示例:

/*good*/

.navi{

    margin:0 0 10px 5px;

}

.author{

    color:#f00;

}

/*bad*/

.navigation{

    margin:0 0 10px 5px;

}

.au{

    color:#f00;

}

 

3 通用

3.1 选择器

[强制] 如无必要,不得为 id、class 选择器添加类型选择器进行限定。

解释:

在性能和维护性上,都有一定的影响。

示例:

/* good */

#error,

.danger-message {

    font-color: #c00;

}

/* bad */

dialog#error,

p.danger-message {

    font-color: #c00;

}

[建议] 选择器的嵌套层级应不大于 3 级,位置靠后的限定条件应尽可能精确。

示例:

/* good */

#username input {}

.comment .avatar {}

/* bad */

.page .header .login #username input {}

.comment div * {}

 

3.2 属性缩写

[建议] 在可以使用缩写的情况下,尽量使用属性缩写。

示例:

/* good */

.post {

    font: 12px/1.5 arial, sans-serif;

}

/* bad */

.post {

    font-family: arial, sans-serif;

    font-size: 12px;

    line-height: 1.5;

}

[建议] 使用 border / margin / padding 等缩写时,应注意隐含值对实际数值的影响,确实需要设置多个方向的值时才使用缩写。

解释:

border / margin / padding 等缩写会同时设置多个属性的值,容易覆盖不需要覆盖的设定。如某些方向需要继承其他声明的值,则应该分开设置。

示例:

/* centering <article class="page"> horizontally and highlight featured ones */

article {

    margin: 5px;

    border: 1px solid #999;

}

/* good */

.page {

    margin-right: auto;

    margin-left: auto;

}

.featured {

    border-color: #69c;

}

/* bad */

.page {

    margin: 5px auto; /* introducing redundancy */

}

.featured {

    border: 1px solid #69c; /* introducing redundancy */

}

 

3.3 属性书写顺序

[建议] 同一 rule set 下的属性在书写时,应按功能进行分组,并以 Formatting Model(布局方式、位置) > Box Model(尺寸) > Typographic(文本相关) > Visual(视觉效果) 的顺序书写,以提高代码的可读性。

解释:

Formatting Model 相关属性包括:position / top / right / bottom / left / float / display / overflow 等

Box Model 相关属性包括:border / margin / padding / width / height 等

Typographic 相关属性包括:font / line-height / text-align / word-wrap 等

Visual 相关属性包括:background / color / transition / list-style 等

另外,如果包含 content 属性,应放在最前面。

示例:

.sidebar {

/* formatting model: positioning schemes / offsets / z-indexes / display / ...  */

    position: absolute;

    top: 50px;

    left: 0;

    overflow-x: hidden;

/* box model: sizes / margins / paddings / borders / ...  */

    width: 200px;

    padding: 5px;
  
    border: 1px solid #ddd;

/* typographic: font / aligns / text styles / ... */

    font-size: 14px;

    line-height: 20px;

/* visual: colors / shadows / gradients / ... */

    background: #f5f5f5;

    color: #333;

    -webkit-transition: color 1s;

    -moz-transition: color 1s;

    transition: color 1s;

}

 

3.4 清除浮动

[建议] 当元素需要撑起高度以包含内部的浮动元素时,通过对伪类设置 clear 或触发 BFC 的方式进行 clearfix。尽量不使用增加空标签的方式。

解释:

触发 BFC 的方式很多,常见的有:

float 非 none

position 非 static

overflow 非 visible

另需注意,对已经触发 BFC 的元素不需要再进行 clearfix。

 

3.5 !important

[建议] 尽量不使用 !important 声明。

[建议] 当需要强制指定样式且不允许任何场景覆盖时,通过标签内联和 !important 定义样式。

解释:

必须注意的是,仅在设计上 确实不允许任何其它场景覆盖样式 时,才使用内联的 !important 样式。

 

4 值与单位

4.1 文本

[强制] 文本内容必须用双引号包围。

解释:

文本类型的内容可能在选择器、属性值等内容中。

示例:

/* good */

html[lang|="zh"] q:before {

    font-family: "Microsoft YaHei", sans-serif;

    content: "“";

}

html[lang|="zh"] q:after {

    font-family: "Microsoft YaHei", sans-serif;

    content: "”";

}

/* bad */

html[lang|=zh] q:before {

    font-family: 'Microsoft YaHei', sans-serif;

    content: '“';

}

html[lang|=zh] q:after {

    font-family: "Microsoft YaHei", sans-serif;

    content: "”";

}

 

4.2 数值

[强制] 当数值为 0 - 1 之间的小数时,省略整数部分的 0。

示例:

/* good */

panel {

    opacity: .8

}

/* bad */

panel {

    opacity: 0.8

}

 

4.3 url()

[强制] url() 函数中的路径不加引号。

示例:

body {

    background: url(bg.png);

}

[建议] url() 函数中的绝对路径可省去协议名。

示例:

body {

    background: url(//baidu.com/img/bg.png) no-repeat 0 0;

}

 

4.4 长度

[强制] 长度为 0 时须省略单位。 (也只有长度单位可省)

示例:

/* good */

body {

    padding: 0 5px;

}

/* bad */

body {

    padding: 0px 5px;

}

 

4.5 颜色

[强制] RGB颜色值必须使用十六进制记号形式 #rrggbb。不允许使用 rgb()。

解释:

带有alpha的颜色信息可以使用 rgba()。使用 rgba() 时每个逗号后必须保留一个空格。

示例:

/* good */

.success {

    box-shadow: 0 0 2px rgba(0, 128, 0, .3);

    border-color: #008000;

}

/* bad */

.success {

    box-shadow: 0 0 2px rgba(0,128,0,.3);

    border-color: rgb(0, 128, 0);

}

[强制] 颜色值可以缩写时,必须使用缩写形式。

示例:

/* good */

.success {

    background-color: #aca;

}

/* bad */

.success {

    background-color: #aaccaa;

}

[强制] 颜色值不允许使用命名色值。

示例:

/* good */

.success {

    color: #90ee90;

}

/* bad */

.success {

    color: lightgreen;

}

[建议] 颜色值中的英文字符采用小写。如不用小写也需要保证同一项目内保持大小写一致。

示例:

/* good */

.success {

    background-color: #aca;

    color: #90ee90;

}

/* good */

.success {

    background-color: #ACA;

    color: #90EE90;

}

/* bad */

.success {

    background-color: #ACA;

    color: #90ee90;

}

 

4.6 2D 位置

[强制] 必须同时给出水平和垂直方向的位置。

解释:

2D 位置初始值为 0% 0%,但在只有一个方向的值时,另一个方向的值会被解析为 center。为避免理解上的困扰,应同时给出两个方向的值。background-position属性值的定义

示例:

/* good */

body {

    background-position: center top; /* 50% 0% */

}

/* bad */

body {

    background-position: top; /* 50% 0% */

}

 

5 文本编排

5.1 字体族

[强制] font-family 属性中的字体族名称应使用字体的英文 Family Name,其中如有空格,须放置在引号中。

解释:

所谓英文 Family Name,为字体文件的一个元数据,常见名称如下:

宋体 (中易宋体) SimSun

黑体 (中易黑体) SimHei

微软雅黑 Microsoft YaHei

微软正黑 Microsoft JhengHei

华文黑体 STHeiti

冬青黑体 Hiragino Sans GB

文泉驿正黑 WenQuanYi Zen Hei

文泉驿微米黑 WenQuanYi Micro Hei

示例:

h1 {

    font-family: "Microsoft YaHei";

}

[强制] font-family 按「西文字体在前、中文字体在后」、「效果佳 (质量高/更能满足需求) 的字体在前、效果一般的字体在后」的顺序编写,最后必须指定一个通用字体族( serif / sans-serif )。

解释:

更详细说明可参考本文。

示例:

/* Display according to platform */

.article {

    font-family: Arial, sans-serif;

}

/* Specific for most platforms */

h1 {

    font-family: 
 "Helvetica Neue", Arial, "Hiragino Sans GB", "WenQuanYi Micro Hei", "Microsoft YaHei", sans-serif;

}

[强制] font-family 不区分大小写,但在同一个项目中,同样的 Family Name 大小写必须统一。

示例:

/* good */

body {

    font-family: Arial, sans-serif;

}

h1 {

    font-family: Arial, "Microsoft YaHei", sans-serif;

}

/* bad */

body {

    font-family: arial, sans-serif;

}

h1 {

    font-family: Arial, "Microsoft YaHei", sans-serif;

}

 

5.2 字号

[强制] 需要在 Windows 平台显示的中文内容,其字号应不小于 12px。

解释:

由于 Windows 的字体渲染机制,小于 12px 的文字显示效果极差、难以辨认。

 

5.3 字体风格

[建议] 需要在 Windows 平台显示的中文内容,不要使用除 normal 外的 font-style。其他平台也应慎用。

解释:

由于中文字体没有 italic 风格的实现,所有浏览器下都会 fallback 到 obilique 实现 (自动拟合为斜体),小字号下 (特别是 Windows 下会在小字号下使用点阵字体的情况下) 显示效果差,造成阅读困难。

 

5.4 行高

[建议] line-height 在定义文本段落时,应使用数值。

解释:

将 line-height 设置为数值,浏览器会基于当前元素设置的 font-size 进行再次计算。在不同字号的文本段落组合中,能达到较为舒适的行间间隔效果,避免在每个设置了 font-size 都需要设置 line-height。

当 line-height 用于控制垂直居中时,还是应该设置成与容器高度一致。

示例:

.container {

    line-height: 1.5;

}

 

6 响应式

[强制] Media Query 不得单独编排,必须与相关的规则一起定义。

示例:

/* Good */

/* header styles */

@media (...) {

/* header styles */

}

/* main styles */

@media (...) {

/* main styles */

}

/* footer styles */

@media (...) {

/* footer styles */

}

/* Bad */

/* header styles */

/* main styles */

/* footer styles */

@media (...) {

/* header styles */

/* main styles */

/* footer styles */

}

[强制] Media Query 如果有多个逗号分隔的条件时,应将每个条件放在单独一行中。

示例:

@media

(-webkit-min-device-pixel-ratio: 2), /* Webkit-based browsers */

(min--moz-device-pixel-ratio: 2),    /* Older Firefox browsers (prior to Firefox 16) */

(min-resolution: 2dppx),             /* The standard way */

(min-resolution: 192dpi) {           /* dppx fallback */

    /* Retina-specific stuff here */

}

[建议] 尽可能给出在高分辨率设备 (Retina) 下效果更佳的样式。

 

7 兼容性

7.1 属性前缀

[强制] 带私有前缀的属性由长到短排列,按冒号位置对齐。

解释:

标准属性放在最后。

示例:

.box {

    -webkit-box-sizing: border-box;

    -moz-box-sizing: border-box;

    box-sizing: border-box;

}

 

7.2 Hack

[建议] 需要添加 hack 时应尽可能考虑是否可以采用其他方式解决。

解释:

如果能通过合理的 HTML 结构或使用其他的 CSS 定义达到理想的样式,则不应该使用 hack 手段解决问题。通常 hack 会导致维护成本的增加。

[建议] 尽量使用 选择器 hack 处理兼容性,而非 属性 hack。

解释:

尽量使用符合 CSS 语法的 selector hack,可以避免一些第三方库无法识别 hack 语法的问题。

示例:

/* IE 7 */

*:first-child + html #header {

    margin-top: 3px;

    padding: 5px;

}

/* IE 6 */

* html #header {

    margin-top: 5px;

    padding: 4px;

}

[建议] 尽量使用简单的 属性 hack。

示例:

 

.box {

    _display: inline; /* fix double margin */

    float: left;

    margin-left: 20px;

}

.container {

    overflow: hidden;

    *zoom: 1; /* triggering hasLayout */

}

 

7.3 Expression

[强制] 禁止使用 Expression。

 

参考文档:
https://github.com/fex-team/styleguide/blob/master/css.md

http://www.uisdc.com/css-written-specifications

【web安全规范】 – 2、基本安全防御


编	写:袁	亮
时	间:2015-10-09
说	明:web安全规范 - 2、基本安全防御

一、外部输入过滤
	1、所有外部参数,必须经过处理过滤
		get参数、post参数($_REQUEST)、cookie数据,$_SERVER中的referer,ua,ip等数据
	2、所有过滤,以服务端验证为准,js客户端验证仅仅是为了增强用户体验
		不允许仅仅是在js加了判断验证,服务端没有
	3、只允许使用过滤后的数据,不允许在后面再使用过滤前的原始参数
		$p = isset($_GET['p'])?intval($_GET['p']):1; //过滤参数
		后面只允许只用$p,不允许出现任何直接调用$_GET['p']的地方
	4、过滤方法
		4.1 整型参数,一律采用intval转换
		4.2 短字符串,采用正则验证,常用正则百度,或者参考统一类库
			比如手机号、用户名、邮箱、邮编等等
		4.3 长字符串,非富文本
			比如个人介绍等,过滤html标签(strip_tags),再加过滤sql注入函数(stripSql)
			如果没有验证完全,或者不确定,可以使用mysql_escape_string()进行转义
		4.4 富文本编辑器的长字符串内容
			htmlspecialchars
			采用统一函数或者类库验证过滤
		4.5 这块详见附件 web安全规范 - 参数过滤
	5、严禁使用register_global、extract函数,php配置中也不允许开启register_global
		也不允许自己写代码,将外部变量全部变成内部变量,很多旧项目中就有
		也不要开启magic_quotes,在需要的时候使用addslashes转义

二、报错信息
	1、错误信息只能显示我们定义的对用户友好的内容,不允许显示与实际错误相关的内容
	2、线上不允许开启报错,包括php.ini和程序中的display_errors
	3、特别要注意,类似mysql_error等,只允许记log,不允许输出到页面
	4、必须要记录日志,这是之后排查的唯一依据
	5、日志不允许web直接访问到
	6、更多报错相关信息,请参考内部博客
		http://blog.geekman.vip/archives/27

三、数据存储
	1、log文件不允许存储在web能访问的地方
	2、cookie记录
		2.1 必须设置httponly属性,防止js读取
		2.2 cookie中不允许存储敏感数据,比如用户密码或者邮箱,手机号等
		2.3 cookie内容必须添加签名,并存储,验证cookie的时候必须比对签名是否正确
	3、数据库存储用户密码
		3.1 不允许存储明文密码
		3.2 必须添加盐值做散列
	4、cookie、session等用户登录凭证,需要设置过期时间,防止被劫持之后,一直有效
	5、注意加密算法和编码、散列的区别
		不要误拿编码做加密(base64、urlencode等等)
		不要使用自己编写的加密算法,采用成熟的高安全性算法
	6、日志文件中,不允许记录密码、银行账号等敏感数据

四、数据签名
	1、签名做法可以参考内部博客
		http://blog.geekman.vip/archives/46
	2、cookie存储需要签名
	3、写接口必须加签名
	4、敏感的读数据接口也必须添加签名验证,比如用户邮寄地址等

五、防暴力破解
	1、用户登录等危险操作必须考虑暴力破解的情况
	2、连续错误次数达到一定次数,则需要一个封禁时间
	3、同一个ip同时对多个账号多次尝试也需要处理
	4、发现有人暴力破解的时候,需要有报警机制,比如邮件、短信等

六、业务逻辑bug
	1、发布的时候,进行了相应的过滤,但是编辑的时候未处理,也会导致bug
	2、修改密码的时候,不进行验证,直接修改
	3、购买商品的时候,价格直接通过参数传递结算
	4、找回密码的时候,通过安全问题来验证,但是安全问题可以在登陆的时候直接修改
	5、这些业务逻辑的bug,需要在需求、开发阶段就要多想想,特别是一些比较危险的操作

七、越权访问
	1、所有后台、管理员操作的地方必须要经过权限验证
	2、所有验证必须是通过服务端验证,不允许采用js隐藏,不显示按钮等来完成
	3、每次都必须验证,不要指望在入口那边验证过了,操作的时候就可以不验证
	4、权限验证,不要寄希望与链接、入口别人不知道,浏览器插件、搜索引擎,都有可能泄露
	5、特别要注意调用接口的地方,不要遗漏
	6、所有操作,都必须想想,这是不是一个所有人都可以任意访问的资源,如果不是,都需要权限验证

八、服务器安全
	1、mysql资源
		1.1 除非特殊申请,否则主库增删改查权限,从库查权限
		1.2 给定权限的时候,必须限制ip,一般是内网固定某台
	2、web服务
		不允许使用root账号启动,比如apache等(我们的云主机上有见过root启动的)
		不要安装不用的扩展,很多扩展是有高危漏洞的
	3、redis、memcache资源
		需要绑定ip,一般是内网
		也可设置加账号密码访问
	4、严禁rm -rf命令,同学的同事有过rm -rf之后,损失一个亿的教训
	5、程序源码被直接显示出来
		解析不当+程序员操作不当,导致.bak文件等直接源码显示出来
	6、.svn文件夹等,直接可以遍历扫描
	7、web访问目录层级,web不允许直接访问到项目代码根目录
		/项目代码根目录/webroot/

九、文件上传
	1、上传文件的存储目录,不允许给执行权限【最重要】
	2、上传图片采用其他域名访问,与web服务域名分开
	3、文件扩展名白名单过滤
	4、存储文件名必须系统生成,不允许用户自定义
	5、想了解更多,可以参考内部博客
		http://blog.geekman.vip/archives/301

十、不要调用系统命令
	1、不要在web服务中调用shell命令,比如exec,system,eval之类的
	2、实在要用,shell命令的参数不要是通过web参数带过来的,否则很容易导致系统被攻破

十一、测试环境
	1、重要项目,必须有搭建测试环境(可以在本地搭建)
	2、测试环境的数据库、memcache等资源也必须是用的测试的
	3、不要把调试后门给上传到了线上,因为不知道哪天调试后门就会被人非法访问了
		不要觉得你这个链接从来没公布出去别人不知道,有个东西叫浏览器插件,还有个东西叫抓包

十二、跳转链接
	1、登陆等callback页面,必须要对callback后的链接进行验证
		否则给用户发了一个育儿网的链接,结果用户登陆之后跳到一个恶意网站,在恶意网站提示用户账户密码错误,请重新输入,然后就会导致用户账户密码被盗
	2、进行有根据用户的referer来进行跳转的,referer中的链接也需要验证,可以随意伪造

【web安全规范】- 1、人为疏忽


编	写:袁	亮
时	间:2015-09-30
说	明:web安全规范 - 1、人为疏忽

一、公司代码
	1、不管在职离职,都不允许将公司代码上传,比如github,各种网盘等
	2、不允许在个人博客等公开文章中出现公司域名、服务器地址、服务器目录结构、账号密码等相关内容

二、密码安全
	1、简易密码
		不要设置像123456,password这种简单密码
		具体的可以在abc.ci123.com后台中的密码安全监测中测试下,自己的密码是否安全
	2、密码泄露
		不要将自己的账号、密码、安全口令等记录在博客、公开网盘,或者私人邮箱等
		不要将账号密码记录在公司后台等其他人能看到的地方
	3、邮箱安全
		请勿使用私人邮箱作为工作用
		邮件中,不允许发送账号、密码,服务器秘钥等危险内容
		定时更改企业邮箱密码
	4、外部人员
		不要将自己的账号或者保密资料发给外部人员
	5、请不要将自己的账号密码,UKEY等给其他人用,包括公司同事
		每个人的账号权限不一样,如果没有权限,请找直属领导申请相应权限
	6、不允许设置万能账号、万能密码之类的东西

三、数据安全
	1、请勿私自将公司数据(运营、统计、客户报价等等)在微信、QQ、博客等地方透露
	2、后台数据导出,必须征得部门领导同意,请勿私自导出备份
	3、技术人员不允许私自导出、备份公司数据库数据

四、后台、管理员操作越权
	1、发现有后台不登陆即可访问,任何人员都有义务向部门领导反馈
	2、请勿在公共电脑上,登陆后台并记住密码
	3、技术人员不允许私自将后台权限验证的地方去除