前端代码风格规范

说明

  • 版本:1.0.0
  • 上次修改时间:2020 年 4 月 29 日

写在前面

  • 本文档适用于原生前端代码的风格样式及 Vue 的风格样式,会在内容中做具体的说明
  • 部分内容会与 HTML 规范、CSS 规范、JavaScript 规范、Vue 规范等规范有重复部分
  • 配套使用开发工具VsCode中的Prettier - Code formatter插件作为工具
  • Vue 规范采用开发工具VsCode中的Vetur
    插件作为工具
  • CSS 命名规范可参考BEM
  • 等级分为: - 【强制】:必须遵循的规则,会通过 eslint 和 gitlab 等持续集成方式进行检查和限制 - 【强烈推荐】:有部分代码编辑工具或插件工具来协助完成的标准,如【prettier】【vscode】等 - 【推荐】:更好的协助开发人员写出可读性和可维护性高的代码 - 【建议】:同【推荐】

HTML 代码风格

强制规则

1.使用正确的文档类型【强制】

<!DOCTYPE html>

启用 viewport 模式

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

启用最新渲染模式

<meta http-equiv="X-UA-Compatible" content="chrome=1,IE=edge">

启用 UTF-8 编码方式

<meta charset="UTF-8">

html 文档使用中文

<html lang="zh-CN">

一个标准的 html 的初始文件

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="chrome=1,IE=edge">
  <title>Document</title>
</head>
<body>

</body>
</html>

2.使用小写元素名【强制】

// bad
<SECTION>
  <p>This is a paragraph.</p>
</SECTION>

// bad
<Section>
  <p>This is a paragraph.</p>
</SECTION>

// good
<section>
  <p>This is a paragraph.</p>
</section>

3.使用小写属性名【强制】

// bad
<div CLASS="menu">

// good
<div class="menu">

4.空行和缩进【强制】

请勿毫无理由地增加空行。

为了提高可读性,请增加空行来分隔大型或逻辑代码块。

为了提高可读性,请增加两个空格的缩进。(如果是 jQuery 为主体依赖的项目则采用四个空格,例如:SGS9.0 之前的客户端站点开发)

请勿使用没有必要的空行和缩进。没有必要在短的和相关项目之间使用空行,也没有必要缩进每个元素

此规则同样适用于 CSS、JavaScript、Vue 脚本等

<!-- bad -->
<body>

  <h1>Famous Cities</1>

  <h2>Tokyo</h2>

  <p>
    Tokyo is the capital of Japan, the center of the Greater Tokyo Area,
    and the most populous metropolitan area in the world.
    It is the seat of the Japanese government and the Imperial Palace,
    and the home of the Japanese Imperial Family.
  </p>

</body>

<!-- 表格示例 good -->
<table>
  <tr>
    <th>Name</th>
    <th>Description</th>
  <tr>
  <tr>
    <td>A</td>
    <td>Description of A</td>
  <tr>
  <tr>
    <td>B</td>
    <td>Description of B</td>
  <tr>
</table>

<!-- 列表示例 good -->
<ol>
  <li>LondonA</li>
  <li>Paris</li>
  <li>Tokyo</li>
</ol>

5.对于无需自闭合的标签,必须闭合【强制】

<!-- bad -->
<input type="text" name="title">

<!-- good -->
<input type="text" name="title" />

6.文件扩展名【强制】

HTML 文件名应该使用扩展名 .html(而不是 .htm)

强烈推荐规则

1.必需的属性【强烈推荐】

请始终对图像使用 alt 属性。当图像无法显示时该属性很重要。

<img src="html5.gif" alt="HTML5" />

2.避免长代码行【强烈推荐】

当使用 HTML 编辑器时,通过左右滚动来阅读 HTML 代码很不方便。

请尽量避免代码行超过 80 个字符。(CSS、JavaScript、Vue 脚本同样推荐)

3.标签的使用应尽量简洁,减少不必要的标签【强烈推荐】

<!-- bad -->
<span class="avatar">
    <img src="image.png">
</span>

<!-- good -->
<img class="avatar" src="image.png">

4.建议不要在标签上直接使用 style 样式【强烈推荐】

<!-- bad -->
<div style="width:300px;height:200px;font-size:14px;"></div>

推荐及建议规则

1.样式表【推荐】

请使用简单的语法来链接样式表(type 属性不是必需的)

<link rel="stylesheet" href="styles.css">

2.在 HTML 中加载 JavaScript【推荐】

请使用简单的语法来加载外部脚本(type 属性不是必需的)

<script src="myscript.js">

CSS/SASS/SCSS 代码风格

强制规则

1.规则默认换行【强制】

/* bad */
p.into {font-family:"Verdana"; font-size:16em;}

/* good */
body {
  background-color: lightgrey;
  font-family: "Arial Black", Helvetica, sans-serif;
  font-size: 16em;
  color: black;
}

