早在大半年前,我在負責整理定義了前端組JavaScript開發規範與less、css樣式開發規範。一直想將兩個規範整理成文章,但在整理了JavaScript規範後,我花了較多的時間在學習JavaScript基礎知識,因此對於樣式規範一直處於放置狀態。直到上週我收到了一條關於JavaScript規範的評論,提醒了我樣式規範不能再拖了,那麼在放假前花點時間整理一遍做爲複習也算不錯。css
說在前面,本文雖然做爲規範但對於less與css寫法也給出了部分建議,因此在閱讀本規範前建議讀者先掌握less基本用法,而對於規範這裏也只是給出建議,畢竟適合本身的纔是最好的,本文開始。html
JavaScript變量咱們推薦使用小駝峯,但樣式命名得作點改變,這裏咱們推薦使用 - 分隔符拼接。前端
/* good */ #foo-bar;.foo-bar /* bad */ #fooBar;.fooBar
咱們知道less提供了樣式變量可供複用,對於多單詞變量命名推薦採用 @ 開頭並以 - 分隔符拼接的命名方式。java
/* good */ @border-color:#fff; /* bad */ @borderColor: #fff;
除了變量,less還提供了函數用於複用多屬性class樣式類,關於函數推薦以 . 開頭 - 分割線拼接方式命名;形參若爲多個單詞,推薦使用單詞首字母小寫方式簡寫,多個形參之間使用分號;隔離。(雖然函數用的很少)瀏覽器
/* good */ .foo-bar (@bg: #f5f5f5;@color: #900; @fz: 12px) { background: @bg; color: @color; font-size: @fz; } /* bad */ .foo-bar (@background: #f5f5f5, @color: #900, @font-size: 12px) { background: @background; color: @color; font-size: @font-size; }
less中的命名空間其實就是部分變量與混合模塊的包裝,對於命名空間推薦採用 # 開頭 - 分割線拼接方式進行統一。性能優化
/* good */ #foo-bar { .border-radius() { font-size: 12px; }; .border-color() { color: #fff; } }
less一大好處就是支持將一個文件單純做爲變量儲存文件,從而能夠在其它less中引入使用,先說less引入用法,這裏直接貼官網用法:less
因爲可能同時存在index.less
文件與index.css
文件,爲了便於同名但不一樣後綴的文件區分,@import外部文件引入後綴__不推薦省略__,若是文件自身只做爲引用使用而不須要編譯輸出,必須在文件引用時添加reference字段。函數
/* good */ @import 'demo.css'; //引入demo.css @import (reference) 'demo.less';//引入demo.less,只做引用,不輸出demo的內容 /* bad */ @import 'demo.css'; //引入demo.css @import 'demo'; //引入demo.less,並輸出
關於padding、margin:佈局
/* good */ margin: 1px 2px; padding: 2px; /* bad */ margin: 1px 2px 1px 2px; padding: 2px 2px 2px 2px;
當數值單位爲0時,請省略單位;若是存在小數點,推薦去掉0簡寫:性能
/* good */ transition-duration: .5s; margin-top: 0; /* bad */ transition-duration: 0.5s; margin-top: 0px;
顏色值推薦16進制寫法,而非RGB表現方式,固然若是須要使用透明度時仍是可使用RGB,請靈活變通:
/* good */ border-color: #f00; color: #fefefe; /* bad */ border-color: red; color: rgb(254, 254, 254);
出於性能考慮,避免元素選擇器與class或id選擇器疊加使用,這種寫法違背了html與樣式分離的規則,若是html標籤修改還得對應修改css中的元素選擇器;其次,因爲選擇器匹配規則是從右到左,原本定位到class或id就應該結束,若是你添加了元素選擇器,css還得再匹配全部的元素,很是耗性能,因此強烈不推薦。
/* good */ .foo-bar /* bad */ div.foo-bar
當多個選擇器具備共同屬性,推薦使用逗號分割選擇器進行復用,每一個選擇器獨立成行。若是爲less環境,也推薦變量,混入等其它作法。
/* good */ h1, h2, h3{ color: #fff; } /* bad */ h1,h2,h3{ color: #fff; }
僞類屬性建議採用父選擇器寫法代替傳統寫法,看幾個例子:
常見僞類,好比hover等
/* good */ a { color: #fff; &:hover { color: #ddd; } } /* bad */ a { color: #fff; } a:hover { color: #ddd; }
clearfix hack示例:
/* good */ .demo { font-size: 12px; &:after { display: block; content: ''; clear: both; } } /* bad */ .demo { font-size: 12px; } .demo:after { display: block; content: ''; clear: both; }
在書寫樣式前,請先劃分頁面佈局並以佈局塊爲單位書寫樣式,不可隨意零散定義。代碼塊書寫推薦從上到下,從左到右的書寫順序,不該該存在子級樣式定義早於父級,底層樣式定義早於上層樣式的狀況。
好比頁面分爲頭部,主體與尾部,那麼尾部樣式早於頭部樣式定義;再如主體內部分爲左右兩個盒子,右側盒子樣式不可早於左側盒子,這樣代碼更符合佈局閱讀習慣。
/* good */ .parent {} .child {} .top {} .bottom {} /* bad */ .child {} .parent {} .bottom {} .top {}
變量、文件必須先聲明/引用再使用,其次,文件引用代碼應放在文件頭部。
/* good */ @import 'demo.less'; @color: #fff; .page { color:@color; } /* bad */ @import 'demo.less'; .page { color:@color; } @color: #fff;
less推薦嵌套寫法,且嵌套不推薦超過三層:
/* good */ .parent { color: #fff; .child{ font-size: 12px; } } /* bad */ .parent { color: #fff; } .parent .child { font-size: 12px; }
對於頁面總體佈局中的大塊,推薦在樣式定義前添加註釋說明,例如:
/* good */ /* 頭部樣式定義 */ .header {} /* 產品推薦樣式定義 */ .mayLike {}
關於函數混入,若是被混入的屬性類自身不須要被編譯輸出,必須爲屬性類加上括號()。
/* good */ .border-color() { color: #fff; } .demo { .border-color; } /* bad */ .border-color{ color:#fff; } .demo{ .border-color; }
關於函數參數,若須要引用全部形參是一條屬性的不一樣值,推薦@arguments代替形參分散的寫法:
/* good */ .box-shadow(@x:0;@y:0;@blur:1;@color:#000){ box-shadow:@arguments; } /* bad */ .box-shadow(@x:0; @y:0; @blur:1; @color:#fff){ box-shadow:@x @y @blur @color; }
若是被混入的屬性類自身須要被編譯輸出,建議使用繼承來代替混入:
/* good */ .border-color{ color: #fff; } .demo { &:extend(.border-color); } /* 編譯後 */ .border-color, .demo{ color: #fff; } /* bad */ .border-color{ color: #fff; } .demo { .border-color; } /* 編譯後 */ .border-color{ color: #fff; } .demo { color: #fff; }
Display 屬性會影響頁面的渲染,請合理使用
動畫優化
提高 CSS 選擇器性能,合理使用關鍵選擇器
.content * {color: red;}
button#backButton {…}
treecell.indented {…}
那麼到這裏,關於css、less規範就介紹完畢了,樣式雖然簡單,但經過合理的規劃,不論是在後期維護代碼或者去讀懂同事的代碼,都會帶來意想不到的便利。
說好一個月最少寫八篇博客,還差三篇只能回家寫了。如今是2020年1月20日零點18分,過完今天我就要回家過年啦!!!!雖然我還沒搶到回家的票...明天仍是找黃牛安排一下,那麼晚安,我又熬夜了。