精通CSS意味着不只能寫出可用的標記和樣式,還能讓代碼好閱讀、方便移植、易維護。css
外部代理質量就是用戶能體驗到的最終結果。主要體如今幾個方面。html
咱們要善於利用瀏覽器的開發者工具。前端
瀏覽器在加載一個網站時,首先會收到網址對應的一個HTML文件。而後瀏覽器把這個HTML文件解析爲一個對象(節點)樹。這就是文檔對象模型(DOM,document object model)。編程
<html lang="en"> <head> <meta charset="utf-8"> <title>Test Document</title> </head> <body> <h1>This is a test.</h1> <p>This is a paragraph.</p> <p>This is anothr paragraph.</p> </body> </html>
瀏覽器在碰到HTML中指向CSS文件的連接時,會獲取並解析CSS文件。相似於把HTML轉換成DOM,CSS文件會被瀏覽器轉換爲CSS對象模型(CSSOM,CSS object model)。
不只是外部CSS,內部style元素或行內style屬性中的CSS也會被解析並添加到CSSOM中。
每一個CSS選擇符都會匹配一個DOM節點,而後瀏覽器會基於層疊、繼承和特殊性來計算每一個DOM節點的最終樣式。瀏覽器
在渲染樹中,每一個節點表示要渲染到屏幕上的信息。
在構建完成的渲染樹中,節點都應該知道了本身是什麼顏色、文本使用哪一種字體顯示,以及是否有明確的寬度,等等。編程語言
瀏覽器會遍歷渲染樹,肯定每一個對象顯示在頁面上的什麼位置,這個過程叫佈局(layout)或重排(reflow)。
肯定了每一個渲染對象的位置和屬性後,瀏覽器能夠計算出它們在屏幕上佔據的像素數,這個過程叫繪製。模塊化
瀏覽器若是發現最終圖像的某一部分不影響頁面其餘內容的顯示,也可能決定把繪製拆分紅不一樣的任務,每一個任務負責繪製頁面上特定的部分,或者叫層。應用了濾鏡或混合模式的元素,須要肯定如何與其餘層混合。這個先拆分爲層,再組合起來的過程叫合成(compositing)。函數
爲保證屏幕上的頁面能平滑變化,最好能在16毫秒之內完成重繪。16毫秒對應的屏幕刷新率爲60Hz。
有些變化幾乎不會影響性能,好比滾動頁面。這時候瀏覽器只要把整個渲染結果從新繪製到不一樣位置便可。若是某些變化會致使頁面上的樣式改變,那麼就可能會影響性能。工具
代碼的內部質量從幾個方面來衡量:佈局
CSS很容易學會。做爲一個設計師,應該能作到拿起一個網頁就能夠給它應用樣式。換句話說,使用它不須要多高深的軟件編寫知識。
若是隻是作一個原型草稿,那麼代碼質量倒無所謂,能用就行。然而,一旦涉及線上的產品,代碼質量就可能產生深遠的影響。它關係到維護成本的高低,出現bug的可能性,以及新人上手的難易。
<div id="pink-box"> <p>This is alert message implementation one</p> </div>
div#pink-box { border-radius: .5em; padding: 1em; border: .25em solid #d9c7cc; background-color: #ffeded; color: #373334; }
ID選擇符主要是用於頁內連接,或做爲JavaScript的接入點。固然把它們用做CSS選擇符也徹底可行,但ID選擇符的高特殊性致使難以覆蓋它們的樣式。
選擇符前面還加了div
,目的是限定ID選擇符。這種元素與ID或類選擇符共用的情形也很常見,但一般是用於覆蓋某些太過特殊的選擇符的。
改進的實現:
<div class="message"> <p>This is a <code>message</code> box</p> </div> <div class="message message-warning"> <p>This is a <code>message message-warning</code> box</p> </div> <div class="message message-success"> <p>This is a <code>message message-success</code> box</p> </div>
.message { border-radius: .5em; padding: 1em; border: .25em solid rgba(0, 0, 0, 0.15); background-color: #ffffed; color: rgba(0, 0, 0, 0.8); } .message-warning { background-color: #ffeded; } .message-success { background-color: #edffed; } .message + .message { margin-top: 1em; }
咱們能夠概括幾條有助於提高代碼質量的原則:
這幾條原則有一個共性,即限制層疊效應,主要是經過控制特殊性實現的。
CSS方法論歸根結底是爲了管理複雜性。
即便沒有CSS(包括JavaScript),網頁自己也應該能傳達自身的信息。
HTML規範中關於類名的描述:
做者給class屬性賦什麼值並無限制,但咱們推薦使用可以描述內容本質而非描述內容表現的名稱。
CSS規範中對類名的描述:
CSS爲class屬性賦予了太多能力,做者能夠徹底自主地設計他們本身的「文檔語言」,以幾乎沒有什麼表現性傾向的元素(如HTML中的div和span)爲基礎,並經過class屬性指定樣式信息。做者不該該這樣作,由於文檔語言的結構化元素一般具備公認的含義,做者定義的類則沒有。
CSS沒有通用編程語言的語法,循環、函數、列表、變量,這些都沒有。
有人爲CSS寫了另外一種語法,叫預處理器,它能把基於通用編程語言的語法編寫的樣式轉換成CSS。目前常見的預處理器有Sass、Less、Stylus、PostCSS等。
Sass(syntactically awesome style sheets,語法超帥的樣式表)是最流行的。編寫Sass最經常使用的方式使用CSS的超集,叫SCSS。換句話說,SCSS支持一切有效的CSS語法,此外又加上了Sass特有的功能。
使用Node和Gulp構建CSS工做流
Node是JavaScript在瀏覽器以外的實現,可用於任何須要編程實現的任務。自從Node問世以來,大量前端開發工具都是基於JavaScript的,正所謂「一客不煩二主」。
說到前端工做流,有不少Node工具,像Grunt、Gulp、Broccolli,都是專一於實現構建任務的。這些工具都是可配置的,並且多任務之間能夠連綴輸出,共同實現完整的流程。
CSS特性受到瀏覽器支持的程度並不一致,在使用新特性時要考慮漸進加強這一原則(儘管不少特性已經獲得廣泛支持,但對於確實不支持它們的瀏覽器,應該也有相應的備用實現)。
Web組件指的是一組規範,可讓開發者把HTML、CSS和JavaScript打包成一個真正完備、可重用的組件,就像原生的元素同樣。Web組件能夠直接放到項目裏使用,沒必要擔憂樣式或腳本會發生命名衝突。
參考資料: