Web 前端代码规范

最后更新时间:2017-06-25

原始文章链接:https://github.com/bxm0927/web-code-standards

此项目用于记录规范的、高可维护性的前端代码,这是通过分析 Github 众多前端代码库,总结出来的前端代码书写规范。

目录

  1. 前端普适性规范
  2. HTML 规范
  3. CSS 规范
  4. JS 规范

License

public domain, Just take it.

Thanks

@Ruan YiFeng: https://github.com/ruanyf

@materliu:https://materliu.github.io/code-guide

@hzlzh: https://github.com/hzlzh/Front-End-Standards

@tguide: http://tguide.qq.com/main/base.htm

前端普适性规范

黄金定律

永远遵循同一套编码规范,可以是这里列出的,也可以是你自己总结的。如果你发现本
规范中有任何错误,敬请指正。

不管有多少人共同参与同一项目,一定要确保每一行代码都像是同一个人编写的。

项目命名

项目名全部采用小写方式,以中划线分隔,禁止驼峰式命名。比如:my-project-name

文件命名

文件命名参照上一条规则,多个单词组成时,采用中划线连接方式,比如说: error-report.html

有复数结构时,要采用复数命名法,比如说: scripts, styles, images, data-models

文件名中只可由小写英文字母a~z、排序数字0~9或间隔符-组成,禁止包含特殊符号,比如空格、$等

为更好的表达语义,文件名使用英文名词命名,或英文简写。

不允许命名带有广告等英文的单词,例如ad,adv,adver,advertising,防止该模块被浏览器当成垃圾广告过滤掉。任何文件的命名均如此。

  • index.shtml 引导页&首页
  • main.shtml 首页
  • download.shtml 下载页面
  • act.html 活动列表页面
  • video.html 视频
  • cdkey.html CDKEY页面

  • base.css 基本样式

  • layout.css 框架布局
  • module.css 模块样式
  • global.css 全局样式
  • font.css 字体样式
  • index.css 首页样式
  • link.css 链接样式
  • print.css 打印样式

HTML 规范

语法

使用四个空格的缩进,这是保证代码在各种环境下显示一致的唯一方式。

嵌套的节点应该缩进(四个空格)。

在属性上,使用双引号,不要使用单引号。

不要在自动闭合标签结尾处使用斜线 - HTML5 规范 指出他们是可选的。

不要忽略可选的关闭标签(例如, 和 </body>)。

  1. ![](images/logo.png)

HTML5 doctype

在每个 HTML 页面开头使用这个简单地 doctype 来启用标准模式,使其每个浏览器中尽可能一致的展现。

虽然doctype不区分大小写,但是按照惯例,doctype大写

  1. <!DOCTYPE html>

语言属性

  1. <html lang="en">
  2. </html>

字符编码

通过明确声明字符编码,能够确保浏览器快速并容易的判断页面内容的渲染方式。这样
做的好处是,可以避免在 HTML 中使用字符实体标记(character entity),从而全部与
文档编码一致(一般采用 UTF-8 编码)。

  1. <meta charset="UTF-8">

IE 兼容模式

IE 支持通过特定的 <meta> 标签来确定绘制当前页面所应该采用的 IE 版本。除非有强烈
的特殊需求,否则最好是设置为 edge mode,从而通知 IE 采用其所支持的最新的模
式。

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

响应式

  1. <meta name="viewport" content="width=device-width, initial-scale=1">

引入 CSS 和 JavaScript

根据 HTML5 规范, 通常在引入 CSS 和 JavaScript 时不需要指明 type,因为 text/css 和 text/javascript 分别是他们的默认值。

  1. <!-- External CSS -->
  2. <link rel="stylesheet" href="code-guide.css">
  3. <!-- In-document CSS -->
  4. <style>
  5. /* ... */
  6. </style>
  7. <!-- JavaScript -->
  8. <script src="code-guide.js"></script>

实用高于完美

