基本準(zhǔn)則
- 符合web標(biāo)準(zhǔn),html語(yǔ)義化冤竹;
- html拂封,css,JavaScript分離鹦蠕;
- 代碼簡(jiǎn)潔有序冒签,盡可能減少冗余代碼,降低服務(wù)器的負(fù)載钟病;
- 解決pc端各瀏覽器的兼容性問(wèn)題萧恕,處理移動(dòng)端各設(shè)備適配問(wèn)題。
通用規(guī)范
- 用四個(gè)空格代替
TAB
鍵
因?yàn)樵诓煌到y(tǒng)的編輯工具對(duì)`tab`解析不一樣肠阱,`windows`下的`tab`鍵是占四個(gè)空格的位置票唆,而在`linux`下會(huì)變成占八個(gè)空格的位置(除非你自己設(shè)定了tab鍵所占的位置長(zhǎng)度)。
如sublime text辖所,可在這里對(duì)`tab`進(jìn)行設(shè)置
![alt text](http://imglf0.ph.126.net/E0E8CvNB_YvjIzS972wZ2w==/6608627832887488476.png?_=3831620 "sublime")
CSS
樣式屬性或者JAVASCRIPT
代碼后加“;”方便壓縮工具“斷句”惰说。- 文件內(nèi)容編碼統(tǒng)一為
UTF-8
。
文件規(guī)范
- 文件名統(tǒng)一使用小寫(xiě)英文單詞缘回,多個(gè)單詞用駝峰命名法吆视,如不使用駝峰命名法,建議使用"-"而不是"_"酥宴。
- 一些瀏覽器會(huì)將還有這些詞的作為廣告攔截啦吧,文件命名、ID拙寡、CLASS等所有命名避免以下詞匯:
`ad`授滓、`ads`、`adv`、`banner`般堆、`sponsor`在孝、`gg`、`guangg`淮摔、`guanggao`等私沮。
HTML書(shū)寫(xiě)規(guī)范
- 為每個(gè)
HTML
頁(yè)面的第一行添加標(biāo)準(zhǔn)模式(standard mode)的是聲明,確保在每個(gè)瀏覽器中擁有一致的展現(xiàn)和橙。
<pre>
<code><!DOCTYPE html></code>
</pre>
文檔類型聲明統(tǒng)一為HTML5
聲明類型仔燕,編碼統(tǒng)一為UTF-8
。
<pre>
<code><meta charset="UTF-8"></code>
</pre>
<HEAD>
中添加信息魔招。
<pre>
<code>
<meta name="author" content="smile@kang.cool">//作者
<meta name="description" content="hello">//網(wǎng)頁(yè)描述
<meta name="keywords" content="a,b,c">//關(guān)鍵字,“晰搀,”分隔
<meta http-equiv="expires" content="Wed, 26 Feb 1997 08:21:57 GMT">//設(shè)定網(wǎng)頁(yè)的到期時(shí)間。一旦網(wǎng)頁(yè)過(guò)期办斑,必須到服務(wù)器上重新調(diào)閱
<meta http-equiv="Pragma" content="no-cache">//禁止瀏覽器從本地機(jī)的緩存中調(diào)閱頁(yè)面內(nèi)容
<meta http-equiv="Window-target" content="_top">//用來(lái)防止別人在框架里調(diào)用你的頁(yè)面
<meta http-equiv="Refresh" content="5;URL=http://kahn1990.com/">//跳轉(zhuǎn)頁(yè)面外恕,5指時(shí)間停留5秒 網(wǎng)頁(yè)搜索機(jī)器人向?qū)АS脕?lái)告訴搜索機(jī)器人哪些頁(yè)面需要索引俄周,哪些頁(yè)面不需要索引
<meta name="robots" content="none">//content的參數(shù)有all,none,index,noindex,follow,nofollow吁讨,默認(rèn)是all
<link rel="Shortcut Icon" href="favicon.ico">//收藏圖標(biāo)
<meta http-equiv="Cache-Control" content="no-cache, must-revalidate">//網(wǎng)頁(yè)不會(huì)被緩存
<meta name="viewport" content="width=device-width,initial-scale=1.0">//如果是移動(dòng)端項(xiàng)目,需加上峦朗。告訴瀏覽器識(shí)別設(shè)備窗口尺寸建丧,并禁止縮放。
</code>
</pre>
IE
支持通過(guò)特定的<meta>
標(biāo)簽來(lái)確定繪制當(dāng)前頁(yè)面所采用的的IE版本波势。除非有強(qiáng)烈的特殊需求翎朱,否則最好是設(shè)置為edge mode
,從而通知IE
采用其所支持的最新的模式尺铣。
<pre>
<code><meta http-equiv="X-UA-Compatible" content="IE=Edge"></code>
</pre>- 非特殊情況下
CSS
樣式文件外鏈至head
內(nèi)拴曲,JavaScript
文件外鏈至body
底部。
<pre>
<code><!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="css/main.css">
</head>
<body>
<!-- 邏輯代碼 -->
<!-- 邏輯代碼底部 -->
<script src="lib/jquery/jquery-2.1.1.min.js"></script>
</body>
</html></code>
</pre>
引入
JavaScript
庫(kù)文件凛忿,文件名須包含庫(kù)名稱及版本號(hào)及是否為壓縮版澈灼。
<pre>
<code>jQuery-1.11.3.min.js</code>
</pre>
引入JavaScript
插件,文件名格式為庫(kù)名稱+.+插件名稱店溢。
<pre>
<code>jQuery.cookie.js</code>
</pre>
HTML
屬性應(yīng)當(dāng)按照以下給出的順序依次排列叁熔,來(lái)確保代碼的易讀性。
<pre>
<code>class
id床牧、name
data-*
src荣回、for、type戈咳、href
title心软、alt
aria-*壕吹、role</code>
</pre>
編碼均遵循XHTML標(biāo)準(zhǔn);
標(biāo)簽、屬性删铃、屬性命名由小寫(xiě)英文耳贬、數(shù)字和_組成,且所有標(biāo)簽必須閉合;
屬性值必須用雙引號(hào)"";
避免使用中文拼音泳姐,盡量簡(jiǎn)易并要求語(yǔ)義化效拭。
<pre>
<code>CLASS --> n-head-title --> CLASS遵循小駝峰命名法(little camel-case)
ID --> nHeadTitle --> ID遵循名稱+"-"
NAME --> nHeadTitle --> NAME屬性命名遵循小駝峰命名法(little camel-case)
<div class="n-head-title" id="nHeadTitle" name="nHeadTitle"></div></code>
</pre>
當(dāng)JavaScript
獲取單個(gè)元素時(shí)暂吉,通常使用document.getElementById來(lái)獲取dom元素胖秒,document.getElementById兼容所有瀏覽器,但I(xiàn)E瀏覽器會(huì)混淆元素的ID和NAME屬性慕的,所以要區(qū)分ID和NAME的命名阎肝。
<pre>
<code><input type="text" name="text">
<div id="test"></div>
<button onclick="alert(document.getElementById('test').tagName)"></button>
<!-- ie6下為INPUT --></code>
</pre>
- 特殊符號(hào)應(yīng)使用轉(zhuǎn)義符。
<pre>
<code>< --> <
--> >
空格 --> </code>
</pre>- 含有描述性表單元素(
input
,textarea
)添加label
肮街。
<pre>
<code><p>
<label for="test">測(cè)試</label>
<input type="text" id="test"/>
</p></code>
</pre>- 多用無(wú)兼容性問(wèn)題的
HTML
內(nèi)置標(biāo)簽风题。
比如`span`、`em`嫉父、`strong`沛硅、`optgroup`、`label`等绕辖,需要自定義`HTML`標(biāo)簽屬性時(shí)摇肌,首先考慮是否存在已有的合適標(biāo)簽可替換,如果沒(méi)有仪际,可使用`data-`為前綴來(lái)添加自定義屬性围小,避免使用其他命名方式霉颠。
- 語(yǔ)義化
HTML
悍抑。- 盡可能減少
<div>
嵌套。- 書(shū)寫(xiě)鏈接地址時(shí)避免重定向穿仪。
<pre>
<code>href="http://www.kahn1990.com/" //即在URL地址后面加"/"</code>
</pre>HTML
中對(duì)于屬性的定義成榜,確保全部使用雙引號(hào)框舔,絕對(duì)不要使用單引號(hào)。
CSS書(shū)寫(xiě)規(guī)范
CSS
樣式新建或修改盡量遵循以下原則:
1. 根據(jù)新建樣式的適用范圍分為三級(jí):全站級(jí)赎婚、產(chǎn)品級(jí)刘绣、頁(yè)面級(jí)
2. 盡量通過(guò)繼承和層疊重用已有的樣式。
3. 不要輕易改動(dòng)全站級(jí)CSS惑淳。改動(dòng)后额港,要經(jīng)過(guò)全面測(cè)試。
CSS
屬性顯示順序:
1. 顯示屬性
2. 元素位置
3. 元素屬性
4. 元素內(nèi)容屬性
`CSS`書(shū)寫(xiě)順序
<pre>
<code>.header{
/*顯示屬性*/
display || visibility
list-style
position top || right || bottom || left
z-index
clear
float
/*自身屬性*/
width max-width || min-width
height max-height || min-height
overflow || clip
margin
padding
outline
border
background
/*文本屬性*/
color
font
text-overflow
text-align
text-indent
line-height
white-space
vertical-align
cursor
content
};
</code>
</pre>
兼容多個(gè)瀏覽器時(shí)歧焦,將標(biāo)準(zhǔn)屬性寫(xiě)在底部移斩。
<pre>
<code>-moz-border-radius:15px;/*Firefox*/
-webkit-border-radius:15px;/*Safari和Chrome*/
border-radius:15px;/*Opera 10.5+肚医,以及使用了IE-CSS3的IE瀏覽器*//標(biāo)準(zhǔn)屬性</code>
</pre>
- 使用選擇器時(shí),命名比較短的詞匯或者縮寫(xiě)的不允許直接定義樣式向瓷。
<pre>
<code>.hd,.bd,.td{};//如這些命名</code>
</pre>
可用上級(jí)節(jié)點(diǎn)進(jìn)行限定肠套。
<pre>
<code>.recommend-mod .hd</code>
</pre>
多選擇器規(guī)則之間換行,即當(dāng)樣式針對(duì)多個(gè)選擇器時(shí)每個(gè)選擇器占一行猖任。
<pre>
<code>button.btn,
input.btn,
input[type="button"]{...};</code>
</pre>
優(yōu)化`CSS`選擇器你稚。
<pre>
<code>#header a { color:#fff; };/*CSS選擇器是從右邊到左邊進(jìn)行匹配*/</code>
</pre>
瀏覽器將檢查整個(gè)文檔中的所有鏈接和每個(gè)鏈接的父元素,并遍歷文檔樹(shù)去查找ID為header的祖先元素朱躺,如果找不到header將追溯的文檔的根節(jié)點(diǎn)刁赖,解決方法如下:
<pre>
<code>避免使用通配符和相鄰兄弟選擇符、子選擇符长搀、后代選擇符宇弛、屬性選擇符等選擇器
不要限定ID選擇符,如div#header(提高權(quán)重除外)
不要限定類選擇器源请,如ul.recommend(提高權(quán)重除外)
不要使用 ul li a 這樣長(zhǎng)的選擇符
避免使用標(biāo)簽子選擇符枪芒,如#header > li > a </code>
</pre>
- 使用
z-index
屬性盡量讓z-index
的值不要超過(guò)150(全站級(jí)的除外),頁(yè)面中的元素內(nèi)容的z-index不能超過(guò)10(模態(tài)框等模塊除外谁尸,但不能超過(guò)150)舅踪,不允許直接使用(999~9999)之間的值。- 盡量避免使用CSS Hack良蛮。
<pre>
<code>property:value;/*所有瀏覽器*/
+property:value;/*IE7*/
_property:value;/*IE6*/
*property:value;/*IE6/7*/
property:value;/*IE6/7/8/9,即所有IE瀏覽器*/</code>
</pre>
<pre>
<code>* html selector {...};/*IE6*/
*:first-child+html selector {...};/*IE7*/
html>body selector {...};/*非IE6*/
@-moz-document url-prefix() {...};/*firefox*/
@media all and (-webkit-min-device-pixel-ratio:0) {...};/*saf3+/chrome1+*/
@media all and (-webkit-min-device-pixel-ratio:10000),not all and (-webkit-min-device-pixel-ratio:0) {...};/*opera*/
@media screen and (max-device-width:480px) {...};/*iphone/mobile webkit*/</code>
</pre>
避免使用低效的選擇器抽碌。
<pre>
<code>body > * {...};
ul > li > a {...};
#footer > h3 {...};
ul#top_blue_nav {...};
#searbar span.submit a {...};/*反面示例*/</code>
</pre>
- 六個(gè)不要三個(gè)避免一個(gè)使用。
<pre>
<code>不要在標(biāo)簽上直接寫(xiě)樣式
不要在CSS中使用expression
不要在CSS中使用@import
不要在CSS中使用“*”選擇符
不要在CSS中使用背镇!important
不要將CSS樣式單行書(shū)寫(xiě)
避免使用filter
避免使用行內(nèi)(inline)樣式
避免使用“*”設(shè)置{margin:0咬展;padding:0;}
使用偽類清除浮動(dòng)</code>
</pre>
- 減少使用影響性能的屬性瞒斩。
<pre>
<code>position:absolute;
float:left;//如這些定位或浮動(dòng)屬性破婆,如需使用,優(yōu)先使用定位胸囱。</code>
</pre>
減少在`CSS`中使用濾鏡表達(dá)式和圖片repeat祷舀,尤其在body當(dāng)中,渲染性能極差烹笔,如果需要用repeat的話裳扯,圖片的寬或高不能少于8px。
JavaScript書(shū)寫(xiě)規(guī)范
- 命名規(guī)范
<pre>
<code>常量名
全部大寫(xiě)并且單詞間用下劃線分隔
如:CSS_BTN_CLOSE谤职、TXT_LOADING
對(duì)象的屬性或方法名
小駝峰式(little camel-case)
如:init饰豺、bindEvent、updatePosition
示例:Dialog.prototype = {
init: function(){},
bindEvnet:function(){},
updatePosition:function(){},
...
};
類名(構(gòu)造器)
-->小駝峰式但首字母大寫(xiě)
-->如:Current允蜈、DefaultConfig
函數(shù)名
-->小駝峰式
-->如:current()冤吨、defaultConfig()
變量名
-->小駝峰式
-->如:current蒿柳、defaultConfig
私有變量名
-->小駝峰式但需要用_開(kāi)頭
-->如:_current、_defaultConfig</code>
</pre>
- 代碼格式漩蟆。
<pre>
<code>"()"前后需要跟空格
"="前后需要跟空格
","后面需要跟空格
JSON對(duì)象需格式化對(duì)象參數(shù)
if垒探、while、for怠李、do語(yǔ)句的執(zhí)行體用"{}"包起來(lái)</code>
</pre>
"{}"格式如下:
<pre>
<code>if (a==1) {
//代碼
};</code>
</pre>
避免額外的逗號(hào)圾叼。
<pre>
<code>var arr = [1,2,3,];//最后的逗號(hào)不要有</code>
</pre>
`for-in`循環(huán)中須用hasOwnProperty方法檢查成員是否為自身成員,避免來(lái)自原型鏈上的污染捺癞。
- 長(zhǎng)語(yǔ)句可考慮斷行夷蚊。
<pre>
<code>TEMPL_SONGLIST.replace('{TABLE}', da['results'])
.replace('{PREV_NUM}', prev)
.replace('{NEXT_NUM}', next)
.replace('{CURRENT_NUM}', current)
.replace('{TOTAL_NUM}', da.page_total);</code>
</pre>
為了避免和`JSLint`的檢驗(yàn)機(jī)制沖突,“.”或“+”這類操作符放在行尾翘簇。
<pre>
<code>TEMPL_SONGLIST.replace('{TABLE}', da['results']).
replace('{PREV_NUM}', prev).
replace('{NEXT_NUM}', next).
replace('{CURRENT_NUM}', current).
replace('{TOTAL_NUM}', da.page_total);</code>
</pre>
如果模塊代碼中撬码,使用其他全局變量想跳過(guò)JSLint的檢查,可在該文件中添加/*global*/聲明版保。
<pre>
<code>/*global alert: true, console:true, top:true, setTimeout:true*/</code>
</pre>
- 使用嚴(yán)格的條件判斷符。用
===
代替==
夫否,用!==
代替!=
彻犁,避免==
產(chǎn)生的陷阱。
* 在條件判斷時(shí)凰慈,這樣的一些值表示false汞幢。
<pre>
<code>null
undefined與null相等
字符串''
數(shù)字0
NaN</code>
</pre>
* 在==時(shí),則會(huì)有一些讓人難以理解的陷阱微谓。
<pre>
<code>(function(){
var undefined;
undefined == null;//true
1 == true;//true
2 == true;//false
0 == false;//true
0 == '';//true
NaN == NaN;//false
[] == false;//true
[] == ![];//true
})();</code>
</pre>
* 對(duì)于不同類型的`==`判斷森篷,有這樣一些規(guī)則,順序自上而下:
<pre>
<code>undefined與null相等
一個(gè)是number一個(gè)是string時(shí)豺型,會(huì)嘗試將string轉(zhuǎn)換為number
嘗試將boolean轉(zhuǎn)換為number的0或1
嘗試將Object轉(zhuǎn)換成number或string</code>
</pre>
而這些取決于另外一個(gè)對(duì)比量仲智,即值的類型,所以對(duì)于0姻氨、空字符串的判斷钓辆,建議使用`===`。<br/>`===`會(huì)先判斷兩邊的值類型肴焊,類型不匹配時(shí)為`false`前联。
- 下面類型的對(duì)象不建議用new構(gòu)造:
<pre>
<code>new Number
new String
new Boolean
new Object //用{}代替
new Array //用[]代替</code>
</pre>
引用對(duì)象成員用`obj.prop`代替obj["prop"] ,除非屬性名是變量娶眷。
- 從number到string的轉(zhuǎn)換似嗤。
<pre>
<code>/推薦寫(xiě)法/
var a = 1;
typeof(a); //"number"
console.log(a); //1
var aa = a + '';
typeof(aa); //"string"
console.log(aa); //'1'
/不推薦寫(xiě)法/
new String(a)或a.toString()</code>
</pre>
從string到number的轉(zhuǎn)換,使用parseInt届宠,必須指定第二個(gè)參數(shù)的進(jìn)制烁落。
<pre>
<code>/**推薦寫(xiě)法*/
var a = "1";
var aa = parseInt(a,10);
typeof(a); //"string"
console.log(a); //"1"
typeof(aa); //"number"
console.log(aa); //1</code>
</pre>
從float到integer的轉(zhuǎn)換壳咕。
<pre>
<code>/**推薦寫(xiě)法*/
Math.floor/Math.round/Math.ceil
/**不推薦寫(xiě)法*/
parseInt</code>
</pre>
字符串拼接應(yīng)使用數(shù)組保存字符串片段,使用時(shí)調(diào)用join方法顽馋。避免使用+或+=的方式拼接較長(zhǎng)的字符串谓厘,每個(gè)字符串都會(huì)使用一個(gè)小的內(nèi)存片段,過(guò)多的內(nèi)存片段會(huì)影響性能寸谜。
<pre>
<code>/**推薦的拼接方式array的push竟稳、join*/
var str=[],
list=['測(cè)試A','測(cè)試B'];
for (var i=0 , len=list.length; i < len; i++) {
str.push( '<div>'+ list[i] + '</div>');
};
console.log(str.join('')); //<div>測(cè)試A</div><div>測(cè)試B</div>
/** 不推薦的拼接方式+=*/
var str = '',
list=['測(cè)試A','測(cè)試B'];
for (var i = 0, len = list.length; i< len; i++) {
str+='<div>' + list[i] + '</div>';
};
console.log(str); //<div>測(cè)試A</div><div>測(cè)試B</div></code>
</pre>
- 盡量避免使用存在兼容性及消耗資源的方法或?qū)傩浴?br> <pre>
<code>不要使用with,void熊痴,evil他爸,eval_r,innerText</code>
</pre>- 注意
HTML
分離果善,減小reflow
诊笤,注意性能。優(yōu)化reflow
的方法如下:
1. 不要一條一條地修改 DOM 的樣式巾陕。與其這樣讨跟,還不如預(yù)先定義好 css 的 class,然后修改 DOM 的 className:
<pre>
<code>// 不好的寫(xiě)法
var left = 10,
top = 10;
el.style.left = left + "px";
el.style.top = top + "px";
// 推薦寫(xiě)法
el.className += " theclassname";</code>
</pre>
2. 把 DOM 離線后修改鄙煤。如:
+ 使用 documentFragment 對(duì)象在內(nèi)存里操作 DOM晾匠。
+ 先把 DOM 給 display:none (有一次 repaint),然后你想怎么改就怎么改梯刚。比如修改 100 次凉馆,然后再把他顯示出來(lái)。
+ clone 一個(gè) DOM 節(jié)點(diǎn)到內(nèi)存里亡资,然后想怎么改就怎么改澜共,改完后,和在線的那個(gè)的交換一下锥腻。
3. 不要把 DOM 節(jié)點(diǎn)的屬性值放在一個(gè)循環(huán)里當(dāng)成循環(huán)里的變量嗦董。不然這會(huì)導(dǎo)致大量地讀寫(xiě)這個(gè)結(jié)點(diǎn)的屬性。
4. 盡可能的修改層級(jí)比較低的 DOM節(jié)點(diǎn)旷太。當(dāng)然展懈,改變層級(jí)比較底的 DOM節(jié)點(diǎn)有可能會(huì)造成大面積的 reflow,但是也可能影響范圍很小供璧。
5. 為動(dòng)畫(huà)的 HTML 元件使用 fixed 或 absoult 的 position存崖,那么修改他們的 CSS 是會(huì)大大減小 reflow 。
6. 千萬(wàn)不要使用 table 布局睡毒。因?yàn)榭赡芎苄〉囊粋€(gè)小改動(dòng)會(huì)造成整個(gè) table 的重新布局来惧。
圖片規(guī)范
- 命名應(yīng)用
小寫(xiě)英文
、數(shù)字
演顾、_
組合供搀,便于團(tuán)隊(duì)其他成員理解隅居。
<pre>
<code>header_btn.gif
header_btn2.gif</code>
</pre>- 頁(yè)面元素類圖片均放入
img
文件夾,測(cè)試用圖片放入img/testing
文件夾葛虐,psd源圖放入img/psdimg
文件夾胎源。- 圖片格式僅限于
gif
、png
屿脐、jpg
等涕蚤。- 背景圖片盡可能用
sprite
圖,減小http
請(qǐng)求的诵。
注釋規(guī)范:
JavaScript
万栅、CSS
文件注釋需要標(biāo)明作者、文件版本西疤、創(chuàng)建/修改時(shí)間烦粒、函數(shù)描述等信息。
<pre>
<code>/*注釋區(qū)域/</code>
</pre>
中間可添加如下信息:
<pre>
<code>@file 文件名
@addon 把一個(gè)函數(shù)標(biāo)記為另一個(gè)函數(shù)的擴(kuò)張代赁,另一個(gè)函數(shù)的定義不在源文件中
@argument 用大括號(hào)中的自變量類型描述一個(gè)自變量
@author 函數(shù)/類作者的姓名
@base 如果類是繼承得來(lái)扰她,定義提供的類名稱
@class 用來(lái)給一個(gè)類提供描述,不能用于構(gòu)造器的文檔中
@constructor 描述一個(gè)類的構(gòu)造器
@deprecated 表示函數(shù)/類已被忽略
@exception 描述函數(shù)/類產(chǎn)生的一個(gè)錯(cuò)誤
@exec @extends 表示派生出當(dāng)前類的另一個(gè)類
@fileoverview 表示文檔塊將用于描述當(dāng)前文件管跺,這個(gè)標(biāo)簽應(yīng)該放在其它任何標(biāo)簽之前
@final 指出函數(shù)/類
@ignore 讓jsdoc忽視隨后的代碼
@link 類似于@link標(biāo)簽义黎,用于連接許多其它頁(yè)面
@member 定義隨后的函數(shù)為提供的類名稱的一個(gè)成員
@param 用大括號(hào)中的參數(shù)類型描述一個(gè)參數(shù)
@private 表示函數(shù)/類為私有,不應(yīng)包含在生成的文檔中
@requires 表示需要另一個(gè)函數(shù)/類
@return 描述一個(gè)函數(shù)的返回值
@see 連接到另一個(gè)函數(shù)/類
@throws 描述函數(shù)/類可能產(chǎn)生的錯(cuò)誤
@type 指定函數(shù)/成員的返回類型
@version 函數(shù)/類的版本號(hào)</code>
</pre>