前端开发:【HTML、CSS和Javascript的基本开发规范】

一、What.

  本文的“html、css和js的基本开发规范”所指的是什么?

首先,它不涉及太深层的性能优化。其次,它指的只是个人所认为的前端开发规范化和专业化路上的第一步,主要分为HTML开发规范、CSS开发规范和Javascript开发规范三个模块。

二、Why.

  为什么学习前段基本的开发规范?

我认为开发的规范就像做人的原则一样,一个人走向成熟的标志之一就是在为人处世的原则上的体现。前端开发人员刚入门时,几乎都没有自己的开发规范。当你基本能开发出一般页面、达到入门级水平后,可能你觉得自己的代码很乱、容错性和可维护性都很差,那么此时是你学习前端开发规范的最佳时刻了。

三、How.

  怎样建立基本的前端开发规范?我认为可以从如下几个方面着手。

(一)HTML规范.

  • 页面的第一行添加标准模式声明 <!DOCTYPE html>
  • 代码缩进:tab键设置四个空格(通常在软件右下角设置相应空格大小,有些IDE已自动设置好。)
  • html中除了开头的DOC和 'UTF-8'或者head里特殊情况可以大写外,其他都为小写,css类都为小写。
  • 为 html 根元素指定 lang 属性,用来定义当前文档显示的语言类型,例如 lang="zh-CN"、lang="en",利于搜索引擎、屏幕阅读器等对页面的语言类型准确识别。
  • 设置针对IE8浏览器的兼容设置, <meta http-equiv="X-UA-Compatible" content="IE=Edge">(用来指定IE8浏览器去模拟某个特定版本的IE浏览器的渲染方式); <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />添加”chrome=1“将允许站点在使用了谷歌浏览器内嵌框架(Chrome Frame)的客户端渲染,对于没有使用的,则没有任何影响。
  • 引入css文件使用<link>标签而不用@import(指令慢,@import多用于css文件内引入。)
  • 在HTML5规范下,在引入CSS和JS时不需要指明 type(text/css 和 text/javascript 分别是他们的默认值)
  • 注释全局统一("<! -- 注释内容--!>" --后不要留空格,若留空格,其他注释全加空格,方便后续程序开发)
  • 命名规范:class用 “-” ;ID用 “_” ;name:data-自定义名;
    根据内容书写语义化编码:可用以项目名简写开头-语义化名称;
    class="tb-head"; id="tb_head"; data-head="tb-head";
  • 属性排序(方便整理代码):
    1、根据属性定义排序 : class,id,name排序 (建议用此方法)
    (class用于标识高度可复用组件,因此排首位,id用于标识具体组件,慎用,因此排第二位);
    2、特殊属性可根据元素跟随排序,后根据(1)方法排序;
    3、根据字母开头顺序排序;
<a class="..." id="..." data-modal="toggle" href="#">
    Example link
</a>
  • 减少标签数量(DOM元素)
  • 在HTML5规范下,布尔型属性可以在声明时不赋值
    <input type="checkbox" value="1" checked>

(二)CSS规范.

  • 缩进:使用 4 个空格做为一个缩进层级,不允许使用 2 个空格 或 tab 字符。
  • 添加空格(投入生产前,可以通过某些工具压缩css文件,去掉空格):
    1、每个声明块的左花括号前添加一个空格;
    2、每条声明语句的" : "后应该插一个空格;
    3、属性多值每个逗号后应该插入空格 eg:box-shadow,border-image;
    4、不要在rgb()、rgba()、hsl()、hsla() 或 rect() 值的内部的逗号后面插入空格;
    5、对于属性值或颜色参数,省略小于 1 的小数前面的 0 (例如,.5 代替 0.5;-.5px 代,替 -0.5px)
    6、 >、+、~ 选择器的两边各保留一个空格。
.content > .content-header > .title {
    font-size: 2em;
}
  • 选择器规范
    1、当构建选择器时应该使用清晰,准确和有语义的 class 名。尽量减少使用标签选择器;
不推荐:
div.content > header.content-header > h2.title {
    font-size: 2em;
}

 推荐:
.content > .content-header > .title {
    font-size: 2em;
}

2、使用提供的简写属性(font、background等等)
3、为选择器中的属性添加双引号 不允许单引号
例如,input[type="text"]。只有在某些情况下是可选的,但是,为了代码的一致性,建议都加上双引号。
4、选择器的嵌套层级应不大于 3 级,位置靠后的限定条件应尽可能精确,避免使用不必要的嵌套,只有在必须将样式限制在父元素内(也就是后代选择器),并且存在多个需要嵌套的元素时才使用嵌套。

// Without nesting
.table > thead > tr > th { … }
.table > thead > tr > td { … }

// With nesting
.table > thead > tr {
  > th { … }
  > td { … }
}

5、为选择器分组时,将单独的选择器单独存放在一行 。