尽量遵循 HTML 标准和语义,但是不应该以浪费实用性作为代价。任何时候都要用尽量小的复杂度和尽量少的标签来解决问题。

减少标签数量

在编写 HTML 代码时,需要尽量避免多余的父节点。很多时候,需要通过迭代和重构来使 HTML 变得更少。 参考下面的示例:

  1. <!-- Not so great -->
  2. <span class="avatar">
  3. ![](...)
  4. </span>
  5. <!-- Better -->
  6. ![](...)

属性顺序

HTML 属性应该按照特定的顺序出现以保证易读性。

  1. class
  2. id
  3. name
  4. data-*
  5. src, for, type, href, value , max-length, max, min, pattern
  6. placeholder, title, alt
  7. aria-*, role
  8. required, readonly, disabled

class 是为高可复用组件设计的,理论上他们应处在第一位。id 更加具体而且应该尽量少使用(例如, 页内书签),所以他们处在第二位。

Boolean 属性

Boolean 属性指不需要声明取值的属性。XHTML 需要每个属性声明取值,但是 HTML5 并不需要。

一个元素中 Boolean 属性的存在表示取值 true,不存在则表示取值 false。

简而言之,不要为 Boolean 属性添加取值。

  1. <input type="text" disabled>

JavaScript 生成标签

在 JavaScript 文件中生成标签让内容变得更难查找,更难编辑,性能更差。应该尽量避免这种情况的出现。

CSS 规范

语法

使用四个空格的缩进,这是保证代码在各种环境下显示一致的唯一方式。

使用组合选择器时,保持每个独立的选择器占用一行。

为了代码的易读性,在每个声明的左括号前增加一个空格。

声明块的右括号应该另起一行。

每条声明 : 后应该插入一个空格。

每条声明应该只占用一行来保证错误报告更加准确。

所有声明应该以分号结尾。虽然最后一条声明后的分号是可选的,但是如果没有他,你的代码会更容易出错。

逗号分隔的取值,都应该在逗号之后增加一个空格。

不要在颜色值 rgb() rgba() hsl() hsla()和 rect() 中增加空格,并且不要带有取值前面不必要的 0 (比如,使用 .5 替代 0.5)。

所有的十六进制值都应该使用小写字母,例如 #fff。因为小写字母有更多样的外形,在浏览文档时,他们能够更轻松的被区分开来。

尽可能使用短的十六进制数值,例如使用 #fff 替代 #ffffff。

为选择器中的属性取值添加引号,例如 input[type="text"]。 他们只在某些情况下可有可无,所以都使用引号可以增加一致性。

不要为 0 指明单位,比如使用 margin: 0; 而不是 margin: 0px;。

  1. /* Bad CSS */
  2. .selector, .selector-secondary, .selector[type=text] {
  3. margin: 0px 0px 15px;
  4. background-color: rgba(0, 0, 0, 0.5);
  5. box-shadow: 0 1px 2px #CCC, inset 0 1px 0 #FFFFFF
  6. }
  7. /* Good CSS */
  8. .selector,
  9. .selector-secondary,
  10. .selector[type="text"] {
  11. margin-bottom: 15px;
  12. background-color: rgba(0,0,0,.5);
  13. box-shadow: 0 1px 2px #ccc, inset 0 1px 0 #fff;
  14. }

声明顺序

相关的属性声明应该以下面的顺序分组处理:

  1. Positioning
  2. Box model 盒模型
  3. Typographic 排版
  4. Visual 外观

Positioning 处在第一位,因为他可以使一个元素脱离正常文本流,并且覆盖盒模型相关的样式。盒模型紧跟其后,因为他决定了一个组件的大小和位置。

