电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

css進階學習 選擇符

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

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

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

關(guān)鍵選擇符與瀏覽器的樣式規(guī)則匹配原理

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

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

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.

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

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

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

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

更具體的關(guān)鍵選擇符

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

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

.content .note span{}

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

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

.note_text{}

使用class選擇符

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

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

縮短選擇符序列

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

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

.header ul li .nav_link{}

建議寫為:

.header .nav_link{}

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

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

避免鏈式選擇符

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

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

a#author{}

建議寫為:

#author{}

這里的a是不必要的。一個ID只對應(yīng)一個元素,沒有必要再強調(diào)這個元素的標簽是什么(同理,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的元素,才應(yīng)用樣式。但IE6只認最后一個,也就是符合.class3這個選擇符的元素,就應(yīng)用樣式。

例外情況

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

結(jié)語

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

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

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

標簽: CSS HTML
相關(guān)文章:
主站蜘蛛池模板: 淋巴细胞分离液_口腔医疗器材-精欣华医疗器械(无锡)有限公司 | 软文发布-新闻发布推广平台-代写文章-网络广告营销-自助发稿公司媒介星 | AGV叉车|无人叉车|AGV智能叉车|AGV搬运车-江西丹巴赫机器人股份有限公司 | 空气能采暖,热泵烘干机,空气源热水机组|设备|厂家,东莞高温热泵_正旭新能源 | 多功能干燥机,过滤洗涤干燥三合一设备-无锡市张华医药设备有限公司 | 京马网,京马建站,网站定制,营销型网站建设,东莞建站,东莞网站建设-首页-京马网 | 昊宇水工|河北昊宇水工机械工程有限公司 | 万濠影像仪(万濠投影仪)百科-苏州林泽仪器 | 逗网红-抖音网红-快手网红-各大平台网红物品导航 | 利浦顿蒸汽发生器厂家-电蒸汽发生器/燃气蒸汽发生器_湖北利浦顿热能科技有限公司官网 | 大白菜官网,大白菜winpe,大白菜U盘装系统, u盘启动盘制作工具 | 无痕胶_可移胶_无痕双面胶带_可移无痕胶厂家-东莞凯峰 | 柔性输送线|柔性链板|齿形链-上海赫勒输送设备有限公司首页[输送机] | 电表箱-浙江迈峰电力设备有限公司-电表箱专业制造商 | 合肥通道闸-安徽车牌识别-人脸识别系统厂家-安徽熵控智能技术有限公司 | 防火卷帘门价格-聊城一维工贸特级防火卷帘门厂家▲ | 加气混凝土砌块设备,轻质砖设备,蒸养砖设备,新型墙体设备-河南省杜甫机械制造有限公司 | 注塑模具_塑料模具_塑胶模具_范仕达【官网】_东莞模具设计与制造加工厂家 | 安徽集装箱厂-合肥国彩钢结构板房工程有限公司 | 招商帮-一站式网络营销服务|互联网整合营销|网络推广代运营|信息流推广|招商帮企业招商好帮手|搜索营销推广|短视视频营销推广 | 电子巡更系统-巡检管理系统-智能巡检【金万码】 | 沈阳网站建设_沈阳网站制作_沈阳网页设计-做网站就找示剑新零售 沈阳缠绕膜价格_沈阳拉伸膜厂家_沈阳缠绕膜厂家直销 | 过滤器_自清洗过滤器_气体过滤器_苏州华凯过滤技术有限公司 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 物流公司电话|附近物流公司电话上门取货| 不锈钢闸阀_球阀_蝶阀_止回阀_调节阀_截止阀-可拉伐阀门(上海)有限公司 | 工业CT-无锡璟能智能仪器有限公司 | 浙江美尔凯特智能厨卫股份有限公司| 电梯装饰-北京万达中意电梯装饰有限公司 | 振动时效_振动时效仪_超声波冲击设备-济南驰奥机电设备有限公司 北京宣传片拍摄_产品宣传片拍摄_宣传片制作公司-现像传媒 | 电子天平-华志电子天平厂家 | 神超官网_焊接圆锯片_高速钢锯片_硬质合金锯片_浙江神超锯业制造有限公司 | 皮带输送机-大倾角皮带输送机-皮带输送机厂家-河南坤威机械 | 紫外线老化试验箱_uv紫外线老化试验箱价格|型号|厂家-正航仪器设备 | 数码听觉统合训练系统-儿童感觉-早期言语评估与训练系统-北京鑫泰盛世科技发展有限公司 | 盘装氧量分析仪-防爆壁挂氧化锆分析仪-安徽吉帆仪表有限公司 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 电液推杆生产厂家|电动推杆|液压推杆-扬州唯升机械有限公司 | 河南砖机首页-全自动液压免烧砖机,小型砌块水泥砖机厂家[十年老厂] | 盘扣式脚手架-附着式升降脚手架-移动脚手架,专ye承包服务商 - 苏州安踏脚手架工程有限公司 | hc22_hc22价格_hc22哈氏合金—东锜特殊钢 |