使用良好的CSS書寫規范來寫CSS代碼,可以提升代碼的閱讀體驗,這里設計達人網總結一個CSS書寫規范、CSS書寫順序供大家參考:
CSS書寫順序
1.位置屬性(position, top, right, z-index, display, float等)
2.大小(width, height, padding, margin)
3.文字系列(font, line-height, letter-spacing, color- text-align等)
4.背景(background, border等)
5.其他(animation, transition等)
按照上述1 2 3 4 5的順序進行書寫,目的:減少瀏覽器reflow(回流),提升瀏覽器渲染dom的性能。
瀏覽器的渲染流程為:
(1)瀏覽器解析html構建dom樹,解析css構建cssom樹即css rule tree:將html和css都解析成樹形的數據結構; dom樹的構建過程是一個深度遍歷過程:當前節點的所有子節點都構建好后才會去構建當前節點的下一個兄弟節點。
(2)構建render樹:DOM樹和cssom樹合並之后形成render樹。為了構建渲染樹,瀏覽器大體完成了下列工作:從DOM樹的根節點開始遍歷每個可見節點。對於每個可見節點,為其找到適配的CSSOM規則並應用它們。發射可見節點,連同其內容和計算的樣式。渲染樹中包含了屏幕上所有可見內容及其樣式信息。
(3)布局render樹:有了render樹,瀏覽器已經知道網頁中有哪些節點,各個節點的css定義以及它們的從屬關系,接着就開始布局,計算出每個節點在屏幕中的位置和大小。(html采用了一種流式布局的布局模型,從上到下,從左到右順序布局,布局的起點是從render樹的根節點開始的,對應dom樹的document節點,其初始位置為(0,0),詳細的布局過程為:每個renderer的寬度由父節點的renderer確定。父節點遍歷子節點,確定子節點的位置(x,y),調用子節點的layout方法確定其高度,父節點根據子節點的height, margin, padding確定自身的高度)。
(4)渲染,繪制render樹:瀏覽器已經知道啦哪些節點要顯示,每個節點的css屬性是什么,每個節點在屏幕中的位置是哪里。就進入啦最后一步,按照計算出來的規則,通過顯卡把內容畫在屏幕上。
瀏覽器並不是一獲取到css樣式就立馬開始解析而是根據css樣式的書寫順序按照dom樹的結構分布render樣式,完成第(2)步,然后開始遍歷每個樹節點的css樣式進行解析,此時的css樣式的遍歷順序完全是按照之前的的書寫順序,在解析過程中,一旦瀏覽器發現某個元素的定位變化影響布局,則需要倒回去重新渲染。
例如css樣式:{width: 100px; height: 100px; background-color: red; position: absolute;}當瀏覽器解析到position的時候突然發現該元素是絕對定位元素需要脫離文檔流,而之前卻是按照普通元素進行解析的,所以不得不重新渲染,解除該元素在文檔中所占位置,然而由於該元素的占位發生變化,其他元素也可能會受到回流的影響而重新排位,最終導致(3)步驟花費時間太久而影響到(4)步驟的顯示,影響了用戶體驗。
注:render樹的結構不等同於DOM樹的結構,一些設置display:none的節點不會被放在render樹中,但會在dom樹中。
有些情況,比如修改了元素的樣式,瀏覽器並不會立刻reflow或repaint,而是把這些操作積攢一批,然后做一次reflow,這也叫做異步reflow。但是在有些情況下,比如改變窗口大小,改變頁面默認字體等瀏覽器會馬上進行reflow。
為了更好的用戶體驗,渲染引擎將會盡可能早的將內容呈現在屏幕上,並不會等到所有html都解析完成之后再去構建和布局render樹。它是解析完一部分內容就顯示一部分內容,同時,可能還在網絡上下載其余內容。
render tree:
<html> <head> <title>Greeting</title> </head> <body> Hello,<span>world! <img id="footer" /></span> </body> </html>
CSS書寫規范
使用CSS縮寫屬性
CSS有些屬性是可以縮寫的,比如padding,margin,font等等,這樣精簡代碼同時又能提高用戶的閱讀體驗。
去掉小數點前的“0”
簡寫命名
很多用戶都喜歡簡寫類名,但前提是要讓人看懂你的命名才能簡寫哦!
16進制顏色代碼縮寫
有些顏色代碼是可以縮寫的,我們就盡量縮寫吧,提高用戶體驗為主。
連字符CSS選擇器命名規范
1.長名稱或詞組可以使用中橫線來為選擇器命名。
2.不建議使用“_”下划線來命名CSS選擇器,為什么呢?
- 輸入的時候少按一個shift鍵;
- 瀏覽器兼容問題 (比如使用_tips的選擇器命名,在IE6是無效的)
- 能良好區分JavaScript變量命名(JS變量命名是用“_”)
這里有一篇破折號與下划線的詳細討論,英文:點擊查看 中文篇:點擊查看
不要隨意使用id
id在JS是唯一的,不能多次使用,而使用class類選擇器卻可以重復使用,另外id的優先級優先與class,所以id應該按需使用,而不能濫用。
為選擇器添加狀態前綴
有時候可以給選擇器添加一個表示狀態的前綴,讓語義更明了,比如下圖是添加了“.is-”前綴。
CSS命名規范(規則)
常用的CSS命名規則
頭:header
內容:content/container
尾:footer
導航:nav
側欄:sidebar
欄目:column
頁面外圍控制整體佈局寬度:wrapper
左右中:left right center
登錄條:loginbar
標志:logo
廣告:banner
頁面主體:main
熱點:hot
新聞:news
下載:download
子導航:subnav
菜單:menu
子菜單:submenu
搜索:search
友情鏈接:friendlink
頁腳:footer
版權:copyright
滾動:scroll
內容:content
標簽:tags
文章列表:list
提示信息:msg
小技巧:tips
欄目標題:title
加入:joinus
指南:guide
服務:service
注冊:regsiter
狀態:status
投票:vote
合作伙伴:partner
注釋的寫法:
/* Header */
內容區
/* End Header */
id的命名:
1)頁面結構
容器: container
頁頭:header
內容:content/container
頁面主體:main
頁尾:footer
導航:nav
側欄:sidebar
欄目:column
頁面外圍控制整體佈局寬度:wrapper
左右中:left right center
(2)導航
導航:nav
主導航:mainnav
子導航:subnav
頂導航:topnav
邊導航:sidebar
左導航:leftsidebar
右導航:rightsidebar
菜單:menu
子菜單:submenu
標題: title
摘要: summary
(3)功能
標志:logo
廣告:banner
登陸:login
登錄條:loginbar
注冊:register
搜索:search
功能區:shop
標題:title
加入:joinus
狀態:status
按鈕:btn
滾動:scroll
標籤頁:tab
文章列表:list
提示信息:msg
當前的: current
小技巧:tips
圖標: icon
注釋:note
指南:guild
服務:service
熱點:hot
新聞:news
下載:download
投票:vote
合作伙伴:partner
友情鏈接:link
版權:copyright
注意事項::
1.一律小寫;
2.盡量用英文;
3.不加中槓和下划線;
4.盡量不縮寫,除非一看就明白的單詞。
CSS樣式表文件命名
主要的 master.css
模塊 module.css
基本共用 base.css
布局、版面 layout.css
主題 themes.css
專欄 columns.css
文字 font.css
表單 forms.css
補丁 mend.css
打印 print.css
部分內容轉自:http://www.shejidaren.com/css-written-specifications.html