其他属性只在组件内部起作用或者不会对前面两种情况的结果产生影响,所以他们排在后面。

  1. .declaration-order {
  2. /* Positioning */
  3. position: absolute;
  4. top: 0;
  5. right: 0;
  6. bottom: 0;
  7. left: 0;
  8. z-index: 100;
  9. /* Box-model */
  10. display: block;
  11. float: right;
  12. width: 100px;
  13. height: 100px;
  14. /* Typography */
  15. font: normal 13px "Helvetica Neue", sans-serif;
  16. line-height: 1.5;
  17. color: #333;
  18. text-align: center;
  19. /* Visual */
  20. background-color: #f5f5f5;
  21. border: 1px solid #e5e5e5;
  22. border-radius: 3px;
  23. /* Misc */
  24. opacity: 1;
  25. }

Don't use @import

<link>相比,@import较慢,增加额外的页面请求,并可能导致其他不可预见的问题。

  1. <!-- Use link elements -->
  2. <link rel="stylesheet" href="core.css">
  3. <!-- Avoid @imports -->
  4. <style>
  5. @import url("more.css");
  6. </style>

媒体查询位置

尽量将媒体查询的位置靠近他们相关的规则。不要将他们一起放到一个独立的样式文件中,或者丢在文档的最底部。这样做只会让大家以后更容易忘记他们。这里是一个典型的案例。

  1. .element { ... }
  2. .element-avatar { ... }
  3. .element-selected { ... }
  4. @media (min-width: 480px) {
  5. .element { ...}
  6. .element-avatar { ... }
  7. .element-selected { ... }
  8. }

前缀属性

当使用厂商前缀属性时,通过缩进使取值垂直对齐以便多行编辑。

  1. /* Prefixed properties */
  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. }

单条声明的声明块

在一个声明块中只包含一条声明的情况下,为了易读性和快速编辑可以考虑移除其中的换行。所有包含多条声明的声明块应该分为多行。

这样做的关键因素是错误检测 - 例如,一个 CSS 验证程序显示你在 183 行有一个语法错误,如果是一个单条声明的行,那就是他了。在多个声明的情况下,你必须为哪里出错了费下脑子。

  1. .span1 { width: 60px; }
  2. .span2 { width: 140px; }
  3. .span3 { width: 220px; }

属性简写

尽量不使用属性简写的方式,属性简写需要你必须显式设置所有取值。常见的属性简写滥用包括:

  • padding
  • margin
  • font
  • background
    -border
    -border-radius

大多数情况下,我们并不需要设置属性简写中包含的所有值。例如,HTML 头部只设置上下的 margin,所以如果需要,只设置这两个值。过度使用属性简写往往会导致更混乱的代码,其中包含不必要的重写和意想不到的副作用。

  1. /* Bad example */
  2. .element {
  3. margin: 0 0 10px;
  4. background: red;
  5. background: url("image.jpg");
  6. border-radius: 3px 3px 0 0;
  7. }
  8. /* Good example */
  9. .element {
  10. margin-bottom: 10px;
  11. background-color: red;
  12. background-image: url("image.jpg");
  13. border-top-left-radius: 3px;
  14. border-top-right-radius: 3px;
  15. }

Less 和 Sass 中的嵌套

避免不必要的嵌套。可以进行嵌套,不意味着你应该这样做。只有在需要给父元素增加样式并且同时存在多个子元素时才需要考虑嵌套。

  1. // Without nesting
  2. .table > thead > tr > th { }
  3. .table > thead > tr > td { }
  4. // With nesting
  5. .table > thead > tr {
  6. > th { }
  7. > td { }
  8. }

代码注释

代码是由人来编写和维护的。保证你的代码是描述性的,包含好的注释,并且容易被他人理解。好的代码注释传达上下文和目标。不要简单地重申组件或者 class 名称。

class 命名

保持 class 命名为全小写,可以使用短划线(不要使用下划线和 camelCase 命名)。短划线应该作为相关类的自然间断。(例如,.btn 和 .btn-danger)。

避免过度使用简写。.btn 可以很好地描述 button,但是 .s 不能代表任何元素。

class 的命名应该尽量短,也要尽量明确。

使用有意义的名称;使用结构化或者作用目标相关,而不是抽象的名称。

命名时使用最近的父节点或者父 class 作为前缀。

