UI規(guī)范


title: UI設(shè)計規(guī)范
date: 2016-08-17

  • UI
  • 設(shè)計規(guī)范

根據(jù)個人理解并與相關(guān)同事協(xié)商討論后寫出的規(guī)范,首次寫規(guī)范,望多多指正

UI設(shè)計規(guī)范

目的

  1. 隨著公司業(yè)務(wù)的拓展,每家電廠可能同時使用公司的多個產(chǎn)品,規(guī)范的設(shè)計能夠減輕用戶在使用公司研發(fā)的多套產(chǎn)品時的頓挫感,增強(qiáng)用戶的體驗度。
  2. 規(guī)范的設(shè)計能夠提升公司形象,增強(qiáng)公司的市場競爭力。在目前部分電廠已經(jīng)使用公司產(chǎn)品的基礎(chǔ)上,統(tǒng)一的設(shè)計風(fēng)格和使用習(xí)慣更有利于公司市場拓展。
  3. 減輕UI設(shè)計難度,縮短UI設(shè)計時間。讓設(shè)計人員根據(jù)用戶的需求快速形成可視化“原形”并且達(dá)到用戶的所見即所得的效果。降低業(yè)務(wù)顧問與用戶的溝通成本以及因設(shè)計問題導(dǎo)致用戶后期變更的幾率。
  4. 降低開發(fā)成本,使得“原型設(shè)計”在評審?fù)ㄟ^后能夠直接作為系統(tǒng)的UI使用。

定位

  1. 本設(shè)計規(guī)范兼容部分之前系統(tǒng)的設(shè)計規(guī)范,并根據(jù)公司的發(fā)展規(guī)劃進(jìn)行補(bǔ)充、細(xì)化。
  2. 本設(shè)計規(guī)范作為設(shè)計人員設(shè)計以及開發(fā)人員開發(fā)時的參考依據(jù)。規(guī)范起到輔助作用,不能因規(guī)范而限制設(shè)計人員的思路。
  3. 本規(guī)范作為具體項目規(guī)范的基礎(chǔ)規(guī)范。
  4. 本規(guī)范在項目開展過程中不斷完善。

規(guī)范

bootstrap編碼規(guī)范

黃金定律

永遠(yuǎn)遵循同一套編碼規(guī)范,不管有多少人共同參與同一項目,一定要確保每一行代碼都像是同一個人編寫的。

編碼規(guī)范目錄

HTML

CSS

編輯器配置

<h4 id="html">HTML</h4>

<p id="html.1"><strong>語法</strong></p>

  • 用兩個空格來代替制表符(tab) -- 這是唯一能保證在所有環(huán)境下獲得一致展現(xiàn)的方法。
  • 嵌套元素應(yīng)當(dāng)縮進(jìn)一次(即兩個空格)。
  • 對于屬性的定義,確保全部使用雙引號,絕不要使用單引號。
  • 不要在自閉合(self-closing)元素的尾部添加斜線 -- HTML5 規(guī)范中明確說明這是可選的。
  • 不要省略可選的結(jié)束標(biāo)簽(closing tag)(例如,</li> 或 </body>)。
<!DOCTYPE html>
<html>
  <head>
    <title>Page title</title>
  </head>
  <body>
    <img src="images/company-logo.png" alt="Company">
    <h1 class="hello-world">Hello, world!</h1>
  </body>
</html>

<p id="html.2"><strong>HTML5 doctype</strong></p>

為每個 HTML 頁面的第一行添加標(biāo)準(zhǔn)模式(standard mode)的聲明,這樣能夠確保在每個瀏覽器中擁有一致的展現(xiàn)。

<!DOCTYPE html>
<html>
  <head>
  </head>
</html>

<p id="html.3"><strong>語言屬性(Language attribute)</strong></p>

根據(jù) HTML5 規(guī)范:

強(qiáng)烈建議為 html 根元素指定 lang 屬性,從而為文檔設(shè)置正確的語言。這將有助于語音合成工具確定其所應(yīng)該采用的發(fā)音,有助于翻譯工具確定其翻譯時所應(yīng)遵守的規(guī)則等等。

<html lang="zh-CN">
  <!-- ... -->
</html>

<p id="html.4"><strong>字符編碼</strong></p>

通過明確聲明字符編碼,能夠確保瀏覽器快速并容易的判斷頁面內(nèi)容的渲染方式。這樣做的好處是,可以避免在 HTML 中使用字符實體標(biāo)記(character entity),從而全部與文檔編碼一致(一般采用 UTF-8 編碼)。

<head>
  <meta charset="UTF-8">
</head>

<p id="html.5"><strong>IE 兼容模式</strong></p>

