posts - 36, comments - 419, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理


          DIV#divBox p span.red{color:red;},按習(xí)慣我們對(duì)這個(gè)CSS 的理解是,瀏覽器先查找id為divBox的DIV元素,當(dāng)找到后,再找其下的所有p元素,
          然后再查找所有span元素,當(dāng)發(fā)現(xiàn)有span的class為red的時(shí)候,就應(yīng)用該style。多么簡單易懂的原理,可是這個(gè)理解卻是完完全全相反、錯(cuò)誤的。

          用了這么多年的CSS,現(xiàn)在才明白CSS的真正匹配原理,不知道你是否也跟我一樣?看1個(gè)簡單的CSS:

          DIV#divBox p span.red{color:red;},按習(xí)慣我們對(duì)這個(gè)CSS 的理解是,瀏覽器先查找id為divBox的DIV元素,當(dāng)找到后,再找其下的所有p元素,然后再查找所有span元素,當(dāng)發(fā)現(xiàn)有span的class為red的時(shí)候,就應(yīng)用該style。多么簡單易懂的原理,可是這個(gè)理解卻是完完全全相反、錯(cuò)誤的。


          匹配原理:

               瀏覽器CSS匹配不是從左到右進(jìn)行查找,而是從右到左進(jìn)行查找。比如之前說的 DIV#divBox p span.red{color:red;},瀏覽器的查找順序如下:

          先查找html中所有class='red'的span元素,找到后,再查找其父輩元素中是否有p元素,再判斷p的父元素中是否有id為divBox的div元素,如果都存在則匹配上。

              瀏覽器從右到左進(jìn)行查找的好處是為了盡早過濾掉一些無關(guān)的樣式規(guī)則和元素。比如如下html和css:

          <style> 
             DIV#divBox p span.red
          {color:red;}
          <style>
          <body>
            <div id="divBox">
                <p><span>s1</span></p>
                <p><span>s2</span></p>
                <p><span>s3</span></p>
                <p><span class='red'>s4</span></p>
            </div>
          </body>
          如果按從左到右查找,哪會(huì)先查找到很多不相關(guān)的p和span元素。而如果按從左到右的方式進(jìn)行查找,則首先就查找到<span class='red'>的元素。firefox稱這種查找方式為key selector(關(guān)鍵字查詢),所謂的關(guān)鍵字就是樣式規(guī)則中最后(最右邊)的規(guī)則,上面的key就是span.red。

          簡潔、高效的CSS:
                所謂高效的CSS就是讓瀏覽器在查找style匹配的元素的時(shí)候盡量進(jìn)行少的查找,下面列出一些我們常見的寫CSS犯一些低效錯(cuò)誤(也是我以前常常犯的錯(cuò)誤,還老以為這樣寫才是高效的):
             
            1.不要在ID選擇器前使用標(biāo)簽名
           一般寫法:DIV#divBox
           更好寫法:#divBox
           解釋: 因?yàn)镮D選擇器是唯一的,加上div反而增加不必要的匹配。
            
            2.不要再class選擇器前使用標(biāo)簽名
           一般寫法:span.red
           更好寫法:.red
           解釋: 同第一條,但如果你定義了多個(gè).red,而且在不同的元素下是樣式不一樣,則不能去掉,比如你css文件中定義如下:
               p.red{color:red;}
               span.red{color:#ff00ff}
               如果是這樣定義的就不要去掉,去掉后就會(huì)混淆,不過建議最好不要這樣寫
            3.盡量少使用層級(jí)關(guān)系
           一般寫法:#divBox p .red{color:red;}      
           更好寫法:.red{..}
            
            4.使用class代替層級(jí)關(guān)系
           一般寫法:#divBox ul li a{display:block;}      
           更好寫法:.block{display:block;}




              有需要請(qǐng)查看:高性能WEB開發(fā)系列



          [作者]:BearRui(AK-47)
          [博客]: http://www.aygfsteel.com/bearrui/
          [聲明]:本博所有文章版權(quán)歸作者所有(除特殊說明以外),轉(zhuǎn)載請(qǐng)注明出處.
          英雄,別走啊,幫哥評(píng)論下:  

          精彩推薦 好文要頂 水平一般 看不懂 還需努力

          評(píng)論

          # re: 了解CSS的查找匹配原理,讓CSS更簡潔、高效  回復(fù)  更多評(píng)論   

          2010-06-08 08:43 by BeanSoft
          學(xué)習(xí) 收藏了

          # re: 了解CSS的查找匹配原理,讓CSS更簡潔、高效  回復(fù)  更多評(píng)論   

          2010-06-08 08:49 by BearRui(AK-47)
          @BeanSoft
          謝謝老大支持啊,^_^

          # re: 了解CSS的查找匹配原理,讓CSS更簡潔、高效  回復(fù)  更多評(píng)論   

          2010-06-08 16:57 by BearRui(AK-47)
          @愛之谷
          謝謝收藏

          # re: 了解CSS的查找匹配原理,讓CSS更簡潔、高效  回復(fù)  更多評(píng)論   

          2010-06-08 17:05 by 16樓
          實(shí)用,總結(jié)的不賴

          # re: 了解CSS的查找匹配原理,讓CSS更簡潔、高效  回復(fù)  更多評(píng)論   

          2010-06-08 17:07 by BearRui(AK-47)
          謝謝

          # re: 了解CSS的查找匹配原理,讓CSS更簡潔、高效  回復(fù)  更多評(píng)論   

          2010-06-09 16:48 by panasia
          很實(shí)用的例子。。學(xué)習(xí)了。。

          # re: 了解CSS的查找匹配原理,讓CSS更簡潔、高效  回復(fù)  更多評(píng)論   

          2010-06-12 17:58 by Aidan
          好文章,頂一下!

          # re: 了解CSS的查找匹配原理,讓CSS更簡潔、高效  回復(fù)  更多評(píng)論   

          2010-06-12 20:23 by BearRui(AK-47)
          謝謝樓上的支持

          # re: 了解CSS的查找匹配原理,讓CSS更簡潔、高效  回復(fù)  更多評(píng)論   

          2010-06-16 20:31 by 向東而立
          ( 不要再class選擇器前使用標(biāo)簽名
          一般寫法:span.red
          更好寫法:.red
          解釋: 同第一條....)
          要再class選擇器前使用標(biāo)簽名!
          class,表示一組(類)或一個(gè)具有同樣性質(zhì)的元素,它們可以共用樣式,并且在頁面中將會(huì)出現(xiàn)多次(如果他能唯一,那么要ID又是什么)
          所以CSS選擇器選擇class時(shí),沒有標(biāo)簽名,選擇將是所以的類的集合...

          # re: 了解CSS的查找匹配原理,讓CSS更簡潔、高效  回復(fù)  更多評(píng)論   

          2010-06-16 21:31 by BearRui(AK-47)
          @向東而立
          class當(dāng)然唯一是表示在產(chǎn)品中所有唯一,比如.red就表示所有的文字顏色為紅色,并不是跟id一樣的含義。

          # re: 了解CSS的查找匹配原理,讓CSS更簡潔、高效  回復(fù)  更多評(píng)論   

          2010-06-17 10:07 by tony徐
          簡單實(shí)用啊,現(xiàn)在才發(fā)現(xiàn)原來是倒著匹配的

          # re: 了解CSS的查找匹配原理,讓CSS更簡潔、高效[未登錄]  回復(fù)  更多評(píng)論   

          2010-06-20 19:42 by kkk
          的確,倒著查找是單鏈,順次查找是多鏈

          # re: 了解CSS的查找匹配原理,讓CSS更簡潔、高效  回復(fù)  更多評(píng)論   

          2010-09-23 18:14 by jsonz
          當(dāng)時(shí)我就精呆啦。

          # re: 了解CSS的查找匹配原理,讓CSS更簡潔、高效  回復(fù)  更多評(píng)論   

          2010-11-18 14:15 by Ace.lee
          4.使用class代替層級(jí)關(guān)系
          一般寫法:#divBox ul li a{display:block;}
          更好寫法:.block{display:block;}

          首先,這個(gè)原理。俺還真是現(xiàn)在才知道。大部分觀點(diǎn)表示贊同。
          前面3點(diǎn)總結(jié)來說,就是在能正確實(shí)現(xiàn)樣式的情況下,層級(jí)盡可能少。
          第4點(diǎn)有點(diǎn)疑問。雖然用class代替層級(jí)減少了匹配的時(shí)間,但是,class多用一個(gè)就多了一個(gè)額外的資源開銷,通常,提倡的是盡可能少用類和ID,從這個(gè)方面來說,是否是就是因?yàn)轭惡虸D的開銷超過了匹配所浪費(fèi)的資源??

          # re: 了解CSS的查找匹配原理,讓CSS更簡潔、高效  回復(fù)  更多評(píng)論   

          2010-12-17 13:55 by nicolas
          是的,一直以為也是從左至右的,直到有次面試,面試官問了我CSS的優(yōu)化,我才知道,原來一直習(xí)慣的span.classname{}反而比.classname{}的性能差,CSS的遍歷是從右向左的。支持!

          # re: 了解CSS的查找匹配原理,讓CSS更簡潔、高效  回復(fù)  更多評(píng)論   

          2011-05-16 00:06 by hax
          知其然不知其所以然。瀏覽器為什么要這樣匹配?不就是為了優(yōu)化CSS匹配的性能?而web開發(fā)者為啥要優(yōu)化css的寫法?這不是浪費(fèi)了瀏覽器實(shí)現(xiàn)者的苦心么?css selector你該怎么寫就應(yīng)該怎么寫。首先考慮的應(yīng)該是這條規(guī)則想要表達(dá)什么,而不是是否能快20ms(實(shí)際上在通常的case里根本快不了20ms)。

          # re: 了解CSS的查找匹配原理,讓CSS更簡潔、高效  回復(fù)  更多評(píng)論   

          2011-06-12 21:32 by 水煮丫軟件
          而如果按從左到右的方式進(jìn)行查找,則首先就查找到<span class='red'>的元素。

          樓主,上面這句話好像有點(diǎn)問題,應(yīng)該是而如果按從右到左的方式進(jìn)行查找

          # re: 了解CSS的查找匹配原理,讓CSS更簡潔、高效  回復(fù)  更多評(píng)論   

          2011-08-18 16:31 by wangjie
          老大不看你這篇文章我還以為我寫的css都是高效的呢

          # ID選擇器前究竟用不用用標(biāo)簽名?  回復(fù)  更多評(píng)論   

          2013-04-11 17:31 by 森-pirate
          我現(xiàn)在在做一個(gè)頁面,出現(xiàn)的問題就是如果id選擇器不設(shè)置標(biāo)簽div的話,選擇器內(nèi)所設(shè)置的效果就無效。
          div#llinks ul {
          list-style: none;
          padding: 0px;
          margin: 5px 5px 0px 25px;
          }
          div#llinks ul li {
          float: left; /* 顯示為同一行,如果不加div浮動(dòng)無效 */
          width: 80px; /* 指定每一項(xiàng)的寬度 */
          background: none;
          padding: 0px;
          border: none;
          }

          # re: 了解CSS的查找匹配原理,讓CSS更簡潔、高效  回復(fù)  更多評(píng)論   

          2013-06-07 16:52 by 漂流的兔子
          寫的很清楚 很受用 學(xué)習(xí)了
          主站蜘蛛池模板: 兴国县| 梅河口市| 姚安县| 阿鲁科尔沁旗| 江永县| 寻乌县| 葵青区| 沂水县| 文化| 手游| 海原县| 甘谷县| 盘锦市| 太和县| 青田县| 集安市| 金秀| 黑水县| 镇平县| 天长市| 丰原市| 武冈市| 铁岭县| 武定县| 博兴县| 连山| 佛山市| 新乐市| 富民县| 太原市| 文登市| 盘锦市| 桐柏县| 昌吉市| 额尔古纳市| 松溪县| 广丰县| 渝北区| 凤凰县| 凤山市| 工布江达县|