web前端开发规范
web前端开发规范
通用规范:
(1)用4个空格来代替制表符(tab):由于制表符在不同系统即使使用相同的编辑器也可能会不一致(系统对制表符的解析不一致),所以如果想代码在所有环境下展现一致就用4个空格代替制表符,现在很多编辑器都可以配置敲入Tab键时插入4个空格。
(2)文件的命名尽量用有意义的英文单词加破折号“-”:
对于文件的命名要注意:
1)字母开头而不是数字开头;
2)英文单词(或缩写)要全部小写,使用破折号“-”来分割;
3)对于一些有前后缀或特定的扩展名的文件,使用点分隔符,
下面是一些例子:
layer.js
my-style.css
my-style.min.css
jquery.cookie.min.js
html规范:
(1) 使用html5的文档类型,字符编码统一使用UTF-8编码:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
</body>
</html>
(2) 嵌套元素应当缩进一次(即两个空格)
(3)属性的定义,全部使用双引号,绝不要使用单引号,如:
<input class="my-input" name="myinput" type="text">
(4)不要在自闭合元素的尾部添加斜线:
HTML中所有的自闭合标签如下:area、base、br、col、command、embed、hr、img、input、keygen、link、meta、param、source、track、wbr
推荐的例子:
<img src="....">
<br>
(5)属性的顺序:
HTML 属性推荐按照以下顺序依次排列:
class -> id, name -> data-* -> src, for, type, href -> title, alt -> aria-*, role
(6)布尔型属性可以在声明时不赋值:
XHTML规范要求为其赋值,但是HTML5规范不需要。如:
<input type="text" disabled>
<input type="checkbox" value="1" checked>
<select>
<option value="1">1</option>
<option value="2" selected>2</option>
</select>
(7)减少不必要的标签,任何时候都要尽量使用最少的标签并保持最小的复杂度
(8)引入 CSS 和 JavaScript 文件:
首先,根据HTML5 规范,在引入CSS和JavaScript文件时一般不需要指定type属性,因为text/css和text/javascript分别是它们的默认值,即使在老旧版本的浏览器中这么做也是安全可靠的。
然后对于脚本的加载,如果放在<head>标签内加载脚本,那么其加载会一直阻塞DOM解析直至它完全地加载和执行完毕,因此可以将HTML5的async属性加至脚本中,它可防止阻塞DOM的解析,当然这种添加async属性进行异步加载脚本的方式只兼容IE10+,如果需要兼容低版本浏览器,可使用用来动态注入脚本的脚本加载器,可以考虑yepnope,
对于所有的浏览器,推荐的例子如下:
<html>
<head>
<link rel="stylesheet" href="test.css">
</head>
<body>
<script src="test.js" async></script>
</body>
</html>
css规范:
(1) 为选择器分组时,将单独的选择器单独放在一行,在每个声明块的左花括号前添加一个空格,声明块的右花括号应当单独成行
(2) 每条声明都应该独占一行,每条声明语句的冒号”:”后应该插入一个空格,所有声明语句都应当以分号结尾
(3) 对于以逗号分隔的属性值,每个逗号后面都应该插入一个空格(例如,box-shadow)
(4) 不要在rgb()、rgba()、hsl()、hsla()或rect()值的内部的逗号后面插入空格。这样利于从多个属性值(既加逗号也加空格)中区分多个颜色值(只加逗号,不加空格)
(5)对于属性值或颜色参数,省略小于1的小数前面的0(例如,.5代替0.5;-.5px代替-0.5px)
(6)十六进制值应该全部小写,例如,#fff。在扫描文档时,小写字符易于分辨,因为他们的形式更易于区分。在可能的情况下,尽量使用3个字符的十六进制表示法,如 #FF33AA 写成 #f3a
(7)为选择器中的属性添加双引号,例如 input[type="text"]
(8)避免为 0 值指定单位,例如,用 margin: 0; 代替 margin: 0px;
上述的点的参考例子:
.selector,
.selector-secondary,
.selector[type="text"] {
padding: 15px;
margin-bottom: 15px;
box-shadow: 0 1px 2px #ccc, inset 0 1px 0 #fff;
}
(9)对于只包含一条声明的样式,为了易读性和便于快速编辑,建议将语句放在同一行:.span { width: 60px; }
(10)属性声明顺序:
相关的属性声明应当归为一组,并按照下面的顺序排列:
1、Positioning
2、Box model
3、Typographic
4、Visual
由于定位(positioning)可以从正常的文档流中移除元素,并且还能覆盖盒模型(box model)相关的样式,因此排在首位。盒模型排在第二位,因为它决定了组件的尺寸和位置。其他属性只是影响组件的内部(inside)或者是不影响前两组属性,因此排在后面。
(11)不要使用@import与<link>标签相比,@import指令要慢很多,不光增加了额外的请求次数,还会导致不可预料的问题。替代办法有以下几种:
1)使用多个<link>元素
2)通过 Sass 或 Less 类似的 CSS 预处理器将多个 CSS 文件编译为一个文件
3)通过 Rails、Jekyll 或其他系统中提供过 CSS 文件合并功能
(12)带前缀的属性:当使用特定厂商的带有前缀的属性时,通过缩进的方式,让每个属性的值在垂直方向对齐,这样便于多行编,如:
.selector {
-webkit-box-shadow: 0 1px 2px rgba(0,0,0,.15);
box-shadow: 0 1px 2px rgba(0,0,0,.15);
}
(13)简写形式的属性声明:
在需要显示地设置所有值的情况下,应当尽量限制使用简写形式的属性声明。常见的滥用简写属性声明的情况如下:
padding、margin、font、background、border、border-radius
大部分情况下,我们不需要为简写形式的属性声明指定所有值。例如,HTML 的 heading 元素只需要设置上、下边距(margin)的值,因此,在必要的时候,只需覆盖这两个值就可以。过度使用简写形式的属性声明会导致代码混乱,并且会对属性值带来不必要的覆盖从而引起意外的副作用。
推荐使用的例子:
.element {
margin-bottom: 10px;
background-image: url(image.jpg);
border-top-left-radius: 3px;
border-top-right-radius: 3px;
}
(14)注释:确保代码能够自描述、注释良好并且易于他人理解。好的代码注释能够传达上下文关系和代码目的。不要简单地重申组件或 class 名称。对于较长的注释,务必书写完整的句子;对于一般性注解,可以书写简洁的短语。
/* Wrapping element for .modal-title and .modal-close */
.modal-header {
margin: 0;
}
(15)class 命名:
1)class 名称中只能出现小写字符和破折号(“-”)。破折号应当用于相关 class 的命名(类似于命名空间)(例如,.btn 和.btn-danger)
2)避免过度任意的简写。 .btn 代表 button,但是 .s不能表达任何意思
3)class 名称应当尽可能短,并且意义明确。不要使用表现形式的名称。
4)基于最近的父 class 或基本(base) class 作为新 class 的前缀。
5)使用 .js-* class 来标识行为(与样式相对),并且不要将这些 class 包含到 CSS 文件中
/* 不推荐 */
.t { ... }
.red { ... }
.header { ... }
/* 推荐 */
.tweet { ... }
.important { ... }
.tweet-header { ... }
(16)选择器:
1)对于通用元素使用 class ,这样利于渲染性能的优化
2)对于经常出现的组件,避免使用属性选择器(例如,[class^="..."])。浏览器的性能会受到这些因素的影响
3)选择器要尽可能短,并且尽量限制组成选择器的元素个数,建议不要超过3
4)只有在必要的时候才将 class 限制在最近的父元素内(也就是后代选择器)(例如,不使用带前缀的 class 时 – 前缀类似于命名空间)
/* 不推荐 */
span { ... }
.page-container #stream .stream-item .tweet .tweet-header .username { ... }
.avatar { ... }
/* 推荐 */
.avatar { ... }
.tweet-header .username { ... }
.tweet .avatar { ... }
JavaScript规范:
(1)普通注释:JavaScript有单行和多行注释,单行注释以双斜杠//开头,多行注释以/*开始,以 */ 结尾。单行注释在注释符后留一个空格,如:
// 这是一个单行注释
多行注释在结束符前留一个空格以便使星号对齐且不能把注释内容写在开始和结束符所在的行,如:
/*
* 这是一个多行
* 注释
*/
(2)文档注释:/**开头,以*/结束,中间的每一行都要以*开头且要和开始符的第一个*对齐,注释内容与*之间留一个空格。
文件声明注释:
/**
* @file Manages the configuration settings for the widget.
* @author Rowina Sanela <rsanela@example.com>
* @version 1.2.3
*/
该注释位于文件的最前面,其中@file 是指文件描述,@author是作者信息,@version是版本信息。
函数注释:
/**
* 方法说明
* @function 方法名 (和@function同义的标签有@func和@method)
* @param {参数类型} 参数名 参数说明
* @param {参数类型} [参数名=默认值] 参数说明
* @return {返回值类型} 返回值说明
*/
此外还有一些常用的标签如:
@todo用来描述一些要做的事,用法 :@todo 描述;
@property用来声明类属性,用法:
/**
* 属性说明
* @property {属性类型} 属性名
*/
@constructor用来表明这个方法是个构造器,
用法 :@constructor等等。
(3)分号和逗号:JavaScript 中语句要以分号结束,否则它将会继续执行下去,不管换不换行。常见会漏掉分号的情况是:函数声明、对象和数组。还有逗号不能写多,我之前遇到的情况是在声明对象时在最后一个属性后面加多了一个逗号,虽然很多浏览器都没有问题,但在IE8下脚本会报错即使不影响脚本运行,但以后还是要严格按照规范来,该有的分号要有,不该有的逗号不能多写。
推荐的例子:
var myFun = function() {
return true;
};
var myObj = {
name: 'abc',
sex: 'man',
age: 18
};
(4)变量声明:总是使用var来声明变量。如不指定 var,变量将被隐式地声明为全局变量
(5)变量命名:命名规则推荐使用:第一个单词首字母小写,其他单词首字母大写,如:userName;如果是私有变量则加上下划线作为前缀,如:_userName
(6)总是使用带类型判断的比较判断:总是使用“===”精确的比较操作符,避免在判断的过程中,由 JavaScript 的强制类型转换所造成的困扰
(7)用 if else 来替换 switch
(8)字符串:统一使用单引号',不使用双引号"。这在创建 HTML 字符串非常有好处。
备注:本文中HTML和CSS规范基本是按照Bootstrap编码规范(https://codeguide.bootcss.com/)。