css規則

1 前言

2 代碼風格

  2.1 文件

  2.2 縮進

  2.3 空格

  2.4 行長度

  2.5 選擇器

  2.6 屬性

3 通用

  3.1 選擇器

  3.2 屬性縮寫

  3.3 屬性書寫順序

  3.4 清除浮動

  3.5 !important

  3.6 z-index

4 值與單位

  4.1 文本

  4.2 數值

  4.3 url()

  4.4 長度

  4.5 顏色

  4.6 2D 位置

5 文本編排

  5.1 字體族

  5.2 字號

  5.3 字體風格

  5.4 字重

  5.5 行高

6 變換與動畫

7 響應式

8 兼容性

  8.1 屬性前綴

  8.2 Hack

  8.3 Expression

1 前言
CSS 作爲網頁樣式的描述語言,在百度一直有着廣泛的應用。本文檔的目標是使 CSS 代碼風格保持一致,容易被理解和被維護。

2 代碼風格
2.1 文件
[建議] CSS 文件使用無 BOM 的 UTF-8 編碼。
解釋:

UTF-8 編碼具有更廣泛的適應性。BOM 在使用程序或工具處理文件時可能造成不必要的干擾。

2.2 縮進
[強制] 使用 4 個空格做爲一個縮進層級,不允許使用 2 個空格 或 tab 字符。
示例:

.selector {
margin: 0;
padding: 0;
}
2.4 行長度
[強制] 每行不得超過 120 個字符,除非單行不可分割。
解釋:

常見不可分割的場景爲URL超長。

[建議] 對於超長的樣式,在樣式值的 空格 處或 , 後換行,建議按邏輯分組。
示例:

/ 不同屬性值按邏輯分組 /
background:
transparent url(aVeryVeryVeryLongUrlIsPlacedHere)
no-repeat 0 0;
/ 可重複多次的屬性,每次重複一行 /background-image:
url(aVeryVeryVeryLongUrlIsPlacedHere)
url(anotherVeryVeryVeryLongUrlIsPlacedHere);
/ 類似函數的屬性值可以根據函數調用的縮進進行 /background-image: -webkit-gradient(
linear,
left bottom,
left top,
color-stop(0.04, rgb(88,94,124)),
color-stop(0.52, rgb(115,123,162))
);
2.5 選擇器
[強制] 當一個 rule 包含多個 selector 時,每個選擇器聲明必須獨佔一行。
示例:

/ good /.post,.page,.comment {
line-height: 1.5;
}
/ bad /.post, .page, .comment {
line-height: 1.5;
}
[強制] >、+、~ 選擇器的兩邊各保留一個空格。
示例:

/ good /main > nav {
padding: 10px;
}
label + input {
margin-left: 5px;
}
input:checked ~ button {
background-color: #69C;
}
/ bad /main>nav {
padding: 10px;
}
label+input {
margin-left: 5px;
}
input:checked~button {
background-color: #69C;
}
[強制] 屬性選擇器中的值必須用雙引號包圍。
解釋:

不允許使用單引號,不允許不使用引號。

示例:

/ good /article[character="juliet"] {
voice-family: "Vivien Leigh", victoria, female;
}
/ bad /article[character='juliet'] {
voice-family: "Vivien Leigh", victoria, female;
}
2.6 屬性
[強制] 屬性定義必須另起一行。
示例:

/ good /.selector {
margin: 0;
padding: 0;
}
/ bad /.selector { margin: 0; padding: 0; }
[強制] 屬性定義後必須以分號結尾。
示例:

/ good /.selector {
margin: 0;
}
/ bad /.selector {
margin: 0
}
3 通用
3.1 選擇器
[強制] 如無必要,不得爲 id、class 選擇器添加類型選擇器進行限定。
解釋:

在性能和維護性上,都有一定的影響。

示例:

/ good /#error,.danger-message {
font-color: #c00;
}
/ bad /dialog#error,p.danger-message {
font-color: #c00;
}
[建議] 選擇器的嵌套層級應不大於 3 級,位置靠後的限定條件應儘可能精確。
示例:

/ good /#username input {}.comment .avatar {}
/ bad /.page .header .login #username input {}.comment div * {}
3.2 屬性縮寫
[建議] 在可以使用縮寫的情況下,儘量使用屬性縮寫。
示例:

/ good /.post {
font: 12px/1.5 arial, sans-serif;
}
/ bad /.post {
font-family: arial, sans-serif;
font-size: 12px;
line-height: 1.5;
}
[建議] 使用 border / margin / padding 等縮寫時,應注意隱含值對實際數值的影響,確實需要設置多個方向的值時才使用縮寫。
解釋:

border / margin / padding 等縮寫會同時設置多個屬性的值,容易覆蓋不需要覆蓋的設定。如某些方向需要繼承其他聲明的值,則應該分開設置。

示例:

/ centering <article class="page"> horizontally and highlight featured ones /article {
margin: 5px;
border: 1px solid #999;
}
/ good /.page {
margin-right: auto;
margin-left: auto;
}
.featured {
border-color: #69c;
}
/ bad /.page {
margin: 5px auto; / introducing redundancy /
}
.featured {
border: 1px solid #69c; / introducing redundancy /
}
3.3 屬性書寫順序
[建議] 同一 rule set 下的屬性在書寫時,應按功能進行分組,並以 Formatting Model(佈局方式、位置) > Box Model(尺寸) > Typographic(文本相關) > Visual(視覺效果) 的順序書寫,以提高代碼的可讀性。
解釋:

Formatting Model 相關屬性包括:position / top / right / bottom / left / float / display / overflow 等
Box Model 相關屬性包括:border / margin / padding / width / height 等
Typographic 相關屬性包括:font / line-height / text-align / word-wrap 等
Visual 相關屬性包括:background / color / transition / list-style 等
另外,如果包含 content 屬性,應放在最前面。

示例:

.sidebar {
/ formatting model: positioning schemes / offsets / z-indexes / display / ... /
position: absolute;
top: 50px;
left: 0;
overflow-x: hidden;

/* box model: sizes / margins / paddings / borders / ...  */
width: 200px;
padding: 5px;
border: 1px solid #ddd;

/* typographic: font / aligns / text styles / ... */
font-size: 14px;
line-height: 20px;

/* visual: colors / shadows / gradients / ... */
background: #f5f5f5;
color: #333;
-webkit-transition: color 1s;
   -moz-transition: color 1s;
        transition: color 1s;

}
3.4 清除浮動
.clearfix:after{display:block;content:’’;clear:both;}
.clearfix{zoom:1;}
3.5 !important
[建議] 儘量不使用 !important 聲明。
[建議] 當需要強制指定樣式且不允許任何場景覆蓋時,通過標籤內聯和 !important 定義樣式。
解釋:

必須注意的是,僅在設計上 確實不允許任何其它場景覆蓋樣式 時,才使用內聯的 !important 樣式。通常在第三方環境的應用中使用這種方案。下面的 z-index 章節是其中一個特殊場景的典型樣例。

3.6 z-index
[建議] 將 z-index 進行分層,對文檔流外絕對定位元素的視覺層級關係進行管理。
解釋:

同層的多個元素,如多個由用戶輸入觸發的 Dialog,在該層級內使用相同的 z-index 或遞增 z-index。

建議每層包含100個 z-index 來容納足夠的元素,如果每層元素較多,可以調整這個數值。

[建議] 在可控環境下,期望顯示在最上層的元素,z-index 指定爲 999。
4 值與單位
4.1 文本
4.2 數值
[強制] 當數值爲 0 - 1 之間的小數時,省略整數部分的 0。
示例:

/ good /
panel {
opacity: .8;
}
/ bad /
panel {
opacity: 0.8;
}
4.3 url()
[強制] url() 函數中的路徑不加引號。
示例:

body {
background: url(bg.png);
}
[建議] url() 函數中的絕對路徑可省去協議名。
示例:

body {
background: url(//baidu.com/img/bg.png) no-repeat 0 0;
}
4.4 長度
[強制] 長度爲 0 時須省略單位。 (也只有長度單位可省)
示例:

/ good /body {
padding: 0 5px;
}
/ bad /body {
padding: 0px 5px;
}
4.5 顏色
[強制] 顏色值可以縮寫時,必須使用縮寫形式。
示例:

/ good /.success {
background-color: #aca;
}
/ bad /.success {
background-color: #aaccaa;
}
[強制] 顏色值不允許使用命名色值。
示例:

/ good /.success {
color: #90ee90;
}
/ bad /.success {
color: lightgreen;
}
[建議] 顏色值中的英文字符采用小寫。如不用小寫也需要保證同一項目內保持大小寫一致。
示例:

/ good /.success {
background-color: #aca;
color: #90ee90;
}
/ good /.success {
background-color: #ACA;
color: #90EE90;
}
/ bad /.success {
background-color: #ACA;
color: #90ee90;
}
4.6 2D 位置
[強制] 必須同時給出水平和垂直方向的位置。
解釋:

2D 位置初始值爲 0% 0%,但在只有一個方向的值時,另一個方向的值會被解析爲 center。爲避免理解上的困擾,應同時給出兩個方向的值。background-position屬性值的定義

示例:

/ good /body {
background-position: center top; / 50% 0% /
}
/ bad /body {
background-position: top; / 50% 0% /
}
5 文本編排
5.1 字體族
[強制] font-family 屬性中的字體族名稱應使用字體的英文 Family Name,其中如有空格,須放置在引號中。
解釋:

所謂英文 Family Name,爲字體文件的一個元數據,常見名稱如下:

字體

操作系統

Family Name

宋體 (中易宋體)

Windows

SimSun

黑體 (中易黑體)

Windows

SimHei

微軟雅黑

Windows

Microsoft YaHei

微軟正黑

Windows

Microsoft JhengHei

華文黑體

Mac/iOS

STHeiti

冬青黑體

Mac/iOS

Hiragino Sans GB

文泉驛正黑

Linux

WenQuanYi Zen Hei

文泉驛微米黑

Linux

WenQuanYi Micro Hei

示例:

h1 {
font-family: "Microsoft YaHei";
}
[強制] font-family 按「西文字體在前、中文字體在後」、「效果佳 (質量高/更能滿足需求) 的字體在前、效果一般的字體在後」的順序編寫,最後必須指定一個通用字體族( serif / sans-serif )。
解釋:

更詳細說明可參考本文。

示例:

/ Display according to platform /.article {
font-family: Arial, sans-serif;
}
/ Specific for most platforms /h1 {
font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "WenQuanYi Micro Hei", "Microsoft YaHei", sans-serif;
}
[強制] font-family 不區分大小寫,但在同一個項目中,同樣的 Family Name 大小寫必須統一。
示例:

/ good /body {
font-family: Arial, sans-serif;
}
h1 {
font-family: Arial, "Microsoft YaHei", sans-serif;
}
/ bad /body {
font-family: arial, sans-serif;
}
h1 {
font-family: Arial, "Microsoft YaHei", sans-serif;
}
5.2 字號
[強制] 需要在 Windows 平臺顯示的中文內容,其字號應不小於 12px。
解釋:

由於 Windows 的字體渲染機制,小於 12px 的文字顯示效果極差、難以辨認。

5.3 字體風格
[建議] 需要在 Windows 平臺顯示的中文內容,不要使用除 normal 外的 font-style。其他平臺也應慎用。
解釋:

由於中文字體沒有 italic 風格的實現,所有瀏覽器下都會 fallback 到 obilique 實現 (自動擬合爲斜體),小字號下 (特別是 Windows 下會在小字號下使用點陣字體的情況下) 顯示效果差,造成閱讀困難。

5.5 行高
[建議] line-height 在定義文本段落時,應使用數值。
解釋:

將 line-height 設置爲數值,瀏覽器會基於當前元素設置的 font-size 進行再次計算。在不同字號的文本段落組合中,能達到較爲舒適的行間間隔效果,避免在每個設置了 font-size 都需要設置 line-height。

當 line-height 用於控制垂直居中時,還是應該設置成與容器高度一致。

示例:

.container {
line-height: 1.5;
}
6 變換與動畫
[強制] 使用 transition 時應指定 transition-property。
示例:

/ good /.box {
transition: color 1s, border-color 1s;
}
/ bad /.box {
transition: all 1s;
}
[建議] 儘可能在瀏覽器能高效實現的屬性上添加過渡和動畫。
解釋:

見本文,在可能的情況下應選擇這樣四種變換:

transform: translate(npx, npx);
transform: scale(n);
transform: rotate(ndeg);
opacity: 0..1;
典型的,可以使用 translate 來代替 left 作爲動畫屬性。

示例:

/ good /.box {
transition: transform 1s;
}.box:hover {
transform: translate(20px); / move right for 20px /
}
/ bad /.box {
left: 0;
transition: left 1s;
}.box:hover {
left: 20px; / move right for 20px /
}
7 響應式
8.1 屬性前綴
[強制] 帶私有前綴的屬性由長到短排列,按冒號位置對齊。
解釋:

標準屬性放在最後,按冒號對齊方便閱讀,也便於在編輯器內進行多行編輯。

示例:

.box {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
8.2 Hack
[建議] 需要添加 hack 時應儘可能考慮是否可以採用其他方式解決。
解釋:

如果能通過合理的 HTML 結構或使用其他的 CSS 定義達到理想的樣式,則不應該使用 hack 手段解決問題。通常 hack 會導致維護成本的增加。

[建議] 儘量使用 選擇器 hack 處理兼容性,而非 屬性 hack。
解釋:

儘量使用符合 CSS 語法的 selector hack,可以避免一些第三方庫無法識別 hack 語法的問題。

示例:

/ IE 7 /:first-child + html #header {
margin-top: 3px;
padding: 5px;
}
/
IE 6 / html #header {
margin-top: 5px;
padding: 4px;
}
[建議] 儘量使用簡單的 屬性 hack。
示例:

.box {
_display: inline; / fix double margin /
float: left;
margin-left: 20px;
}
.container {
overflow: hidden;
zoom: 1; / triggering hasLayout */
}
8.3 Expression
[強制] 禁止使用 Expression。

1 前言

2 代碼風格

  2.1 縮進與換行

  2.2 命名

  2.3 標籤

  2.4 屬性

3 通用

  3.1 DOCTYPE

  3.2 編碼

  3.3 CSS 和 JavaScript 引入

4 head

  4.1 title

  4.2 favicon

  4.3 viewport

5 圖片

6 表單

  6.1 控件標題

  6.2 按鈕

  6.3 可訪問性 (A11Y)

7 多媒體

8 模板中的 HTML

1 前言
HTML 作爲描述網頁結構的超文本標記語言,在百度一直有着廣泛的應用。本文檔的目標是使 HTML 代碼風格保持一致,容易被理解和被維護。

2 代碼風格
2.1 縮進與換行
[強制] 使用 4 個空格做爲一個縮進層級,不允許使用 2 個空格 或 tab 字符。
解釋: 對於非 HTML 標籤之間的縮進,比如 script 或 style 標籤內容縮進,與 script 或 style 標籤的縮進同級。

示例:

<style>/ 樣式內容的第一級縮進與所屬的 style 標籤對齊 /ul { padding: 0;}</style>
<ul>
<li>first</li>
<li>second</li>
</ul><script>// 腳本代碼的第一級縮進與所屬的 script 標籤對齊require(['app'], function (app) { app.init();});</script>
[建議] 每行不得超過 120 個字符。
解釋:

過長的代碼不容易閱讀與維護。但是考慮到 HTML 的特殊性,不做硬性要求。

2.2 命名
[強制] class 必須單詞全字母小寫,單詞間以 - 分隔。
[強制] class 必須代表相應模塊或部件的內容或功能,不得以樣式信息進行命名。
示例:

<!-- good -->
<div class="sidebar"></div>
<!-- bad -->
<div class="left"></div>
<!-- good -->
foo').tagName);</script>
2.3 標籤
[強制] 標籤名必須使用小寫字母。
示例:

<!-- good -->
<p>Hello StyleGuide!</p>
<!-- bad -->
<P>Hello StyleGuide!</P>
[強制] 對於無需自閉合的標籤,不允許自閉合。
解釋:

常見無需自閉合標籤有 input、br、img、hr 等。

示例:

<!-- good -->
<input type="text" name="title">
<!-- bad -->
<input type="text" name="title" />
[強制] 對 HTML5 中規定允許省略的閉合標籤,不允許省略閉合標籤。
解釋:

對代碼體積要求非常嚴苛的場景,可以例外。比如:第三方頁面使用的投放系統。

示例:

<!-- good -->
<ul>
<li>first</li>
<li>second</li>
</ul>
<!-- bad -->
<ul>
<li>first
<li>second
</ul>
[強制] 標籤使用必須符合標籤嵌套規則。
解釋:

比如 div 不得置於 p 中,tbody 必須置於 table 中。

詳細的標籤嵌套規則參見HTML DTD中的 Elements 定義部分。

[建議] HTML 標籤的使用應該遵循標籤的語義。
解釋:

下面是常見標籤語義

p - 段落
h1,h2,h3,h4,h5,h6 - 層級標題
strong,em - 強調
ins - 插入
del - 刪除
abbr - 縮寫
code - 代碼標識
cite - 引述來源作品的標題
q - 引用
blockquote - 一段或長篇引用
ul - 無序列表
ol - 有序列表
dl,dt,dd - 定義列表
示例:

<!-- good -->
<p>Esprima serves as an important <strong>building block</strong> for some JavaScript language tools.</p>
<!-- bad -->
<div>Esprima serves as an important <span class="strong">building block</span> for some JavaScript language tools.</div>
[建議] 在 CSS 可以實現相同需求的情況下不得使用表格進行佈局。
解釋:

在兼容性允許的情況下應儘量保持語義正確性。對網格對齊和拉伸性有嚴格要求的場景允許例外,如多列複雜表單。

[建議] 標籤的使用應儘量簡潔,減少不必要的標籤。
示例:

<!-- good -->
<img class="avatar" src="image.png">
<!-- bad -->
<span class="avatar">
<img src="image.png">
</span>
3 通用
3.1 DOCTYPE
[強制] 使用 HTML5 的 doctype 來啓用標準模式,建議使用大寫的 DOCTYPE。
示例:

<!DOCTYPE html>
[建議] 在 html 標籤上設置正確的 lang 屬性。
解釋:

有助於提高頁面的可訪問性,如:讓語音合成工具確定其所應該採用的發音,令翻譯工具確定其翻譯語言等。

示例:

<html lang="zh-CN">
3.2 編碼
[強制] 頁面必須使用精簡形式,明確指定字符編碼。指定字符編碼的 meta 必須是 head 的第一個直接子元素。
解釋:

見 HTML5 Charset能用嗎 一文。

示例:

<html>
<head>
<meta charset="UTF-8">
......
</head>
<body>
......
</body>
</html>
[建議] HTML 文件使用無 BOM 的 UTF-8 編碼。
解釋:

UTF-8 編碼具有更廣泛的適應性。BOM 在使用程序或工具處理文件時可能造成不必要的干擾。

3.3 CSS 和 JavaScript 引入
[強制] 引入 CSS 時必須指明 rel="stylesheet"。
示例:

<link rel="stylesheet" href="page.css">
[建議] 引入 CSS 和 JavaScript 時無須指明 type 屬性。
解釋:

text/css 和 text/javascript 是 type 的默認值。

[建議] 展現定義放置於外部 CSS 中,行爲定義放置於外部 JavaScript 中。
解釋:

結構-樣式-行爲的代碼分離,對於提高代碼的可閱讀性和維護性都有好處。

[建議] 在 head 中引入頁面需要的所有 CSS 資源。
解釋:

在頁面渲染的過程中,新的CSS可能導致元素的樣式重新計算和繪製,頁面閃爍。

[建議] JavaScript 應當放在頁面末尾,或採用異步加載。
解釋:

將 script 放在頁面中間將阻斷頁面的渲染。出於性能方面的考慮,如非必要,請遵守此條建議。

示例:

<body>
<!-- a lot of elements --> <script src="init-behavior.js"></script>
</body>
[建議] 移動環境或只針對現代瀏覽器設計的 Web 應用,如果引用外部資源的 URL 協議部分與頁面相同,建議省略協議前綴。
解釋:

使用 protocol-relative URL 引入 CSS,在 IE7/8 下,會發兩次請求。是否使用 protocol-relative URL 應充分考慮頁面針對的環境。

示例:

<script src="//s1.bdstatic.com/cache/static/jquery-1.10.2.min_f2fb5194.js"></script>
4 head
4.1 title
[強制] 頁面必須包含 title 標籤聲明標題。
[強制] title 必須作爲 head 的直接子元素,並緊隨 charset 聲明之後。
解釋:

title 中如果包含 ASCII 之外的字符,瀏覽器需要知道字符編碼類型才能進行解碼,否則可能導致亂碼。

示例:

<head>
<meta charset="UTF-8">
<title>頁面標題</title>
</head>
4.2 favicon
[強制] 保證 favicon 可訪問。
解釋:

在未指定 favicon 時,大多數瀏覽器會請求 Web Server 根目錄下的 favicon.ico 。爲了保證 favicon 可訪問,避免 404,必須遵循以下兩種方法之一:

在 Web Server 根目錄放置 favicon.ico 文件。
使用 link 指定 favicon。
示例:

<link rel="shortcut icon" href="path/to/favicon.ico">
4.3 viewport
[建議] 若頁面欲對移動設備友好,需指定頁面的 viewport。
解釋:

viewport meta tag 可以設置可視區域的寬度和初始縮放大小,避免在移動設備上出現頁面展示不正常。

比如,在頁面寬度小於 980px 時,若需 iOS 設備友好,應當設置 viewport 的 width 值來適應你的頁面寬度。同時因爲不同移動設備分辨率不同,在設置時,應當使用 device-width 和 device-height 變量。

另外,爲了使 viewport 正常工作,在頁面內容樣式佈局設計上也要做相應調整,如避免絕對定位等。關於 viewport 的更多介紹,可以參見 Safari Web Content Guide的介紹

5 圖片
[強制] 禁止 img 的 src 取值爲空。延遲加載的圖片也要增加默認的 src。
解釋:

src 取值爲空,會導致部分瀏覽器重新加載一次當前頁面,參考:https://developer.yahoo.com/performance/rules.html#emptysrc

[建議] 避免爲 img 添加不必要的 title 屬性。
解釋:

多餘的 title 影響看圖體驗,並且增加了頁面尺寸。

[建議] 爲重要圖片添加 alt 屬性。
解釋:

可以提高圖片加載失敗時的用戶體驗。

[建議] 添加 width 和 height 屬性,以避免頁面抖動。
[建議] 有下載需求的圖片採用 img 標籤實現,無下載需求的圖片採用 CSS 背景圖實現。
解釋:

產品 logo、用戶頭像、用戶產生的圖片等有潛在下載需求的圖片,以 img 形式實現,能方便用戶下載。
無下載需求的圖片,比如:icon、背景、代碼使用的圖片等,儘可能採用 CSS 背景圖實現。
6 表單
6.1 控件標題
[強制] 有文本標題的控件必須使用 label 標籤將其與其標題相關聯。
解釋:

有兩種方式:

將控件置於 label 內。
label 的 for 屬性指向控件的 id。
推薦使用第一種,減少不必要的 id。如果 DOM 結構不允許直接嵌套,則應使用第二種。

示例:

<label><input type="checkbox" name="confirm" value="on"> 我已確認上述條款</label>

<label for="username">用戶名:</label> <input type="textbox" name="username" id="username">
6.2 按鈕
[強制] 使用 button 元素時必須指明 type 屬性值。
解釋:

button 元素的默認 type 爲 submit,如果被置於 form 元素中,點擊後將導致表單提交。爲顯示區分其作用方便理解,必須給出 type 屬性。

示例:

<button type="submit">提交</button>
<button type="button">取消</button>
7 多媒體
[建議] 在支持 HTML5 的瀏覽器中優先使用 audio 和 video 標籤來定義音視頻元素。
[建議] 只在必要的時候開啓音視頻的自動播放。
[建議] 在 object 標籤內部提供指示瀏覽器不支持該標籤的說明。
示例:

<object width="100" height="50" data="something.swf">DO NOT SUPPORT THIS TAG</object>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章