a:link/a:visited 為什麼優先順序比class高?
查看示例: http://jsbin.com/iRiFUbu/1/
在Chrome(30.0.1599.69),IE 10,Firefox 25.0上見到鏈接是紅色(a:link)而不是黃色(.test)想請問,為什麼?請問w3c標準是怎麼說明的?如果可能請列出w3c的標準說明網址。參考:Assigning property values, Cascading, and InheritanceSelectors Level 3
瀉藥。
規範中已經寫的很清楚:
- count the number of class selectors, attributes selectors, and pseudo-classes in the selector (= b)
計算選擇器裡面的class選擇器,屬性選擇器,偽類選擇器的個數(=b)
在 Selectors Level 3 規範中,一個選擇器的優先順序(權重)由依次串聯的a、b、c三個標記來計算,其中:- ID選擇器「如:#header」的個數(=a)
- Class選擇器「如:.foo」、屬性選擇器「如:[class]」、偽類「如::link」的個數(=b)
- 標籤選擇器「如:h1」、偽元素「如::after」的個數(=c)
- 忽略「*」選擇器
- 雖然偽類(如:hover)參與CSS優先順序的計算,但是「:not」不參與計算。
- HTML style 屬性內的優先順序在CSS2.1中有描述(實際在瀏覽器的實現中它不直接參与優先順序的計算)Assigning property values, Cascading, and Inheritance
只要一個選擇器的 a&>0,b=0,即使另外一個選擇的a=0, b=161,那麼前者的權重依然更大。
例1:a:link{
color: red; /* 優先順序:a=0,b=1,c=1 */
}
.test{
color: yellow; /* 優先順序:a=0,b=1,c=0 */
}
他們的權重(優先順序)b是相等的,但是c標記中,前者大於後者,所以最終「a:link」生效顯示為紅色。
例2:div[class].main a{
color:red; /* 優先順序:a=0,b=2,c=2 */
}
body div a[href]{
color:blue;/* 優先順序:a=0,b=1,c=3 */
}
由於屬性選擇器和class選擇器都計算在b標記中,所以前者b=2&>後者b=1,最終顯示為紅色。
切記,不要把權重簡單的作為10進位數字比較其大小。
練習題:擴展閱讀:請問以下代碼最終顯示為什麼顏色,優先順序分別是多少?
- KB005: CSS 層疊
- WebKit 與 Firefox 採用單一 int 值類型替代 CSS Selector"s Specificity 分段記值方式的潛在問題
- 有趣:256個class選擇器可以幹掉1個id選擇器 ? 張鑫旭
- 有趣的討論:http://weibo.com/1621464661/eAWpZnTpDWS?type=repost#_rnd1381321567348
- IE6-10,Firefox,Webkit 中,256個Class權重比ID高(Chrome 24修復)Demo:http://jsbin.com/UZiLela/3/edit ,http://jsbin.com/ixidec/1/editWebKit bug 已修復:CSSSelector.cpp in trunk/WebCore/cssOpera 採用16位存儲,所以超過65536個也會撐大。
- http://lists.w3.org/Archives/Public/www-style/2012Aug/0462.html
以上
一絲感謝邀請,對於這個研究不深,菜鳥的回答是這樣的:
:link / :visited 是一個偽類,偽類也算是一個「類」,那麼跟.test是同級了,再加上一個a元素,肯定會比.test這個類要高了。
那麼如果把a去掉,直接就是:link的話,因為.test是在:link後寫的,就覆蓋了紅色,變成黃色。:link{
color: red;
}
.test{
color: yellow;
}
你在demo中寫的是
a:link{
color: red;
}
.test{
color: yellow;
}
我想這個區別應該就有了。
或者我們可以這樣測試一下:.test{
color: yellow;
}
:link{
color: red;
}
看到的效果跟你寫的a:link是一樣的,因為:link覆蓋了.test的樣式。
不知道這個答案是否正確,如果正確的話,請支持哈。謝謝!HOHO~~~屬性選擇器,偽類選擇器和class類選擇器優先順序一樣
推薦閱讀:
※到底該不該用 CSS reset?
※line-height:normal是怎樣計算的?
※全局樣式加 float:left 導致 div{margin:0 auto;} 不起作用,為什麼?
※各大網站的 CSS 布局對行級元素是不是有些濫用?
※請問怎麼通俗的理解css中的行框和行內框?