IE 支持通過特定的 <meta> 標(biāo)簽來確定繪制當(dāng)前頁面所應(yīng)該采用的 IE 版本。除非有強(qiáng)烈的特殊需求,否則最好是設(shè)置為 edge mode,從而通知 IE 采用其所支持的最新的模式。

<meta http-equiv="X-UA-Compatible" content="IE=Edge">

<p id="html.6"><strong>引入 CSS 和 JavaScript 文件</strong></p>

根據(jù) HTML5 規(guī)范,在引入 CSS 和 JavaScript 文件時一般不需要指定 type 屬性,因為 text/css 和 text/javascript 分別是它們的默認(rèn)值。

<!-- External CSS -->
<link rel="stylesheet" href="code-guide.css">

<!-- In-document CSS -->
<style>
  /* ... */
</style>

<!-- JavaScript -->
<script src="code-guide.js"></script>

<p id="html.7"><strong>實用為王</strong></p>

盡量遵循 HTML 標(biāo)準(zhǔn)和語義,但是不要以犧牲實用性為代價。任何時候都要盡量使用最少的標(biāo)簽并保持最小的復(fù)雜度。

<p id="html.8"><strong>屬性順序</strong></p>

HTML 屬性應(yīng)當(dāng)按照以下給出的順序依次排列,確保代碼的易讀性。

  • <font color="red">class</font>
  • <font color="red">id</font>, <font color="red">name</font>
  • <font color="red">data-*</font>
  • <font color="red">src</font>, <font color="red">for</font>, <font color="red">type</font>, <font color="red">href</font>
  • <font color="red">title</font>, <font color="red">alt</font>
  • <font color="red">aria-*</font>, <font color="red">role</font>

class 用于標(biāo)識高度可復(fù)用組件,因此應(yīng)該排在首位。id 用于標(biāo)識具體組件,應(yīng)當(dāng)謹(jǐn)慎使用(例如,頁面內(nèi)的書簽),因此排在第二位。

<a class="..." id="..." data-modal="toggle" href="#">
  Example link
</a>

<input class="form-control" type="text">

<img src="..." alt="...">

<p id="html.9"><strong>布爾(boolean)型屬性</strong></p>

布爾型屬性可以在聲明時不賦值。XHTML 規(guī)范要求為其賦值,但是 HTML5 規(guī)范不需要。

元素的布爾型屬性如果有值,就是 true,如果沒有值,就是 false。

如果一定要為其賦值的話,請參考 WhatWG 規(guī)范:

如果屬性存在,其值必須是空字符串或 [...] 屬性的規(guī)范名稱,并且不要再收尾添加空白符。

簡單來說,就是不用賦值。

<input type="text" disabled>

<input type="checkbox" value="1" checked>

<select>
  <option value="1" selected>1</option>
</select>

<p id="html.10"><strong>減少標(biāo)簽的數(shù)量</strong></p>

編寫 HTML 代碼時,盡量避免多余的父元素。很多時候,這需要迭代和重構(gòu)來實現(xiàn)。請看下面的案例:

<!-- Not so great -->
<span class="avatar">
  <img src="...">
</span>

<!-- Better -->
<img class="avatar" src="...">

<p id="html.11"><strong>JavaScript 生成的標(biāo)簽</strong></p>

通過 JavaScript 生成的標(biāo)簽讓內(nèi)容變得不易查找、編輯,并且降低性能。能避免時盡量避免。

<h4 id="css">CSS</h4>