使用 .js-* 来表示行为(相对于样式),但是不要在 CSS 中包含这些 class。

选择器

使用 class 而不是通用元素标签来优化渲染性能。

避免在经常出现的组件中使用一些属性选择器 (例如,[class^="..."])。浏览器性能会受到这些情况的影响。

减少选择器的长度,每个组合选择器选择器的条目应该尽量控制在 3 个以内。

只在必要的情况下使用后代选择器 (例如,没有使用带前缀 classes 的情况).

代码组织

以组件为单位组织代码。

制定一个一致的注释层级结构。

使用一致的空白来分割代码块,这样做在查看大的文档时更有优势。

当使用多个 CSS 文件时,通过组件而不是页面来区分他们。页面会被重新排列,而组件移动就可以了。

编辑器配置

根据以下的设置来配置你的编辑器,将这些设置应用到项目的 .editorconfig 文件,来避免常见的代码不一致和丑陋的 diffs。

  • 使用四个空格的缩进。
  • 在保存时删除尾部的空白字符。
  • 设置文件编码为 UTF-8。
  • 在文件结尾添加一个空白行。

JS 规范

语法

使用四个空格的缩进,这是保证代码在各种环境下显示一致的唯一方式。

声明之后一律以分号结束, 不可以省略

完全避免 == != 的使用, 用严格比较条件 === !==

eval 非特殊情况, 禁用!!!

with 非特殊情况, 禁用!!!

单行长度,理论上不要超过80列,不过如果编辑器开启"自动换行"的话可以不考虑单行长度

接上一条,如果需要换行,存在操作符的情况,一定在操作符后换行,然后换的行缩进4个空格

这里要注意,如果是多次换行的话就没有必要继续缩进了,比如说下面这种就是最佳格式。

  1. if (typeof qqfind === "undefined" ||
  2. typeof qqfind.cdnrejected === "undefined" ||
  3. qqfind.cdnrejected !== true) {
  4. url = "http://pub.idqqimg.com/qqfind/js/location4.js";
  5. } else {
  6. url = "http://find.qq.com/js/location4.js";
  7. }

空行

方法之间加

单行或多行注释前加

逻辑块之间加空行增加可读性

变量命名

标准变量采用驼峰标识

使用的ID的地方一定全大写

使用的URL的地方一定全大写, 比如说 reportURL

涉及Android的,一律大写第一个字母

涉及iOS的,一律小写第一个,大写后两个字母

常量采用大写字母,下划线连接的方式

构造函数,大写第一个字母

  1. var thisIsMyName;
  2. var goodID;
  3. var AndroidVersion;
  4. var iOSVersion;
  5. var MAX_COUNT = 10;
  6. function Person(name) {
  7. this.name = name
  8. }

字符常量

一般情况下统一使用单引号

null的使用场景

初始化可能以后分配对象值的变量

与一个可能或可能没有对象值的初始化变量进行比较

传入一个预期对象的函数

从预期对象的函数返回

不适合null的使用场景

不要使用null来测试是否提供参数

不要测试值为null的未初始化变量

undefined使用场景

永远不要直接使用undefined进行变量判断

使用字符串 "undefined" 对变量进行判断

  1. // Bad
  2. var person;
  3. console.log(person === undefined); //true
  4. // Good
  5. console.log(typeof person); // "undefined"

对象字面量

  1. // Bad
  2. var team = new Team();
  3. team.title = "AlloyTeam";
  4. team.count = 25;
  5. // Good
  6. var team = {
  7. title: "AlloyTeam",
  8. count: 25
  9. };

数组声明

  1. // Bad
  2. var colors = new Array("red", "green", "blue");
  3. var numbers = new Array(1, 2, 3, 4);
  4. // Good
  5. var colors = [ "red", "green", "blue" ];
  6. var numbers = [ 1, 2, 3, 4 ];

单行注释

双斜线后,必须跟注释内容保留一个空格

与下一行代码缩进保持一致