.selector,
.selector-second,
.selector[type="text"] {
    padding: 15px;
    margin-bottom: 15px;
    background-color: rgba(0, 0, 0, 0.5);
    box-shadow: 0 1px 2px #ccc, inset 0 1px 0 #fff;
}
  • 简写:十六进制值应该全部小写,尽可能简写 eg:#fff;.避免为 0 值指定单位;例如,用 margin: 0; 代替 margin: 0px;
    同时,应当尽量限制使用简写形式的属性声明,过度使用简写形式的属性声明会导致代码混乱,并且会对属性值带来不必要的覆盖从而引起意外的副作用。常见的滥用简写属性声明如下几个:
    margin: 0 0 10px;可以用margin-bottom: 10px;
    background: red;可以用 background-color: red;
    background: url("image.jpg");可以用background-image: url("image.jpg");
  • 行规范:
    1、每行不得超过 120 个字符,除非单行不可分割。
    2、声明块右花括号应当成行。
    3、对于超长的样式,在样式值的 空格 处或 , 后换行,建议按逻辑分组。
  • 声明顺序:
    1、. 相关的属性声明应当归为一组,并按照下面的顺序排列:
    Positioning、Box model、Typographic、Visual
    由于定位(positioning)可以从正常的文档流中移除元素,并且还能覆盖盒模型(box model)相关的样式,因此排在首位。盒模型排在第二位,因为它决定了组件的尺寸和位置。其他属性只是影响组件的内部(inside)或者是不影响前两组属性,因此排在后面。
.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;
}
  • 带前缀的属性:当使用特定厂商的带有前缀的属性时,通过缩进的方式,让每个属性的值在垂直方向对齐,这样便于多行编辑。
-webit-box-show: 0 1px 2px rgba(0,0,0,.15);
       box-show: 0 1px 2px rgba(0,0,0,.15);

(三)Javascript规范

  • 命名:
    1、变量命名:
    变量命名使用有意义的单词和驼峰式命名。
    临时变量简写:str,num,bol,fun,arr。
    循环变量简写:i , j , k。
    全局变量使用g作为前缀,如gUserName , gLoginTime。
    常量全部字母都大写,如: PI , COPYRIGHT。注:常量可存在于函数中,也可存在于全局。
    2、函数(方法)命名:
    统一使用动词或动词加名词的形式。如getVersion() , submitForm()。
    涉及返回逻辑值的函数可以使用is , has 等表示逻辑的词语代替动词。 内部函数前加上 ‘‘前缀。
    可选参数以 ‘opt’ 开头.
    3、类(对象)命名:
    类名首字母大写。
    属性名为具有一定意义的名词。私有属性加 “
    “。
    方法名为有意义的动词[+名词],首字母小写。私有方法加 ‘_”。
  • 命名空间:为避免全局命名的冲突,在全局作用域上使用一个与项目或文件相关的名字来划分作用域空间.(类似于java中的封装)。
var calcultor = {};
calcultor.add = function() {
...
};
calcultor.sub = function() {
...
};
  • 传递的类型:
    原始值:按值传递 string/number/boolean/null/undefined 注:null和undefine是不同的.
    复杂类型:按引用传递 object/array/function.
  • 对象规范:
    1、使用字面值创建对象。
/*bad*/
var item = new Object();
/*good*/
var item = {};

2、不要使用保留字作为键。

/*bad*/
var superman = {
class:'superhero',
 default:{ clark:'kent' },
private: true
}
/*good*/
var superman = {
klass: 'superhero',
defaults:{ clark: 'kent' },
hidden: true
};

3、 当使用变量访问对象中的属性时使用中括号(俗称方括号)。

var luke = {
    jedi: true,
    age: 28
};
function getProp(prop){
    return luke[prop];
}
var isJedi = getProp('jedi');

  • 数组规范:
    1、使用字面量创建数组。
/*bad*/
var items = new Array();
/*good*/
var items = [];

2、数组长度不知时,使用push添加元素。

var someStack = [];
/*bad*/
someStack[someStack.length] = 'abcdefg';
/*good*/
someStack.push('abcdefg');

3、使用slice()方法拷贝数组。

var len = items.length,
     itemsCopy = [],
     i;
/*bad*/
for(i = 0; i < len; i++){
    itemsCopy[i] = items[i];
}
/*good*/
itemsCopy = items.slice();
  • 函数规范:
    1、不要在一个非函数块里面声明一个函数,应该把那个函数赋给一个变 量。浏览器让你这么做,但是解析的情况是不同的。
/*bad*/
if(currentUser){
    function test(){
        console.log('Nope.');
    }
}
/*good*/
if(currentUser){
    var test = function test(){
        console.log('Yup.');
    };
}

2、请勿把参数命名为 arguments,这会对函数内的 arguments对象产生影响。

/*bad*/
function nope(name, options, arguments){
   
}
/*good*/
function yup(name, options, args){
    
}
  • 条件表达式的强类型转换规则:
    对象被计算为true
    Undefined被计算为false
    Null被计算为false
    布尔值被计算为布尔的值
    数字如果是+0, -0,NaN被计算为false
    字符如果是空字符串,则被计算为false,否则为true
    字符串如果是空字符串,则被计算为false,否则为true
  • 事件:当给事件附加数据时,传入一个哈希而不是原始值,这可以让后面的贡献者加入更多数据到事件数据 里而不用找出并更新那个事件的事件处理器。
/*bad*/
$(this).trigger('listingUpdated', listing.id);
$(this).on('listingUpdated', function(e,listingId){
    /*do something with listingId*/
});
/*good*/
$(this).trigger('listingUpdated', {listingId: listing.id});
$(this).on('listingUpdated', function(e, data){
   /*do something with data.listingId*/
});

四、Summary.

本文申明,内容中多为作者从多篇优质文章中整合搜刮而来,如有不当之处,请多指正。为了自己以后查阅方便,也为了有相同需求的朋友提供便利。最后,愿你我像坚守做人的原则一样,坚守标准的开发规范。(当然,我们可以在前人积累的经验上,建立属于自己的、更优质的开发规范。)

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

推荐阅读更多精彩内容