<p id="css.1"><strong>語法</strong></p>

  • 用兩個空格來代替制表符(tab) -- 這是唯一能保證在所有環(huán)境下獲得一致展現(xiàn)的方法。
  • 為選擇器分組時,將單獨的選擇器單獨放在一行。
  • 為了代碼的易讀性,在每個聲明塊的左花括號前添加一個空格。
  • 聲明塊的右花括號應(yīng)當(dāng)單獨成行。
  • 每條聲明語句的 : 后應(yīng)該插入一個空格。
  • 為了獲得更準(zhǔn)確的錯誤報告,每條聲明都應(yīng)該獨占一行。
  • 所有聲明語句都應(yīng)當(dāng)以分號結(jié)尾。最后一條聲明語句后面的分號是可選的,但是,如果省略這個分號,你的代碼可能更易出錯。
  • 對于以逗號分隔的屬性值,每個逗號后面都應(yīng)該插入一個空格(例如,<font color="red">box-shadow</font>)。
  • 不要在 <font color="red">rgb()</font>、<font color="red">rgba()</font>、<font color="red">hsl()</font>、<font color="red">hsla()</font> 或 <font color="red">rect()</font> 值的內(nèi)部的逗號后面插入空格。這樣利于從多個屬性值(既加逗號也加空格)中區(qū)分多個顏色值(只加逗號,不加空格)。
  • 對于屬性值或顏色參數(shù),省略小于 1 的小數(shù)前面的 0 (例如,<font color="red">.5</font> 代替 <font color="red">0.5</font>;<font color="red">-.5px</font> 代替 <font color="red">-0.5px</font>)。
  • 十六進(jìn)制值應(yīng)該全部小寫,例如,<font color="red">#fff</font>。在掃描文檔時,小寫字符易于分辨,因為他們的形式更易于區(qū)分。
  • 盡量使用簡寫形式的十六進(jìn)制值,例如,用 <font color="red">#fff </font>代替 <font color="red">#ffffff</font>。
  • 為選擇器中的屬性添加雙引號,例如,<font color="red">input[type="text"]</font>。只有在某些情況下是可選的,但是,為了代碼的一致性,建議都加上雙引號。
  • 避免為 0 值指定單位,例如,用 <font color="red">margin: 0</font>; 代替 <font color="red">margin: 0px</font>;。
/* Bad CSS */
.selector, .selector-secondary, .selector[type=text] {
  padding:15px;
  margin:0px 0px 15px;
  background-color:rgba(0, 0, 0, 0.5);
  box-shadow:0px 1px 2px #CCC,inset 0 1px 0 #FFFFFF
}

/* Good CSS */
.selector,
.selector-secondary,
.selector[type="text"] {
  padding: 15px;
  margin-bottom: 15px;
  background-color: rgba(0,0,0,.5);
  box-shadow: 0 1px 2px #ccc, inset 0 1px 0 #fff;
}

<p id="css.2"><strong>聲明順序</strong></p>

相關(guān)的屬性聲明應(yīng)當(dāng)歸為一組,并按照下面的順序排列:

  1. Positioning
  2. Box model
  3. Typographic
  4. Visual

由于定位(positioning)可以從正常的文檔流中移除元素,并且還能覆蓋盒模型(box model)相關(guān)的樣式,因此排在首位。盒模型排在第二位,因為它決定了組件的尺寸和位置。

其他屬性只是影響組件的內(nèi)部(inside)或者是不影響前兩組屬性,因此排在后面。

完整的屬性列表及其排列順序請參考 Recess。

.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;
}

<p id="css.12"><strong>不要使用 <font color="red">@import</font></strong></p>

與 <font color="red"><link> </font>標(biāo)簽相比,<font color="red">@import</font> 指令要慢很多,不光增加了額外的請求次數(shù),還會導(dǎo)致不可預(yù)料的問題。替代辦法有以下幾種:

  • 使用多個 <font color="red"><link></font> 元素
  • 通過 Sass 或 Less 類似的 CSS 預(yù)處理器將多個 CSS 文件編譯為一個文件
  • 通過 Rails、Jekyll 或其他系統(tǒng)中提供過 CSS 文件合并功能
<!-- Use link elements -->
<link rel="stylesheet" href="core.css">

<!-- Avoid @imports -->
<style>
  @import url("more.css");
</style>

<p id="css.3"><strong>媒體查詢(Media query)的位置</strong></p>

將媒體查詢放在盡可能相關(guān)規(guī)則的附近。不要將他們打包放在一個單一樣式文件中或者放在文檔底部。如果你把他們分開了,將來只會被大家遺忘。下面給出一個典型的實例。

.element { ... }
.element-avatar { ... }
.element-selected { ... }

@media (min-width: 480px) {
  .element { ...}
  .element-avatar { ... }
  .element-selected { ... }
}

<p id="css.4"><strong>帶前綴的屬性</strong></p>

當(dāng)使用特定廠商的帶有前綴的屬性時,通過縮進(jìn)的方式,讓每個屬性的值在垂直方向?qū)R,這樣便于多行編輯。

在 Textmate 中,使用 Text → Edit Each Line in Selection (??A)。在 Sublime Text 2 中,使用 Selection → Add Previous Line (??↑)Selection → Add Next Line (??↓)

/* Prefixed properties */
.selector {
  -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.15);
          box-shadow: 0 1px 2px rgba(0,0,0,.15);
}

<p id="css.5"><strong>單行規(guī)則聲明</strong></p>

對于只包含一條聲明的樣式,為了易讀性和便于快速編輯,建議將語句放在同一行。對于帶有多條聲明的樣式,還是應(yīng)當(dāng)將聲明分為多行。