可位于一个代码行的末尾,双斜线距离分号四个空格

  1. // Good
  2. if (condition) {
  3. // if you made it here, then all security checks passed
  4. allowed();
  5. }
  6. var zhangsan = "zhangsan"; // 双斜线距离分号四个空格,双斜线后始终保留一个空格

多行注释格式

最少三行

前边留空一行

  1. /**
  2. * 注释内容与星标前保留一个空格
  3. */

何时使用多行注释格式

难于理解的代码段

可能存在错误的代码段

浏览器特殊的HACK代码

业务逻辑强相关的代码

想吐槽的产品逻辑, 合作同事

文档注释

各类标签 @param @method 等 参考 http://usejsdoc.org/

用于:方法、构造函数、对象

  1. /**
  2. * here boy, look here , here is girl
  3. * @method lookGril
  4. * @param {Object} balabalabala
  5. * @return {Object} balabalabala
  6. */

括号对齐

标准示例 括号前后有空格,花括号起始不另换行,结尾新起一行

花括号必须要,即使内容只有一行

涉及 if for while do...while try...catch...finally 的地方都必须使用花括号,即使内容只有一行

if else 前后留有空格

  1. if (condition) {
  2. doSomething();
  3. } else {
  4. doSomethingElse();
  5. }

switch

switch和括号之间有空格,case需要缩进,break之后跟下一个case中间留一个空白行

花括号必须要, 即使内容只有一行。

switch 的 falling through 一定要有注释特别说明,no default 的情况也需要注释特别说明况

  1. switch (condition) {
  2. case "first":
  3. // code
  4. break;
  5. case "second":
  6. // code
  7. break;
  8. default:
  9. // code
  10. }

for

普通for循环, 分号后留有一个空格, 判断条件等内的操作符两边不留空格

前置条件如果有多个,逗号后留一个空格

for-in 一定要有 hasOwnProperty 的判断, 否则 JSLint 或者 JSHint 都会有一个 warn

  1. for (i=0, len=values.length; i<len; i++) {
  2. process(values[i]);
  3. }
  4. var prop;
  5. for (prop in object) {
  6. // 注意这里一定要有 hasOwnProperty 的判断, 否则 JSLint 或者 JSHint 都会有一个 warn !
  7. if (object.hasOwnProperty(prop)) {
  8. console.log("Property name is " + prop);
  9. console.log("Property value is " + object[prop]);
  10. }
  11. }

变量声明

所有函数内变量声明放在函数内头部,只使用一个 var(多了JSLint报错), 一个变量一行, 在行末跟注释, 注释啊,注释啊,亲

函数声明

一定先声明再使用, 不要利用 JavaScript engine的变量提升特性, 违反了这个规则 JSLint 和 JSHint都会报 warn

function declaration 和 function expression 的不同,function expression 的()前后必须有空格,而function declaration 在有函数名的时候不需要空格,没有函数名的时候需要空格。

函数调用括号前后不需要空格

立即执行函数的写法, 最外层必须包一层括号

"use strict" 决不允许全局使用, 必须放在函数的第一行, 可以用自执行函数包含大的代码段, 如果 "use strict" 在函数外使用, JSLint 和 JSHint 均会报错

  1. function doSomething(item) {
  2. // do something
  3. }
  4. var doSomething = function (item) {
  5. // do something
  6. }
  7. // Good
  8. doSomething(item);
  9. // Bad: Looks like a block statement
  10. doSomething (item);
  11. // Good
  12. (function() {
  13. "use strict";
  14. function doSomething() {
  15. // code
  16. }
  17. })();

