本文轉載自https://github.com/fex-team/styleguide
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
CSS作為網頁樣式的描述語言,在百度一直有着廣泛的應用。本文檔的目标是使CSS代碼風格保持一緻,容易被了解和被維護。
雖然本文檔是針對CSS設計的,但是在使用各種CSS的預編譯器(如less、sass、stylus等)時,适用的部分也應盡量遵循本文檔的約定。
解釋:
UTF-8 編碼具有更廣泛的适應性。BOM 在使用程式或工具處理檔案時可能造成不必要的幹擾。
示例:
常見不可分割的場景為URL超長。
不允許使用單引号,不允許不使用引号。
在性能和維護性上,都有一定的影響。
border / margin / padding 等縮寫會同時設定多個屬性的值,容易覆寫不需要覆寫的設定。如某些方向需要繼承其他聲明的值,則應該分開設定。
Formatting Model 相關屬性包括:<code>position</code> / <code>top</code> / <code>right</code> / <code>bottom</code> / <code>left</code> / <code>float</code> / <code>display</code> / <code>overflow</code> 等
Box Model 相關屬性包括:<code>border</code> / <code>margin</code> / <code>padding</code> / <code>width</code> / <code>height</code> 等
Typographic 相關屬性包括:<code>font</code> / <code>line-height</code> / <code>text-align</code> / <code>word-wrap</code> 等
Visual 相關屬性包括:<code>background</code> / <code>color</code> / <code>transition</code> / <code>list-style</code> 等
另外,如果包含 <code>content</code> 屬性,應放在最前面。
觸發 BFC 的方式很多,常見的有:
float 非 none
position 非 static
overflow 非 visible
如希望使用更小副作用的清除浮動方法,參見 A new micro clearfix hack 一文。
另需注意,對已經觸發 BFC 的元素不需要再進行 clearfix。
必須注意的是,僅在設計上 <code>确實不允許任何其它場景覆寫樣式</code> 時,才使用内聯的 <code>!important</code> 樣式。通常在第三方環境的應用中使用這種方案。下面的 z-index 章節是其中一個特殊場景的典型樣例。
同層的多個元素,如多個由使用者輸入觸發的 Dialog,在該層級内使用相同的 <code>z-index</code> 或遞增 <code>z-index</code>。
建議每層包含100個 <code>z-index</code> 來容納足夠的元素,如果每層元素較多,可以調整這個數值。
可控環境分成兩種,一種是自身産品線環境;還有一種是可能會被其他産品線引用,但是不會被外部第三方的産品引用。
不建議取值為 <code>2147483647</code>。以便于自身産品線被其他産品線引用時,當遇到層級覆寫沖突的情況,留出向上調整的空間。
第三方環境對于開發者來說完全不可控。在第三方環境下的元素,為了保證元素不被其頁面其他樣式定義覆寫,需要采用此做法。
文本類型的内容可能在選擇器、屬性值等内容中。
帶有alpha的顔色資訊可以使用 <code>rgba()</code>。使用 <code>rgba()</code> 時每個逗号後必須保留一個空格。
2D 位置初始值為 <code>0% 0%</code>,但在隻有一個方向的值時,另一個方向的值會被解析為 center。為避免了解上的困擾,應同時給出兩個方向的值。background-position屬性值的定義
所謂英文 Family Name,為字型檔案的一個中繼資料,常見名稱如下:
字型
作業系統
Family Name
宋體 (中易宋體)
Windows
SimSun
黑體 (中易黑體)
SimHei
微軟雅黑
Microsoft YaHei
微軟正黑
Microsoft JhengHei
華文黑體
Mac/iOS
STHeiti
冬青黑體
Hiragino Sans GB
文泉驿正黑
Linux
WenQuanYi Zen Hei
文泉驿微米黑
WenQuanYi Micro Hei
更詳細說明可參考本文。
由于 Windows 的字型渲染機制,小于 12px 的文字顯示效果極差、難以辨認。
由于中文字型沒有 italic 風格的實作,所有浏覽器下都會 fallback 到 obilique 實作 (自動拟合為斜體),小字号下 (特别是 Windows 下會在小字号下使用點陣字型的情況下) 顯示效果差,造成閱讀困難。
CSS 的字重分 100 – 900 共九檔,但目前受字型本身品質和浏覽器的限制,實際上支援 400 和 700 兩檔,分别等價于關鍵詞 normal 和 bold。
浏覽器本身使用一系列啟發式規則來進行比對,在 <700 時一般比對字型的 Regular 字重,>=700 時比對 Bold 字重。
但已有浏覽器開始支援 =600 時比對 Semibold 字重 (見此表),故使用數值描述增加了靈活性,也更簡短。
将 line-height 設定為數值,浏覽器會基于目前元素設定的 font-size 進行再次計算。在不同字号的文本段落組合中,能達到較為舒适的行間間隔效果,避免在每個設定了 font-size 都需要設定 line-height。
當 line-height 用于控制垂直居中時,還是應該設定成與容器高度一緻。
見本文,在可能的情況下應選擇這樣四種變換:
<code>transform: translate(npx, npx);</code>
<code>transform: scale(n);</code>
<code>transform: rotate(ndeg);</code>
<code>opacity: 0..1;</code>
典型的,可以使用 translate 來代替 left 作為動畫屬性。
标準屬性放在最後,按冒号對齊友善閱讀,也便于在編輯器内進行多行編輯。
如果能通過合理的 HTML 結構或使用其他的 CSS 定義達到理想的樣式,則不應該使用 hack 手段解決問題。通常 hack 會導緻維護成本的增加。
盡量使用符合 CSS 文法的 selector hack,可以避免一些第三方庫無法識别 hack 文法的問題。