- 空格缩进一般通过键入 2 或 4 个空格来缩进对齐,其按键成本比 Tab 高得多(有些 IDE 可以设置空格宽度),使用 Tab 缩进更快捷;
- 使用 Shift + Tab 组合键可以选取多行向前缩进,使用空格缩进做不到;
- Tab 可以替换,在支持正则搜索的编辑器里,使用
\t
可以匹配搜索全部 Tab,空格缩进做不到。
一套利于团队协作的前端代码风格规范,用以书写标准、清晰、易维护的 HTML、CSS 和 JavaScript 代码
向 腾讯 AlloyTeam 团队 致敬,参考了其团队规范
a-z
,数字 0-9
,连字符 -
,下划线 _
和句点 .
;
- /* Not good */
- xinzengyonghu.jsp
- 8926376.png
- CITYNAMES.json
- 1001-scripts.js
- MyHome.php
- npld.css
- /* Good */
- my_file_name.html
- man-made_list.html // man-made 是一个连字符单词
参照文件命名通用规则。
要合理将文件分类到不同目录,避免一个目录下存放大量的文件。
参照文件命名通用规则。
参照文件命名通用规则。
以下划线 _
开头的 SCSS 文件不会被编译成一个 CSS 文件。
压缩版本的 CSS 文件,文件名后面需加上 .min
后缀。
- basic_layout.css
- _mixin.scss
- common.min.css
参照文件命名通用规则。
压缩版本的 JavaScript 文件,文件名后面需加上 .min
后缀。
- format_string.js
- public.min.js
参照文件命名通用规则。
ico_
前缀。bg_
前缀。_sprite
后缀。_1x
或 _2x
后缀来标记原图和 2 倍图。
- ico_user_default.png
- bg_login_poster.jpg
- ico_station_rank_sprite.png
- ico_tools_1x.png
- ico_tools_2x.png
label
包裹附加文字的表单输入框(radio、checkbox);
- <!-- Not good -->
- <center class="header">...</center>
- <input type="checkbox"> Remeber me
- <DIV CLASS="my-style">...</DIV>
- <span data-fmtDate="1507593600000">2017-10-10</span>
- <a href='http://github.com'>GitHub</a>
- <input type="text" />
- <!-- Good -->
- <header class="header">...</header>
- <label><input type="checkbox"> Remeber me</label>
- <div class="my-style">...</div>
- <span data-fmt-date="1507593600000">2017-10-10</span>
- <a href="http://github.com">GitHub</a>
- <input type="text">
Tab
(占 4 个空格宽度);head
和 body
外,嵌套的节点应该缩进;\t
可以匹配搜索全部 Tab,空格缩进做不到。
- <!DOCTYPE html>
- <html>
- <head>
- <title>Page title</title>
- </head>
- <body>
- <img src="images/company_logo.png" alt="Company">
- <h1 class="class-name" data-tip="slogan">Hello, world!</h1>
- </body>
- </html>
页面开头必须有文档头声明,推荐使用 HTML5 简单的 doctype
声明来启用标准模式,使页面在每个浏览器中尽可能一致的展现。
按照惯例,doctype 应大写。
- <!DOCTYPE html>
- <html>
- ...
- </html>
在 HTML 中指定字符编码,让浏览器轻松、快速的确定适合网页内容的渲染方式。
字符编码通常设为 UTF-8
。
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- </head>
- ...
- </html>
指定使用本地最高版本的 IE 来渲染页面。
对于国内常见的双核浏览器,指定优先采用极速模式(webkit 内核)来渲染页面。(目前仅 360 浏览器支持)
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="X-UA-Compatible" content="IE=Edge">
- <meta name="renderer" content="webkit">
- </head>
- ...
- </html>
<head></head>
内;</body>
标签前面,以免阻塞页面加载,同时也避免了文档加载完成前 JS 无法获取 DOM 元素的问题。
- <!DOCTYPE html>
- <html>
- <head>
- <link rel="stylesheet" href="my_style.css">
- <style>
- ...
- </style>
- </head>
- <body>
- ...
- <script src="my_script.js"></script>
- <script>
- ...
- </script>
- </body>
- </html>
HTML 属性应当按照特定的顺序依次排列,确保代码的易读性和可维护性。
Class 用于标识高度可复用组件,因此应该排在首位;id 用于标识具体组件,排在第二位。
- class
- id
- name
- data-*
- src, for, type, href, value , max-length, max, min, pattern
- placeholder, title, alt
- aria-*, role
- required, readonly, disabled
HTML5 规范中,boolean 属性不需要声明属性值。
Boolean 属性的存在表示取值为 true,不存在则表示取值为 false。
- <input type="text" disabled="disabled"> <!-- Not good -->
- <input type="text" disabled> <!-- Good -->
- <input type="text" readonly="true"> <!-- Not good -->
- <input type="text" readonly> <!-- Good -->
- <input type="checkbox" checked="checked"> <!-- Not good -->
- <input type="checkbox" checked> <!-- Good -->
- <!-- Not good -->
- <select>
- <option value="1" selected="selected">1</option>
- </select>
- <!-- Good -->
- <select>
- <option value="1" selected>1</option>
- </select>
- <audio src="my_voice.mp3" controls="controls"> <!-- Not good -->
- <audio src="my_voice.mp3" controls> <!-- Good -->
UTF-8
编码;
- .style {} /*-- Not good --*/
- UL > LI {font-size: 18px;} /*-- Not good --*/
- ul > li {font-size: 18px;} /*-- Good --*/
- .style {color: red} /*-- Not good --*/
- .style {color: red;} /*-- Good --*/
与 HTML 缩进方式一样,缩进使用 1 个 Tab
(占 4 个空格宽度)。
- .style {
- width: 100px;
- height: 80px;
- }
:
后加空格;,
后加空格;>
、+
、~
前后加空格;{
前加空格;!important
的 !
前加空格;@else
前后加空格;,
后加空格;
- /* Not good */
- .style {
- color :red! important;
- background-color: rgba(0,0,0,.5);
- }
- /* Good */
- .style {
- color: red !important;
- background-color: rgba(0, 0, 0, .5);
- }
- /* Not good */
- .style ,
- .box{
- ...
- }
- /* Good */
- .style,
- .box {
- }
- /* Not good */
- .box>.style {
- ...
- }
- /* Good */
- .box > .style {
- ...
- }
- /* Not good */
- .style{
- ...
- }
- /* Good */
- .style {
- ...
- }
- /* Not good */
- @if($variable*2>10){
- ...
- }@else{
- ...
- }
- /* Good */
- @if ($variable * 2 > 10) {
- ...
- } @else {
- ...
- }
{
后和 }
前要换行,如果只有一条属性则例外,无需换行;,
后要换行;
- /* Not good */
- .style
- {color: red; background-color: black;}
- /* Good */
- .style {
- color: red;
- background-color: black;
- }
- /* Not good */
- .style {
- width: 100px;
- }
- /* Good */
- .style {width: 100px;}
- /* Not good */
- .container, .form-box {
- ...
- }
- /* Good */
- .container,
- .form-box {
- ...
- }
font-family
中含有空格的字体名需要加引号;url
的内容要用引号。
- .style:before {
- content: "";
- background-image: url("logo.png");
- }
- li[data-type="single"] {
- font-size: 18px;
- font-family: "Segoe UI", "Microsoft Yahei";
- }
/* 注释内容 */
;
// 注释内容
,不会输出到编译后的 CSS 中;/*! 注释内容 */
;/*
之后、*/
之前和 //
之后要加一个空格;//
写在代码右侧时,其与左侧代码间隔 2
个空格。
注:
//
注释只用于 SCSS 中。
- /* Modal header */
- .modal-header {
- ...
- }
- /*
- * Modal header
- */
- .modal-header {
- ...
- }
- .modal-header {
- /* 150px = left + right */
- width: 150px;
- &.wide { // 宽屏模式
- width: 300px;
- }
- }
js-
前缀;
- /* Not good */
- .b { ... }
- .yonghu-list { ... }
- .spcart { ... }
- /* Good */
- .btn { ... }
- .user-list { ... }
- .shopping-cart { ... }
- /* class */
- .element-content {
- ...
- }
- /* id */
- #myDialog {
- ...
- }
- /* SCSS 变量 */
- $color-black: #000;
- /* SCSS placeholder */
- %dialog-border {
- ...
- }
- /* SCSS 函数 */
- @function pxToRem($px) {
- ...
- }
- /* SCSS 混合 */
- @mixin centerBlock {
- ...
- }
- .declaration-order {
- /* Positioning */
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 100;
- /* Box model */
- display: block;
- float: right;
- width: 100px;
- height: 100px;
- /* Typography */
- font: normal 13px "Helvetica Neue", sans-serif;
- line-height: 1.5;
- color: #333;
- text-align: center;
- /* Visual */
- background-color: #f5f5f5;
- border: 1px solid #e5e5e5;
- border-radius: 3px;
- /* Misc */
- opacity: 1;
- }
0.x
的小数,则省略小数点前的 0;0
,则省略单位。
- /* Not good */
- .style {color: #333333;}
- .style {padding: 0.5em 1em 0.5em 1em;}
- .style {margin: 0px 0px 0px 10px;}
- /* Good */
- .style {color: #333;}
- .style {padding: .5em 1em;}
- .style {margin: 0 0 0 10px;}
如非必要,尽量不要手写前缀属性,推荐使用自动化工具来处理,例如:autoprefixer。
- /* Not good */
- .style {
- user-select: none;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- }
- /* Good */
- .style {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- }
@UTF-8
字符集声明,避免乱码;!important
;*
选择器。.js
文件中,页面只放当前页面专用的 JS 代码;UTF-8
编码;
与 HTML 缩进方式一样,缩进使用 1 个 Tab
(占 4 个空格宽度)。
- var x = 1,
- y = 1;
- if (x === y) {
- ...
- } else {
- ...
- }
+
, -
, *
, /
, %
, =
, <
, >
等;{
前要加空格else
, catch
, finally
;if
, for
, while
, do
, switch
, case
, try
, return
, typeof
;&&
, ||
;?
, :
前后需要加空格;(
前不要加空格。
- if (x && x === y) {
- x++;
- } else {
- z = x < 10 ? '0' + x : x;
- }
- var a = {
- b: 'string',
- c: function() {
- ...
- }
- };
- var arr = [1, 2, 3];
- for (var i = 0, len = arr.length; i < len; i++) {
- ...
- }
- function doSomething(a, b, c) {
- foo();
- ...
- }
{
后和 }
前要换行;,
后要换行;.
前换行;?
后换行。
- var x = 1,
- y = 1,
- a, b, c;
- (function($) {
- $('#elementId').find('.a-very-long-name-sub-element')
- .css({
- color: 'red',
- fontSize: '18px'
- })
- .fadeIn(300);
- })(jQuery);
- var iHaveVeryLongName =
- ((a && b) || (b && c) || (a && c)) ?
- x + y : x - y;
return
语句末尾要加分号;throw
语句末尾要加分号;break
后面要加分号;continue
后面要加分号;do-while
语句末尾要加分号。
- var x = 1;
- for (var i = 0; i < 10; i++) {
- x++;
- if (x % 2 === 0) {
- ...
- continue;
- }
- }
最外层统一使用单引号。
不但比双引号输入更快捷(不用按 Shift 键),而且在插入 HTML 片段时好处十分明显。
- var x = 'string text';
- var html =
- '<div class="box">' +
- '<h1>Title</h1>' +
- '<p>Hello World!</p>' +
- '</div>';
下列关键字后必须有大括号(即使代码块的内容只有一行):if
, else
, for
, while
, do
, switch
, try
, catch
, finally
。
- /* Not good */
- if (conditions)
- return true;
- /* Good */
- if (conditions) {
- return true;
- }
// 注释内容
和 /* 注释内容 */
:
// 注释内容
用于单行代码注释;/* 注释内容 */
常用作代码段的注释,或较正式的声明中,如函数、业务功能等的描述中。/*
之后、*/
之前和 //
之后要加一个空格;//
写在代码右侧时,其与左侧代码间隔 2
个空格。
- var a = true; // 同行注释
// 顶格写的单行注释- var elm = ((a && b) || (b && c)) ? x + y : x - y;
- /**
- * function name
- * @desc 一个带参数的高大上函数
- * @param {string} a - 参数 a
- * @param {number} b - 参数 b,默认值为1
- * @param {string} c - 参数 c 有两种支持的取值 x - 表示情况1 y - 表示情况2
- * @param {object} d - 参数 d 为一个对象
- * @param {object[]} e - 参数 e 为一个对象数组
- * @param {boolean} [f] - 参数 f 是一个可选参数
- * @return {array} - 返回一个数组
- */
- function foo(a, b, c, d, e, f) {
- ...
- }
this
引用,请使用 _this
、that
或 self
中的一个来命名;$
开头命名;ID
在变量名中全大写;URL
在变量名中全大写;Android
在变量名中大写第一个字母;iOS
在变量名中小写第一个,大写后两个字母。
- var thisIsMyName;
- var goodID;
- var reportURL;
- var AndroidVersion;
- var iOSVersion;
- var MAX_COUNT = 10;
- var self = this;
- var $body = $('body');
(
前不要空格,但 {
前一定要有空格;,
分隔,注意逗号后有一个空格;_
开头;
- /* Not good */
- function UserList (a,b){
- ...
- }
- /* Good */
- function buildUserList(a, b) {
- ...
- }
- /* Not good */
- doSomething (item);
- /* Good */
- doSomething(item);
- function SetPerson(name){
- this.name = name;
- }
- var people = new SetPerson('王大锤');
- /* Not good */
- var a = {
- 'b': 1,
- 'c': 2,
- };
- var a = {b: 1, c: 2};
- /* Good */
- var a = {
- b: 1,
- c: 2
- };
- /* Not good */
- var a;
- if (a === null) {
- ...
- }
- /* Good */
- var a = null;
- if (a === null) {
- ...
- }
- var userInfos = data.userInfo;
- buildUserList(userInfos);
- userInfos = null; // 及时清除 userInfos 的引用,释放内存资源
- doOtherThings();
永远不要直接使用 undefined
进行变量判断。
使用 typeof
和字符串 undefined
对变量进行判断。
- /* Not good */
- if (person === undefined) {
- ...
- }
- /* Good */
- if (typeof person === 'undefined') {
- ...
- }
===
, !==
代替 ==
, !=
;Array
, Date
;eval
;with
;for-in
里一定要有 hasOwnProperty
的判断;setTimeout()
和 setInterval()
传入函数而不是字符串。
- /* Not good */
- if (a == 1) {
- a++;
- }
- /* Good */
- if (a === 1) {
- a++;
- }
- /* Not good */
- Array.prototype.count = function(value) {
- return 4;
- }
- /* Not good */
- var x = 1;
- function test() {
- if (x === 10) {
- var x = 0;
- }
- x += 1;
- }
- /* Good */
- for (key in obj) {
- if (obj.hasOwnProperty(key)) {
- // 确保 obj[key] 属于对象而不是继承
- console.log(obj[key]);
- }
- }
- /* Not good */
- setInterval('getStatus()', 1000);
- setTimeout('if(!true){ doSomething() }', 500);
- /* Good */
- setInterval(getStatus, 1000);
- setTimeout(
- if (!true) {
- doSomething();
- }
- }, 500);
前端开发首推的编辑器是 VSCode,微软出品,免费且功能强大,颜值极高,拥有较为丰富的插件资源,是一个“披着编辑器外衣的 IDE”。
其次是 Atom,GitHub 御用编辑器,也是一款非常不错的免费编辑器,但对机器性能有一定要求,启动较慢。
最后是 Sublime Text,小巧轻便,速度快,是一款收费编辑器(可无限试用)。
配置文件的内容说明如下:
properties:
- # 表明是最顶层的配置文件
- root = true
- [*]
- # 文件统一采用 UTF-8 无 BOM 编码
- charset = utf-8
- # 缩进方式统一使用 tab 键
- indent_style = tab
- # 缩进字符数为 4
- indent_size = 4
- # 换行符统一使用 Unix-style 0x0A(LF)
- end_of_line = lf
- # 文件以一个空白行结尾
- insert_final_newline = true
- # 自动删除行尾空格
- trim_trailing_whitespace = true
- [*.md]
- # markdown 文件不删除行尾空格,以免导致排版错乱
- trim_trailing_whitespace = false
(插件和配置文件玩命整理中...)