2.每条样式声明后面都加上那个分号【强制】

3.禁止使用 @import 引入 CSS 文件【强制】

4.类名中的字母一律小写,不使用驼峰,只使用字母、数字以及“-”【强制】

驼峰写法或下划线分割单词的写法都存在一个问题,我们的主观无法判断单词的分割。比如yellowgreen这个单词,如果使用分单词的写法可能被写成yellowGreenyello_green,造成风格不统一

/* bad */
.mapContainer {}
.MAPCONTAINER {}

/* good */
.map-container {}
.map-container1 {}

5.类名使用完整英文单词或抽掉空格的英文词组【强制】

/* bad */
.konnichiwa {} /* 非英文单词会导致大家无法正常阅读 */
.modl {} /* 每个人的缩写未必一致,会造成不统一 */
.hello-world {} /* 类名请只使用一个没有分隔[-_]的词 */

/* good */
.module {}
.helloworld {}

强烈推荐规则

1.大括号与选择器之间留空,冒号后面留空,注释内外前后留空【强烈推荐】

/* 我是注释 */
div { /* 我是注释 */ }
span {
  color: red; /* 我是注释 */
}

2.多个选择器使用逗号隔开时写在不同的行,大括号不要另起一行【强烈推荐】

div,
span {
  color: red;
  font-size: 12px;
}

3.用逗号分隔的多个样式值写成多行【强烈推荐】

.block {
  box-shadow: 0 0 0 rgba(#000, 0.1),
              1px 1px 0 rgba(#000, 0.2),
              2px 2px 0 rgba(#000, 0.3),
              3px 3px 0 rgba(#000, 0.4),
              4px 4px 0 rgba(#000, 0.5);
}

4.16 进制颜色值中的字母统一小写【强烈推荐】

/* bad */
color: "#FFFFFF";

/* good */
color: "#ffffff";

5.有且仅当有层级关系时使用“-”连接,比如组件内的元素类名采用组件名“-”子类名的形式【强烈推荐】

<div class="uploader">
  <input type="text" class="uploader-text" />
  <input type="button" class="uploader-button" />
</div>

选择器在 CSS 中应该平行地定义,以便降低优先级,便于覆写

.uploader {}
.uploader-text {}
.uploader-button {}

6.书写顺序【强烈推荐】

定位属性:position display float left top right bottom overflow clear z-index

自身属性:width height margin padding border background

文字样式:font-family font-size font-style font-weight font-varient color

文本属性:text-align vertical-align text-wrap text-transform text-indent text-decoration letter-spacing word-spacing white-space text-overflow

css3 中新增属性:content box-shadow border-radius transform

7.尽量使用缩写属性【强烈推荐】

/* bad */
.list-box {
  padding-bottom: 10px;
  padding-top: 20px;
  padding-left: 30px;
  padding-right: 40px;
}

/* good */
.list-box {
  padding: 20px 40px 30px 10px;
}

推荐及建议规则

1.避免使用 ID 选择器【推荐】

权重太高,不易维护

2.保持结构灵活性【推荐】

我们的设计应该尽可能地让样式可以用于更多标签

<style>
.section {}
.section-head {}
.section-body {}
</style>
<div class="section">
  <div class="section-head"></div>
  <div class="section-body"></div>
</div>
<dl class="section">
  <dt class="section-head"></dt>
  <dd class="section-body"></dd>
</dl>

甚至可以任意调整结构

<style>
.article {}
.article-main {}
.article-title {}
</style>
<div class="article">
  <div class="article-main">
    <div class="article-title">
      <!-- ... -->
    </div>
    <!-- ... -->
  </div>
</div>
<div class="article">
  <div class="article-title">
    <!-- ... -->
  </div>
  <div class="article-main">
    <!-- ... -->
  </div>
</div>

参考链接

Vue 风格指南

HTML(5) 样式指南和代码约定

饿了么前端风格指南

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 更新时间:2016/5/13 介绍 本文档所提供的编码规范,适用于主要的Python发行版中组成标准库的Pytho...
    超net阅读 5,842评论 0 15
  • JavaScript编码规范 1 前言 2 代码风格 2.1 文件 2.2 结构 2.2.1 缩进 2.2.2 空...
    江湖相望知冷暖阅读 447评论 0 0
  • JavaScript编码规范 1 前言 [2 代码风格] [2.1 文件] [2.2 结构] [2.2.1 缩进]...
    忆飞阅读 1,152评论 1 2
  • 介绍 愚蠢的使用一致性是无知的怪物(A Foolish Consistency is the Hobgoblin ...
    slords阅读 1,938评论 0 2
  • 2017.12.18 佳哥说: 感情这东西,感觉上来时,连幼儿园的都不放过。 2018年5月22日 佳哥: 我擦,...
    一度佳阅读 138评论 0 0