Web 前端代码规范的更多相关文章

  1. Web前端代码规范

    新增:http://materliu.github.io/code-guide/#project-naming HTML 原则1.规范 .保证您的代码规范,保证结构表现行为相互分离.2.简洁.保证代码 ...

  2. Web前端代码规范与页面布局

    一.    规范目的: 为提高工作效率,便于后台人员添加功能及前端后期优化维护,输出高质量的文档,在网站建设中,使结构更加清晰,代码简明有序,有一个更好的前端架构,有利于SEO优化.   二.     ...

  3. web前端代码规范——css代码规范

    Bootstrap CSS编码规范 语法 用两个空格来代替制表符(tab) -- 这是唯一能保证在所有环境下获得一致展现的方法. 为选择器分组时,将单独的选择器单独放在一行. 为了代码的易读性,在每个 ...

  4. web前端代码规范 - HTML代码规范

    Bootstrap HTML编码规范 本文转载自w3cschool. 由于bootstrap得到了世界的认可,因此,此规范用于规范html代码有一定的说服力. 交流qq群:164858883.欢迎各位 ...

  5. 规范的web前端代码

    web前端的代码规范主要针对的是HTML,CSS和javaScript代码. 前端代码规范在不同场合会有差异,但是规范的前端代码应该具有以下特征: 1.符合标准 所谓的标准是指W3C指定的web标准, ...

  6. WEB前端开发规范

    WEB前端开发规范 规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档.本文档如有不对或者不合适的地方请及时提出, 经讨论决定后方可更改. 基本 ...

  7. WEB前端开发规范文档(转)

    http://codeguide.bootcss.com/  编写灵活.稳定.高质量的 HTML 和 CSS 代码的规范上面的文档 再结合下面的规范: 无论是从技术角度还是开发视角,对于web前端开发 ...

  8. 网站开发进阶(三十八)Web前端开发规范文档你需要知道的事

    Web前端开发规范文档你需要知道的事 规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进 ...

  9. HTML编码规范 - (WEB前端命名规范)

    HTML编码规范 (一)命名规则: 头:header 内容:content/container 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wr ...

随机推荐

  1. SDN学习之OpenFlow协议分析

    学习SDN相关的学习也已经有快半年了,期间从一无所知到懵懵懂懂,再到现在的有所熟悉,经历了许多,也走了不少弯路,其中,最为忌讳的便是,我在学习过程中,尚未搞明白OpenFlow协议的情况下,便开始对S ...

  2. JavaScript异步编程

    前言 如果你有志于成为一个优秀的前端工程师,或是想要深入学习JavaScript,异步编程是必不可少的一个知识点,这也是区分初级,中级或高级前端的依据之一.如果你对异步编程没有太清晰的概念,那么我建议 ...

  3. tpcc-mysql安装

    1.因为我的虚拟机是centos 7 min版本,所以先得安装gcc gcc++: http://mirror.centos.org/centos/7/os/x86_64/Packages/   rp ...

  4. [刷题]Codeforces 746G - New Roads

    Description There are n cities in Berland, each of them has a unique id - an integer from 1 to n, th ...

  5. 建造者(Builder)模式

    建造者模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 产品的 ...

  6. centos手动配置IP和DNS

    手动设置ip地址 如果虚拟机不能自动获取IP,只能手动配置,配置方法如下: 输入命令 #vi /etc/sysconfig/network-scripts/ifcfg-eth0 [编辑网卡的配置文件] ...

  7. Centos7.0下将Python更新到Python2.7.13

    在云服务器下默认安装的python版本过低,所有我们要手动进行更新(不建议卸载老的版本,然后安装新的,这样会导致大量的异常错误)   为了防止在安装编译python时出错,需先更新gcc :yum - ...

  8. SPRING AOP ....0 can't find referenced pointcut

    下载最新的aspectjweaver就可以了,因为JDK的版本的问题不兼容. //织入点语法 @Pointcut("execution(public * com.frank.dao..*.* ...

  9. .Net程序员学用Oracle系列(29):PLSQL 之批量应用和系统包

    1.批量数据操作 1.1.批量生成数据 1.2.批量插入数据 2.批量生成脚本 3.生成数据字典 4.常见系统包 4.1.DBMS_OUTPUT 4.2.DBMS_RANDOM 4.3.其它系统包及常 ...

  10. PATH menu

    先上效果图 主界面布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" ...