這樣做的關(guān)鍵因素是為了錯誤檢測 -- 例如,CSS 校驗器指出在 183 行有語法錯誤。如果是單行單條聲明,你就不會忽略這個錯誤;如果是單行多條聲明的話,你就要仔細(xì)分析避免漏掉錯誤了。

/* Single declarations on one line */
.span1 { width: 60px; }
.span2 { width: 140px; }
.span3 { width: 220px; }

/* Multiple declarations, one per line */
.sprite {
  display: inline-block;
  width: 16px;
  height: 15px;
  background-image: url(../img/sprite.png);
}
.icon           { background-position: 0 0; }
.icon-home      { background-position: 0 -20px; }
.icon-account   { background-position: 0 -40px; }

<p id="css.6"><strong>簡寫形式的屬性聲明</strong></p>

在需要顯示地設(shè)置所有值的情況下,應(yīng)當(dāng)盡量限制使用簡寫形式的屬性聲明。常見的濫用簡寫屬性聲明的情況如下:

  • <font color="red">padding</font>
  • <font color="red">margin</font>
  • <font color="red">font</font>
  • <font color="red">background</font>
  • <font color="red">border</font>
  • <font color="red">border-radius</font>

大部分情況下,我們不需要為簡寫形式的屬性聲明指定所有值。例如,HTML 的 heading 元素只需要設(shè)置上、下邊距(margin)的值,因此,在必要的時候,只需覆蓋這兩個值就可以。過度使用簡寫形式的屬性聲明會導(dǎo)致代碼混亂,并且會對屬性值帶來不必要的覆蓋從而引起意外的副作用。

MDN(Mozilla Developer Network)上一片非常好的關(guān)于shorthand properties 的文章,對于不太熟悉簡寫屬性聲明及其行為的用戶很有用。

/* Bad example */
.element {
  margin: 0 0 10px;
  background: red;
  background: url("image.jpg");
  border-radius: 3px 3px 0 0;
}

/* Good example */
.element {
  margin-bottom: 10px;
  background-color: red;
  background-image: url("image.jpg");
  border-top-left-radius: 3px;
  border-top-right-radius: 3px;
}

<p id="css.7"><strong>Less 和 Sass 中的嵌套</strong></p>

避免非必要的嵌套。這是因為雖然你可以使用嵌套,但是并不意味著應(yīng)該使用嵌套。只有在必須將樣式限制在父元素內(nèi)(也就是后代選擇器),并且存在多個需要嵌套的元素時才使用嵌套。

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

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

<p id="css.8"><strong>注釋</strong></p>

代碼是由人編寫并維護(hù)的。請確保你的代碼能夠自描述、注釋良好并且易于他人理解。好的代碼注釋能夠傳達(dá)上下文關(guān)系和代碼目的。不要簡單地重申組件或 class 名稱。

對于較長的注釋,務(wù)必書寫完整的句子;對于一般性注解,可以書寫簡潔的短語。

/* Bad example */
/* Modal header */
.modal-header {
  ...
}

/* Good example */
/* Wrapping element for .modal-title and .modal-close */
.modal-header {
  ...
}

<p id="css.9"><strong>class 命名</strong></p>

  • class 名稱中只能出現(xiàn)小寫字符和破折號(dashe)(不是下劃線,也不是駝峰命名法)。破折號應(yīng)當(dāng)用于相關(guān) class 的命名(類似于命名空間)(例如,.btn 和 .btn-danger)。
  • 避免過度任意的簡寫。.btn 代表 button,但是 .s 不能表達(dá)任何意思。
  • class 名稱應(yīng)當(dāng)盡可能短,并且意義明確。
  • 使用有意義的名稱。使用有組織的或目的明確的名稱,不要使用表現(xiàn)形式(presentational)的名稱。
  • 基于最近的父 class 或基本(base) class 作為新 class 的前綴。
  • 使用 .js-* class 來標(biāo)識行為(與樣式相對),并且不要將這些 class 包含到 CSS 文件中。

在為 Sass 和 Less 變量命名是也可以參考上面列出的各項規(guī)范。

/* Bad example */
.t { ... }
.red { ... }
.header { ... }

/* Good example */
.tweet { ... }
.important { ... }
.tweet-header { ... }

<p id="css.10"><strong>選擇器</strong></p>

  • 對于通用元素使用 class ,這樣利于渲染性能的優(yōu)化。
  • 對于經(jīng)常出現(xiàn)的組件,避免使用屬性選擇器(例如,<font color="red">[class^="..."]</font>)。瀏覽器的性能會受到這些因素的影響。
  • 選擇器要盡可能短,并且盡量限制組成選擇器的元素個數(shù),建議不要超過 3 。
  • 只有在必要的時候才將 class 限制在最近的父元素內(nèi)(也就是后代選擇器)(例如,不使用帶前綴的 class 時 -- 前綴類似于命名空間)。
