成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

css進階學習 選擇符

瀏覽:549日期:2022-06-02 17:45:04

在我最早開始寫css的時候,其代碼上的高自由度就一直很令我困惑。這就是說,同一個設計,如果讓不同的人來實現,最終的代碼一定是有差異的。但這存在一個問題,如果不同的人通過不同的方法以及代碼風格,都從外觀上實現了一樣的設計,將很難評價誰做得更好。想來也是,既然都實現了設計,達到了目的,css這種沒有程序邏輯的代碼中,又能找出什么來說明誰做得更出色呢?

而如今,我認同的觀念是,css這種描述性語言,仍然有著代碼上的質量評判。評判標準就是可維護性(Maintainability)和性能(Performance),用比較通俗的話說,好的css,要對開發者的工作友好(dev-friendly),也要對瀏覽器友好(browser-friendly)。 本文將說明如何從css選擇符的角度來提高css代碼質量。

關鍵選擇符與瀏覽器的樣式規則匹配原理

css選擇符的概念,在之前的新手學習css優先級的開頭部分也有提到,是指每一條樣式規則中,描述把樣式作用到哪些元素的部分,也即{}之前的部分。在本文,還要額外介紹一個概念:關鍵選擇符(Key selector)。關鍵選擇符就是在每一條樣式規則起始的{之前的最后一個選擇符,如下圖:

css選擇符將確定后面的屬性定義要作用到哪些元素,因此存在一個瀏覽器根據css選擇符來應用樣式到對應元素的匹配過程。關于瀏覽器的樣式匹配系統,David Hyatt在Writing Efficient CSS for use in the Mozilla UI一文中提到了以下內容:

The style system matches a rule by starting with the rightmost selector and moving to the left through the rule"s selectors. As long as your little subtree continues to check out, the style system will continue moving to the left until it either matches the rule or bails out because of a mismatch.

意思是說,瀏覽器引擎在樣式匹配時,以從右向左的順序進行。在具體匹配某一條樣式規則時,這個從右向左的過程會一直持續,直到讀取完整個選擇符序列并完成匹配,或因某一個地方的不匹配而取消(然后轉到另一條樣式規則)。

至于為什么瀏覽器會選擇這樣的匹配順序,你可以看看Stack Overflow上的相關討論。大致上解釋一下的話,由于最右邊的關鍵選擇符直接表示了樣式定義應作用的元素,所以從右向左的順序更利于瀏覽器在初始匹配的時候就確定有樣式定義的元素集合,并更快地在找某一個元素的樣式時避開大多數實際沒有作用到的選擇符。

更好的css選擇符,是讓瀏覽器在樣式匹配過程中減少匹配查詢次數,以更快的速度完成樣式匹配,從而優化前端性能。這其中,也必須參考瀏覽器的對于樣式從右向左的匹配順序。

css選擇符的正確使用方式更特定

更具體的關鍵選擇符

關鍵選擇符是瀏覽器引擎在樣式匹配時最先讀取到的部分,因此,如果你在某一條樣式規則中使用更特定、具體的選擇符,可以幫助減少瀏覽器的查找匹配次數。

比如說下邊這樣的選擇符:

.content .note span{}

最后一個span是關鍵選擇符,而span這個標簽,在網頁中使用是非常多的。瀏覽器從span開始讀取選擇符,就可能會為因此在樣式匹配上做了一些額外工作。

如果你確定只是想為具體處于那一個位置的span元素定義樣式,更好的做法是為span命名class,比如命名為span.note_text,然后簡單寫為:

.note_text{}

使用class選擇符

class選擇符(類選擇符)是最利于性能優化的選擇符。相對于class,ID的缺點是只允許定義給一個元素,無法重用。而此外,它在使用上沒有任何比class更好的地方。很多時候,你很難確定某一個元素是否是唯一的。另外,使用class來定義樣式,而保留ID給javascript,一直是一個較好的實踐。如果可以,不使用ID來定義樣式。

而相對于class,標簽在html中的重復性要更大,因此同樣可能讓瀏覽器在樣式匹配時做更多的額外工作。如果可以,除css樣式清零(reset)外,不使用標簽選擇符(也叫元素選擇符)。

縮短選擇符序列

繼承寫法(準確地說,這里指css關系選擇符中的包含選擇符)是css中很常用的寫法。繼承寫法的初衷是,如果有兩個元素,都是同樣的標簽或有相同的class命名,加入父元素的選擇符組成選擇符序列,就可以避免在不需要的時候兩個元素的樣式互相影響。比如.confirm_layer .submit_btn就是指,class名為submit_btn,且有一個class名為confirm_layer的父元素的元素,才應用樣式。

但是,避免元素樣式相互影響,并不代表可以隨意地使用繼承選擇符。前面提到,瀏覽器會從右向左讀取整個選擇符序列,直到讀取完畢并匹配完成,或者因不匹配而取消。因此,短的選擇符序列更有利于瀏覽器更快地完成匹配過程。相對的,冗長的選擇符序列則認為是低效的,比如:

.header ul li .nav_link{}

建議寫為:

.header .nav_link{}

一般來說,不超過3層的繼承層級就可以滿足實際中的開發要求。因此,應減少不必要的繼承層級,使用更短的選擇符序列。

此外,較長的選擇符序列還有一個問題。有較長選擇符的樣式規則,css優先級的計算值也較大,因此,如果在以后需要寫新的樣式來覆蓋掉它,就需要寫更長的選擇符(或者使用ID)以獲得更高的css優先級。這對性能和代碼可讀性都是不利的。

避免鏈式選擇符

鏈式選擇符(Chaining selectors)是對單個元素同時寫了多個選擇符判定的情況。比如p.name是指class名為name,且標簽是p的元素,才應用樣式。這些判定組合可以是ID選擇符,標簽選擇符,class選擇符的任意組合。

但是,鏈式選擇符是過度定義(over qualified)的,不利于重用,也不利于性能優化。如:

a#author{}

建議寫為:

#author{}

這里的a是不必要的。一個ID只對應一個元素,沒有必要再強調這個元素的標簽是什么(同理,class也不必)。另外有

.content span.arrow{}

建議寫為:

.content .arrow{}

這里的span.arrow中的span也是不必要的。一方面,這為瀏覽器在樣式匹配時增加了一項額外工作:檢查class名為arrow的元素的標簽名是不是span,也因此降低了性能。另一方面,如果去掉了這個限定,.arrow的樣式定義,就可以用在更多的元素上,也就有著更好的重用性。否則,就還得告訴別人,使用這個的時候只能用在span標簽上。

同理,多個class的鏈式寫法,如

.tips.succuss{}

建議更改命名,寫為:

.tips_succuss{}

這樣可以幫助瀏覽器減少額外的樣式匹配工作。

此外,IE6還存在一個鏈式選擇符的問題,多個class選擇符寫在一起時,例如.class1.class2.class3,正常情況是只有同時有這全部的class的元素,才應用樣式。但IE6只認最后一個,也就是符合.class3這個選擇符的元素,就應用樣式。

例外情況

前面所述的選擇符的寫法的建議,只是從瀏覽器渲染性能優化,及代碼的重用性方面分析得到的理論結果。在實際使用中,你并不需要嚴格按照這些內容來做。例如,如果你確實是準備為class名為intro的元素內的所有a標簽元素都加上某樣式,那么.intro a這樣的選擇符是明智的。

結語

關于高效的css選擇符的指南,你還可以閱讀google developer中的Use efficient CSS selectors。

如今,現代瀏覽器在樣式匹配上也逐漸有了更多的優化(參考CSS Selector Performance has changed!),有些方面的內容我們已經不再需要再擔心了。但是,這并不意味著不需要考慮寫合理的css選擇符了。css選擇符性能優化是依然存在的事,你的選擇符應該更好地體現你的意圖,而不是隨心所欲地使用。更重要的是,以這樣一種稍細膩的,經過思考的想法來寫css選擇符,并不是一件困難的事。只要你想,形成這樣的一種習慣,你就可以自然地在這方面做得更好,何樂而不為呢?

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持。

標簽: CSS HTML
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美精品乱码久久久久久按摩| 亚洲精品在线免费观看视频| 久久综合色8888| 欧美日韩免费高清| 日韩在线播放一区二区| 久久久五月婷婷| 欧美在线观看你懂的| 激情视频一区二区| 国产91丝袜在线播放0| 亚洲制服欧美中文字幕中文字幕| 欧美日韩国产不卡| 欧美精品偷拍| 国产精品77777竹菊影视小说| 亚洲精品日韩综合观看成人91| 日韩精品一区二区三区四区| 国产精品久久久久久模特 | 五月婷婷色综合| 欧美一个色资源| 欧美午夜电影在线播放| 免费试看一区| 国产精品免费在线| 影音先锋亚洲一区| 91丨九色porny丨蝌蚪| 免费黄网站欧美| 亚洲精品成人在线| 国产精品色在线观看| 欧美电视剧在线看免费| 欧美日韩亚洲国产综合| 色综合久久88色综合天天 | 日本一区二区在线不卡| 日韩一区二区电影在线| 欧美日韩亚洲综合| 欧洲精品视频在线观看| 亚洲一区bb| 国产乱人伦精品一区二区 | 日韩欧美一级二级| 在线播放日韩导航| 欧美狂野另类xxxxoooo| 欧美亚洲一区二区在线| 欧美在线免费视屏| 日本高清不卡视频| 在线观看日韩av先锋影音电影院| 在线中文字幕一区| 欧美色涩在线第一页| 欧美日韩一卡二卡三卡| 欧美激情1区2区| 911精品国产一区二区在线| 不卡电影一区二区三区| 久久精品亚洲一区二区三区浴池| 99久久精品国产观看| 一本大道久久精品懂色aⅴ| 亚洲午夜激情网页| 六月婷婷一区| 午夜精品一区在线观看| 欧美日韩一级片在线观看| 92国产精品观看| 欧美日一区二区三区在线观看国产免| 欧美三级免费| 国产精品久久久久久久免费软件| 久久精品欧洲| 欧美日韩国产首页| 欧美精品一区二区三区久久久| 欧美国产精品一区| 一区二区免费视频| 老汉av免费一区二区三区| 美腿丝袜亚洲一区| 国产精品一区免费在线观看| 不卡影院免费观看| 欧美日韩无遮挡| 亚洲欧美日韩国产一区二区| 精品视频在线免费| 欧美激情一区二区三区全黄 | 亚洲444eee在线观看| 精品夜夜嗨av一区二区三区| 成人午夜又粗又硬又大| 黑人一区二区三区四区五区| 亚洲一区二区三区精品在线观看| 久热精品在线| 欧美日韩成人在线| 日本一区二区免费在线| 亚洲一区二区三区在线看| 国产精品一区二区视频| 亚洲第一在线| 欧美精品第1页| 中文字幕日本乱码精品影院| 免费观看在线综合色| av影院午夜一区| 免费视频一区| 久久久久久久综合狠狠综合| 亚洲国产成人porn| 成人三级在线视频| 国产伦精品一区二区三区视频黑人| 欧美精品xxxxbbbb| 国产精品夫妻自拍| 精品亚洲免费视频| 亚洲成色www久久网站| 欧美丝袜自拍制服另类| 亚洲国产激情av| 狠狠色丁香久久婷婷综合_中| 色综合一区二区| 在线观看亚洲精品视频| 中文字幕中文乱码欧美一区二区 | 久久亚洲电影| 国产欧美日韩麻豆91| 国产一区啦啦啦在线观看| 亚洲成人在线| 欧美精品一区二| 亚洲小说春色综合另类电影| zzijzzij亚洲日本少妇熟睡| 久久本道综合色狠狠五月| 久久久精品日韩欧美| 久久成人18免费观看| 午夜亚洲性色福利视频| 久久久不卡影院| 岛国精品一区二区| 欧美色爱综合网| 偷偷要91色婷婷| 国产精品亚洲综合色区韩国| 国产精品久久午夜夜伦鲁鲁| eeuss鲁一区二区三区| 91精品国产一区二区三区蜜臀| 日韩av一区二区三区四区| 亚洲承认在线| 亚洲国产精华液网站w| 成人av高清在线| 色哟哟国产精品| 亚洲成av人片在线观看| 99精品国产在热久久婷婷| 国产欧美日韩在线看| 91视视频在线观看入口直接观看www | 欧美亚一区二区| 性做久久久久久久免费看| 欧美三级乱码| 中文一区在线播放| 欧美精品不卡| 国产午夜精品美女毛片视频| 岛国精品在线观看| 欧美一三区三区四区免费在线看| 日本成人中文字幕| 久久久精品性| 日韩国产欧美一区二区三区| 久久精品卡一| 裸体一区二区三区| 欧美性色aⅴ视频一区日韩精品| 亚洲成人av一区二区| 亚洲一区观看| 日韩成人一区二区| 久久久久综合一区二区三区| 日本在线不卡一区| 欧美精品电影在线播放| 国产不卡在线一区| 久久香蕉国产线看观看99| 成人精品国产福利| 日本一区二区成人在线| 精品不卡一区二区三区| 亚洲精品综合在线| 国产偷久久久精品专区| 一区二区三区免费看视频| 久久国产88| 精品在线观看视频| 26uuu精品一区二区| 欧美日韩一区二区国产| 亚洲一区二区三区四区不卡| 欧美午夜寂寞影院| 你懂的国产精品永久在线| 亚洲综合色视频| 在线不卡a资源高清| 国产伊人精品| 日本视频一区二区三区| 欧美成人欧美edvon| 亚洲激情二区| 蜜桃久久久久久| 26uuu亚洲综合色欧美 | 国产女人18水真多18精品一级做| 99精品视频免费观看视频| 奇米影视一区二区三区| 久久伊99综合婷婷久久伊| 亚洲综合国产| 成人毛片视频在线观看| 一区二区欧美国产| 91麻豆精品国产| 亚洲国产午夜| 国产一区二区三区观看| 亚洲欧美日韩系列| 欧美色网一区二区| 欧美网站在线| 国模娜娜一区二区三区| 亚洲国产高清aⅴ视频| 久久综合久久久| 91美女片黄在线观看| 亚洲一级片在线观看| 欧美成人精品3d动漫h| 亚洲精品美女91| 成人国产亚洲欧美成人综合网| 一区免费观看视频| 亚洲乱码中文字幕综合| 午夜精品久久| 日韩一区二区在线免费观看| 国产欧美在线| 国产精品一区二区久激情瑜伽 |