摘要:假如有個(gè)不在中的,就有次的分支遍歷,而符合條件的只有個(gè),會損失很多性能。提案大部分書寫習(xí)慣是不想每個(gè)標(biāo)簽都加,可以用不同標(biāo)簽選擇出來的。所以提案如下假設(shè)最后一個(gè)元素是標(biāo)簽,而父元素有或選擇器時(shí),則選擇器解析從左往右的,其他情況還是從右往左。
現(xiàn)狀
現(xiàn)在瀏覽器css匹配核心算法的規(guī)則都是是以 right-to-left 方式匹配節(jié)點(diǎn)的。
如.root .sub span {...},瀏覽器渲染方式是 span -> .sub -> .root
它的讀取順序變成:先找到所有的span,沿著span的父元素查找.sub,再找.root,中途找到了符合匹配規(guī)則的節(jié)點(diǎn)就加入結(jié)果集;如果直到根元素html都沒有匹配,則不再遍歷這條路徑,從下一個(gè)span開始重復(fù)這個(gè)過程。
如果整個(gè)html只有一個(gè)span標(biāo)簽,那 right-to-left 方式的確是最快的,但是往往大部分網(wǎng)頁都不只一個(gè)span標(biāo)簽,多個(gè)span標(biāo)簽將會有很多無效的匹配,那這時(shí)是不是 left-to-right 會更好一點(diǎn)。
案例:
1234
.root .sub span {}
right-to-left 解析
先找到所有的最右節(jié)點(diǎn) span,有4個(gè),對于每一個(gè) span,向上尋找節(jié)點(diǎn)發(fā)現(xiàn)不是.sub,在查找上上節(jié)點(diǎn),直到找到html,發(fā)現(xiàn)沒有符合的。再從下一個(gè)span開始重復(fù)這個(gè)過程。
上面情況有4個(gè)span至少有4個(gè)分支的往上遍歷。假如有 1000 個(gè) 不在.sub中的span,就有 1000 次的分支遍歷,而符合條件的只有1個(gè),會損失很多性能。
left-to-right 解析
從 .root 開始,遍歷所有子節(jié)點(diǎn),如果沒有找到.sub,回溯到上個(gè)節(jié)點(diǎn)接著遍歷,直到找到.sub,再遍歷.sub下的子節(jié)點(diǎn)找到span結(jié)束。
上面情況1次就能找到符合條件的span。
上面案例明顯 left-to-right 比 right-to-left 解析效率更高。
當(dāng)然也有情況是,如果.root下面有很多復(fù)雜子節(jié)點(diǎn),需要遍歷與回溯很多次,而.root外的span不多,則 right-to-left 解析效率更高。
提案大部分書寫習(xí)慣是不想每個(gè)html標(biāo)簽都加class name,可以用不同html標(biāo)簽選擇出來的。如下所示:
1...2 3
#sub span{} #sub label{} #sub>div{}
先找到#sub再找html標(biāo)簽的話,css解析效率會高些。
那么 left-to-right 比 right-to-left 解析效率高。
所以提案如下:
假設(shè)最后一個(gè)css元素是html標(biāo)簽,而父元素有ID或Class選擇器時(shí),則選擇器解析從左往右的,其他情況還是從右往左。
Ps:這里本妹子的一個(gè)想法,歡迎各位小伙伴們一起討論,如果大部分都覺得有道理的話,我想試著向w3c組織提出建議需求。其他鏈接
原文地址:https://raoenhui.github.io/css/2019/03/30/left-to-right
Happy coding .. :)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/116048.html
摘要:對應(yīng)多種語法規(guī)則可以為指定樣式。渲染頁面繪制到屏幕后,頁面結(jié)構(gòu)的改變也有可能導(dǎo)致渲染樹重新計(jì)算,其中重排和重繪是最耗時(shí)的部分。 寫了這么多class,color,background,display...; 也許有時(shí)候會疑惑,怎么就顯示在頁面上,改變元素的樣式。 本文簡明介紹整個(gè)解析,匹配,渲染過程 css 描述 css 是Cascading Style Sheets的簡寫,是一種樣式...
摘要:在中,使用標(biāo)準(zhǔn)盒模型描述這些矩形盒子中的每一個(gè)。這種合并外邊距的方式被稱為折疊,并且因而所結(jié)合成的外邊距稱為折疊外邊距。最常見的有簡稱和簡稱。其中列是真正顯示文檔內(nèi)容的元素。同時(shí)其還支持列的偏移,即可以不從第一列開始,將某幾列作為空隙。 恩,小菜鳥又來了,上篇文章在這,話不多說,這次羅列總結(jié)一下css基礎(chǔ)知識,和我一樣的菜鳥可以看看。 引入方式 css的引入方式主要有以下幾種: 外...
摘要:默認(rèn)值,沒有定位,元素出現(xiàn)在正常的文檔流中。生成粘性定位的元素,容器的位置根據(jù)正常文檔流計(jì)算得出。和屬性的異同共同點(diǎn)對內(nèi)聯(lián)元素設(shè)置和屬性,可以讓元素脫離文檔流,并且可以設(shè)置其寬高。 position的值, relative和absolute分別是相對于誰進(jìn)行定位的? 、relative:相對定位,相對于自己本身在正常文檔流中的位置進(jìn)行定位。、absolute:生成絕對定位,相對于最近一...
摘要:已存在節(jié)點(diǎn)是移動,新節(jié)點(diǎn)是新增。鏈?zhǔn)讲僮鲗ο鬄椤⑺麄兊母腹?jié)點(diǎn)移除。從中刪除所有匹配的元素。一個(gè)布爾值或者指示事件處理函數(shù)是否會被復(fù)制。以上版本默認(rèn)值是一個(gè)布爾值,指示是否對事件處理程序和克隆的元素的所有子元素的數(shù)據(jù)應(yīng)該被復(fù)制。 前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門技術(shù)就算入門,但也僅僅是入門,現(xiàn)在前端開發(fā)的定義已經(jīng)遠(yuǎn)遠(yuǎn)不止這些。前端小課堂(HTML/...
摘要:已存在節(jié)點(diǎn)是移動,新節(jié)點(diǎn)是新增。鏈?zhǔn)讲僮鲗ο鬄椤⑺麄兊母腹?jié)點(diǎn)移除。從中刪除所有匹配的元素。一個(gè)布爾值或者指示事件處理函數(shù)是否會被復(fù)制。以上版本默認(rèn)值是一個(gè)布爾值,指示是否對事件處理程序和克隆的元素的所有子元素的數(shù)據(jù)應(yīng)該被復(fù)制。 前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門技術(shù)就算入門,但也僅僅是入門,現(xiàn)在前端開發(fā)的定義已經(jīng)遠(yuǎn)遠(yuǎn)不止這些。前端小課堂(HTML/...
閱讀 1748·2023-04-25 16:28
閱讀 684·2021-11-23 09:51
閱讀 1467·2019-08-30 15:54
閱讀 1149·2019-08-30 15:53
閱讀 2816·2019-08-30 15:53
閱讀 3413·2019-08-30 15:43
閱讀 3250·2019-08-30 11:18
閱讀 3261·2019-08-26 10:25