<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      深入理解css優先級

      為什么要寫這篇文章是因為

      <style type="text/css">
      body h1 {
        color: green;
      }
      html h1 {
        color: purple;
      }
      </style><body>
         <h1>Here is a title!</h1>
      </body>

      上面代碼執行結果是這樣的。按照我的理解,body在DOM中比html近,應該會按body h1中定義的綠色來顯示文字,但是恰恰相反,文字顏色是紫色的。

      原因現在我當然是知道的,因為css中優先級無視DOM樹中節點的距離遠近,就是說DOM樹中的距離不會對元素優先級計算產生影響。如果優先級相同,靠后的 CSS 會應用到元素上。而html h1靠后,當然是紫色了,如果調換html h1body h1順序那就是綠色了。

      以上我剛開始犯的錯誤,其實是被繼承樣式給唬住了,但是繼承的樣式是低于設定的樣式的。如果只是繼承,那離的近的當然優先級高,比如舉個例子:

      <style type="text/css">
      #close{
          color: green;
      }
      #further{
          color: purple;
      }
      </style><body>
      <div id="further">
      <div id="close">
         <h1>Here is a title!</h1>
      </div>
      </div>
      </body>

      不管#close和#further順序,文字都是綠色的。

      接下來就系統的看看css優先級。

      一、優先級

      瀏覽器根據優先級來決定給元素應用哪個樣式,而優先級僅由選擇器的匹配規則來決定。

      內聯》ID選擇器》偽類=屬性選擇器=類選擇器》元素選擇器【p】》通用選擇器(*)》繼承的樣式

      二、優先級計算:

      上面說了,優先級僅有選擇器決定,怎么個計算方法呢?

      a、用a表示選擇器中ID選擇器出現的次數

      b、用b表示類選擇器屬性選擇器偽類選擇器出現的總次數。

      c、用c表示標簽選擇器偽元素選擇器出現的總次數

      d、忽略通用選擇器

      e、然后計算a*100+b*10+c的大小,這就是優先級了。

      權重:內聯樣式1000》id選擇器100》class選擇器10》標簽選擇器1

      Note:

      ID選擇器「如:#header」,Class選擇器「如:.foo」,屬性選擇器「如:[class]」,偽類「如::link」,標簽選擇器「如:h1」,偽元素「如::after」,選擇器「*」

      接下來從以下幾點深入分析優先級。

      1、優先級計算無視DOM樹中的距離

      開頭說明的例子:

      <!DOCTYPE html>
      <html>
      <style type="text/css">
      body h1 {
        color: green;
      }
      html h1 {
        color: purple;
      }
      </style>
      </head>
      <body>
      <h1>Here is a title!</h1>
      </html>
      View Code

      body h1和html h1的優先級相同。

      2、偽類選擇器,屬性選擇器和class選擇器的優先級一樣【update20170422】

      偽類=屬性選擇器=類選擇器

      所以后面的會覆蓋前面的。

      <!DOCTYPE html>
      <html>
      <meta charset="utf-8">
      <style type="text/css">
          :focus {
              color: red;
          }
          [class] {
              color: blue;
          }
          .classtest {
              color: green;
          }
      </style>
      </head>
      <body>
      <div class="classtest">
          什么顏色文字
      </div>
      </body>
      </html>
      View Code

      如下圖類選擇器在后,所以覆蓋前面的樣式,所以文字綠色。

      如下圖屬性選擇器在后,會覆蓋前面的類選擇器樣式,所以文本藍色。

      focus同理,只有放后面才生效,否則會被偽類和屬性選擇器覆蓋

      3、基于類型的優先級

      優先級是根據選擇器的類型進行計算的。

      舉例:屬性選擇器盡管選擇了一個ID但是在優先級計算中還是根據類型計算,因此即使選擇的是相同的元素,但ID選擇器有更高的優先級,所以* #foo設置的樣式生效。

      <!DOCTYPE html>
      <html>
      <style type="text/css">
      * #foo {
        color: green;
      }
      *[id="foo"] {
        color: purple;
      }
      </style>
      </head>
      <body>
      <p id="foo">I am a sample text.</p>
      </body>
      </html>
      View Code

      4、:not偽類不參與優先級計

      【:not】否定偽類在優先級計算中不會被看做是偽類,但是,會把:not里面的選擇器當普通選擇器計數。這句話有點不好理解,其實就是忽略掉:not,其他偽類(如:hover)參與CSS優先級的計算,但是「:not」不參與計算。

      舉個例子:

      <!DOCTYPE html>
      <html>
      <style type="text/css">
      div.outer p {
        color:red;
      }
      div:not(.outer) p {
        color: blue;
      }
      </style>
      </head>
      <body>
      <div class="outer">
        <p>This is in the outer div.</p>
        <div class="inner">
          <p>This text is in the inner div.</p>
        </div>
      </div>
      </body>
      </html>
      View Code

      該例子中,選擇器div.outer p 和選擇器div:not(.outer) p的優先級是相同的,:not被忽略掉了,:not(.outer)中的.outer正常計數。

      如果調換位置,inner元素會變成紅色

          div:not(.outer) p {
              color: blue;
          }
          div.outer p {
              color:red;
          }

      5、優先級計算不升位

      不要把權重簡單的作為10進制數字比較其大小。

      a=1的規則優先級將永遠高于其他a=0的。

      比如一個選擇器的a>0,b=0即使另外一個選擇器的a=0,b=12,c=12那么前者的權重依然更大!!

      為證明我做了一個不現實的demo

      <!DOCTYPE html>
      <html>
      <meta charset="utf-8">
      <style type="text/css">
      
      #test{ /*a=1*/
          color: blue
      }
      div.classtest div.classtest div.classtest div.classtest div.classtest div.classtest div.classtest div.classtest div.classtest div.classtest div.classtest div.classtest{ /*b=12*/
      color:green;
      }
      
      </style>
      </head>
      <body>
      <div  class="classtest">
      <div class="classtest">
      <div class="classtest">
      <div class="classtest">
      <div class="classtest">
      <div class="classtest">
      <div class="classtest">
      <div class="classtest">
      <div class="classtest">
      <div class="classtest">
      <div class="classtest">
      <div id="test" class="classtest">
      什么顏色文章
      </div>
      </div>
      </div>
      </div>
      </div>
      </div>
      </div>
      </div>
      </div>
      </div>
      </div>
      </div>
      </body>
      </html>
      View Code

      可見文本顏色還是藍色!!

      同樣有一個帶有10個id選擇器的規則,優先級也不如內聯樣式。

      總之優先級的計算不是基于十進制升位的,后面的數優先級再高也不能升到前一位。

      6、其他

      下面再給出一個經典的例子,自己計算一下就明白了。

      Examples:
      
      *               /* a=0 b=0 c=0 -> specificity =   0 */
      LI              /* a=0 b=0 c=1 -> specificity =   1 */
      UL LI           /* a=0 b=0 c=2 -> specificity =   2 */
      UL OL+LI        /* a=0 b=0 c=3 -> specificity =   3 */
      H1 + *[REL=up]  /* a=0 b=1 c=1 -> specificity =  11 */
      UL OL LI.red    /* a=0 b=1 c=3 -> specificity =  13 */
      LI.red.level    /* a=0 b=2 c=1 -> specificity =  21 */
      #x34y           /* a=1 b=0 c=0 -> specificity = 100 */
      #s12:not(FOO)   /* a=1 b=0 c=1 -> specificity = 101 */

      如果確實有棘手的情況,可以在Firebug中查看優先級。Firebug中按照優先級排序顯示規則,將優先級更高的規則顯示在最上面,并將被覆蓋的規則用刪除線劃掉。

      三、!import

      為什么沒有把!import放在優先級順序中,因為官方認為!import和優先級沒一點關系。

      不建議使用!import

      • Never 絕不要在全站使用!import。
      • Only 只在需要覆蓋全站或外部 css(例如引用的 ExtJs 或者 YUI )的特定頁面中使用   !important
      • Never 永遠不要在你的插件中使用 !important
      • Always 要優先考慮使用樣式規則的優先級來解決問題而不是 !important

      選擇元素時盡量不要多選,不要放寬選擇器的范圍。因為范圍越小,越具有針對性,優先級越高。

      1、什么場合使用!import?

      使用!import的場合也是有的,但是是在沒有別的解決方案的時候。

      比如需要覆蓋內聯樣式,因為內聯樣式的優先級最高,只能用!import去覆蓋內聯樣式。

      還有一種情況

      <style type="text/css">
      #someElement p {
          color: blue;
      }
      
      p.awesome {
          color: red;
      }
      </style>
      </head>
      <body>
      <div id="someElement">
      <p class="awesome">some text</p>
      </div>
      </body>

      在外層有 #someElement 的情況下,你怎樣能使 awesome 的段落變成紅色呢?這種情況下,如果不使用 !important ,第一條規則永遠比第二條的優先級更高。這也是沒有別的辦法,如果用內聯結果只會更糟糕。

      2、怎樣覆蓋已有!import規則

      a、再加一條!import的css語句,將其應用到更高優先級的選擇器(在原有基礎上添加額外的標簽、類或者ID選擇器)。

      幾個更高優先級選擇器的例子:

      table td    {height: 50px !important;}
      .myTable td {height: 50px !important;}
      #myTable td {height: 50px !important;}

      b、選擇器一樣,但添加的位置在原有聲明后面。因為相同優先級,后邊定義的聲明覆蓋前面的。

      相同選擇器的例子:

      td {height: 30px !important;}
      td {height: 50px !important;}

      四、資源鏈接

      http://www.w3.org/TR/selectors/#specificity
      https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity

      posted @ 2015-04-07 09:28  starof  閱讀(28762)  評論(2)    收藏  舉報
      主站蜘蛛池模板: 国产精品午夜福利免费看| 亚洲成人av在线系列| 中文字幕乱码在线播放| 黄色三级亚洲男人的天堂| 国产99视频精品免费视频6| 亚洲中文字幕日产无码成人片| 国产成人综合色视频精品| 色偷偷成人综合亚洲精品| 日韩人妻无码一区二区三区99| 国产中文字幕在线一区| 日本三级香港三级三级人妇久| 精品人妻伦一二二区久久| 人妻18毛片A级毛片免费看| 色九月亚洲综合网| 精品亚洲精品日韩精品| 人妻少妇偷人精品一区| 又爽又黄又无遮挡的视频| 蜜桃臀av一区二区三区| 亚洲第一香蕉视频啪啪爽| 亚洲18禁一区二区三区| 麻豆一区二区中文字幕| 国产一区二区三区亚洲精品| 免费黄色大全一区二区三区| 蜜芽久久人人超碰爱香蕉 | 97无码人妻福利免费公开在线视频| 日韩亚洲国产激情一区二区| 国内精品一区二区不卡| 欧美影院成年免费版| 亚洲性日韩精品一区二区三区| 自拍偷自拍亚洲精品情侣| 午夜精品区| 国产精品一亚洲av日韩| 九九热免费精品视频在线| 欧美猛少妇色xxxxx| 国产女人叫床高潮大片| 福利一区二区在线播放| 上司人妻互换中文字幕| 国产成人精品一区二三区| 无码国内精品久久人妻蜜桃| 久久中文字幕无码专区| 精品精品国产自在97香蕉|