/* Bad example */
span { ... }
.page-container #stream .stream-item .tweet .tweet-header .username { ... }
.avatar { ... }

/* Good example */
.avatar { ... }
.tweet-header .username { ... }
.tweet .avatar { ... }

<p id="css.11"><strong>代碼組織</strong></p>

  • 以組件為單位組織代碼段。
  • 制定一致的注釋規(guī)范。
  • 使用一致的空白符將代碼分隔成塊,這樣利于掃描較大的文檔。
  • 如果使用了多個 CSS 文件,將其按照組件而非頁面的形式分拆,因為頁面會被重組,而組件只會被移動。
/*
 * Component section heading
 */

.element { ... }


/*
 * Component section heading
 *
 * Sometimes you need to include optional context for the entire component. Do that up here if it's important enough.
 */

.element { ... }

/* Contextual sub-component or modifer */
.element-heading { ... }

<h4 id="bjq">編輯器配置</h4>

將你的編輯器按照下面的配置進(jìn)行設(shè)置,以避免常見的代碼不一致和差異:

用兩個空格代替制表符(soft-tab 即用空格代表 tab 符)。
保存文件時,刪除尾部的空白符。
設(shè)置文件編碼為 UTF-8。
在文件結(jié)尾添加一個空白行。

動畫

按鈕

  1. 所有按鈕大小看起來一樣
  2. 風(fēng)格一直,協(xié)調(diào)
  3. 看起來像一個系列
  4. 按鈕命名規(guī)范
  5. 有意義
  6. 像素大小16*16,格式png
序號 按鈕名稱 圖標(biāo)名稱 圖標(biāo)樣式
1 增加 add
2 刪除 delete
3 編輯 edit
4 查找 find
5 保存 save
6 提交 submit
7 取消 cancel
8 關(guān)閉 close
9 返回 back
10 隱藏 hidden
11 更多 more
12 另存 saveas
13 審核 audit
14 表格 grid
15 拷貝 copy
16 粘貼 paste
17 剪切 cut
18 移動 move
19 打印 print
20 刷新 refresh
21 幫助 help
22 圖表 chart
23 上傳 upload
24 下載 download
25 導(dǎo)入 imp
26 導(dǎo)出 exp
27 上報 report
28 前插 tofront
29 后插 toback
30 左移 toleft
31 右移 toright
32 上移 totop
33 下移 tobottom
34 交接班 handover
35 上一班 lastteam
36 下一班 nextteam
37 本班 currentteam
38 批量導(dǎo)入 imps
39 啟用 enable
40 停用 disable
41 手動生成 make
42 通知 send
43 反饋 feedback
44 申請 apply
45 查看 view
46 退回 reject
47 通過 pass
48 重置 reset
49 過濾 filter
50 確定 ok
51 授權(quán) authorize
52 執(zhí)行 execute
53 簽到 sign

圖標(biāo)

提示

目錄

<p id="tishi.1"><strong>概述</strong></p>

<p id="tishi.2"><strong>成功</strong></p>

<div class="alert alert-success">
成功的提示信息。
</div>

效果:

<div class="alert alert-success">
成功的提示信息。
</div>

<p id="tishi.3"><strong>信息</strong></p>

<div class="alert alert-info">
這只是信息。
</div>

效果:

<div class="alert alert-info">
這只是信息。
</div>

<p id="tishi.4"><strong>警告</strong></p>

<div class="alert alert-warning">
警告的提示信息。
</div>

效果:

<div class="alert alert-warning">
警告的提示信息。
</div>

<p id="tishi.5"><strong>錯誤</strong></p>

<div class="alert alert-danger">
錯誤的提示信息。
</div>

效果:

<div class="alert alert-danger">
錯誤的提示信息。
</div>

命名

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 28,797評論 1 45
  • 南之山 我們一共五人同行--傲嬌的鬼、荷花、江神、燕子,還有我。 冬天的動車坐著格外溫暖,江神上車就呼呼的睡了,荷...
    夜雪舞回風(fēng)閱讀 512評論 2 6
  • 上下班路上那些所謂虛度的時光 同事問我每天上下班在路上的時間4個多小時,值不值,累不累。這個問題怎么回答吶,說心里...
    艾米姜閱讀 169評論 0 0
  • 首先解釋一下:NSIndexPath 是一個對象,它用來表示一個樹形的記錄地址。提到UITableView,就必須...
    海邊漫步的我閱讀 2,757評論 4 3

友情鏈接更多精彩內(nèi)容