在這之前隻知道css權重的皮毛,比如說:行内權重比頭部權重高,頭部比外部樣式權重高…………工作中才知道真正了解css權重重要性。了解權重了才能寫出來最優css選擇器來。對後面學習less,scss有很大幫助。
從css代碼存放的位置來看,權重計算當然是--->内嵌樣式 > 内部樣式表 > 外聯樣式表!然而工作中我們的css代碼都是寫在外聯樣式表中的咯。
參考w3c樣式選擇器權重優先級是這個樣子的
important > 内嵌樣式 > ID > 類 > 标簽 | 僞類 | 屬性選擇 > 僞對象 > 繼承 > 通配符
有一種計算權重方法當然是不是官方有待考究
important 1 0 0 0
id 0 1 0 0
class 0 0 1 0
tag(标簽) 0 0 0 1
僞類 0 0 1 0
att屬性 0 0 1 0
僞對象 0 0 0 1
通配符 0 0 0 0
一般而言,選擇器越特殊,它的優先級越高。也就是選擇器指向的越準确,它的優先級就越高。通常我們用1表示标簽名選擇器的優先級,用10表示類選擇 器的優先級,用100标示ID選擇器的優先級。比如 .polaris span {color:red;}的選擇器優先級是 10 + 1 也就是11;而 .polaris 的優先級是10;
div.test1 .span var 優先級 1+10 +10 +1
span#xxx .songs li 優先級1+100 + 10 + 1
#xxx li 優先級 100 +1
對于什麼情況下使用什麼選擇器,用不同選擇器的原則是:第一:準确的選到要控制的标簽;第二:使用最合理優先級的選擇器;第三:HTML和CSS代碼盡量簡潔美觀。
選擇器種類
嚴格意義上說CSS的選擇器分類隻能分成三種,标簽名、類選擇器、ID選擇器。當然這也是設計之初就這麼設計的。後面的選擇器都是由于特殊需求添加的,當初我學習的時候就這些選擇器也是夠用的了!
标簽選擇器:p{}
類選擇 : .container{}
ID : 選擇器 #logo{}
當然了ID選擇器在一個頁面裡面你隻能有一個,多個的話當然不會報錯,畢竟CSS不是程式設計語言嘛!但是背景開發人員經常使用ID,如果不幸他命名規則和你定義一樣的,那這個錯誤就不好找出來了。
擴充選擇器:
後代選擇器:p span a{}; 後代選擇就是在上一個選擇器的後面加一個空格接着寫選擇器。這麼寫比對到的标簽就更少了。當然權重就會更高了!
群組選擇器 : p,div,img{};群組選擇器是當多個标簽都需要同樣的樣式的時候,用一個逗号分隔開多個選擇器。這樣寫法會節省很多代碼量
下面介紹一下css2,css3中的選擇器
CSS1&2中的選擇器介紹
CSS3 新增選擇器介紹
CSS3屬性選擇器
CSS3結構僞類選擇器
CSS3UI元素狀态僞類選擇器
CSS3其他新增選擇器
CSS1&2元素選擇器
元素選擇器
* 通用選擇器
E 元素選擇器
E#Id id選擇器
E.class 類選擇器
關系選擇器
E F 包含選擇器 E元素包含的F元素。
E>F 子選擇器 選擇E元素的子元素F
E+F 相鄰選擇器 E元素之後F元素
僞類選擇器
E:link 連結僞類 未被通路前樣式
E:visited 以被通路過的樣式
E:hover 滑鼠懸停時的樣式
E:active 滑鼠點選與釋放之間
E:focus 元素成為輸入焦點
E:lang 比對使用特殊語言的E元素
屬性選擇器
E[att] 選擇具有att屬性的E元素
E[att="val"] 選擇具有att屬性且屬性值為val的E元素
E[att~="val"] 選擇具有att屬性且屬性值為用空格分隔的字詞清單,其中一個等于val的E元素
E[att|="val"] 具有att屬性且元素值為以val開頭并用連接配接符-分隔的字元串的E元素
僞對象選擇器
E:first-letter 設定對象内的第一個字元的樣式。
E:first-line設定對象内的第一行的樣式
E:before設定在對象前發生的内容,用來和content屬性一起使用
E:after設定在對象後發生的内容,用來和content屬性一起使用。
CSS3新增選擇器 4個
E F 包含選擇器
E>F 子選擇器
E+F相鄰選擇器
E~F兄弟選擇符
P~P{color:#f00} 選擇的是第一個P後面的P元素。(隻能選擇它後面的兄弟)
結構僞類選擇器
E:root E在文檔的根元素
E:first-child父元素的第一個子元素E
E:last-child父元素的最後一個子元素E
E:only-child父元素僅有的一個子元素E
E:nth-child(n)父元素的第n個子元素E
E:nth-last-child(n)父倒數第n個子元
E:first-of-type同類型中的第一個同級兄弟元素E
E:last-of-type同類型中最後一個同級兄弟元素E.
E:only-of-type同類型中唯一的一個同級兄弟元素E
E:nth-of-type(n)同類型中第n個同級兄弟元素E.
E:nth-last-of-type(n)比對同類中倒數第n個同級兄弟元素E
E:empty沒有任何子元素包括text節點的元素E.
P:first-child{}解讀,先找到P元素,再找他的父節點,從父節點去找第一個元素為P的節點。
P:last-child{}和p:first-child{}差不多
li:nth-child(2){}選中指定序号。找li父元素ul,找到ul的第二個子元素是否是li,是就選中。
li:nth-child(even){}/*even選中偶數,odd選中奇數*/
li:nth-child(3n+1){}/*自定義序列類型(正序)*/
li:nth-last-child(){}/*是nth-child()的倒序*/
P:first-of-type{}找到第一個是P标簽的元素。
上面的标簽可分為 child系類和of-type系列
E:root{}用法隻有一個,
html:root{},其他标簽都沒有用。這個選擇器我隻在bootstrap中見過!可能它真的有用吧
簡潔、高效的CSS
所謂高效的CSS就是讓浏覽器在查找style比對的元素的時候盡量進行少的查找,下面列出一些我們常見的寫CSS犯一些低效錯誤:
◆不要在ID選擇器前使用标簽名
一般寫法:DIV#divBox
更好寫法:#divBox
解釋: 因為ID選擇器是唯一的,加上div反而增加不必要的比對。
◆不要再class選擇器前使用标簽名
一般寫法:span.red
更好寫法:.red
解釋:同第一條,但如果你定義了多個.red,而且在不同的元素下是樣式不一樣,則不能去掉,比如你css檔案中定義如下:
p.red{color:red;}
span.red{color:#ff00ff}
如果是這樣定義的就不要去掉,去掉後就會混淆,不過建議最好不要這樣寫
◆盡量少使用層級關系
一般寫法:#divBox p .red{color:red;}
更好寫法:.red{..}
◆使用class代替層級關系
一般寫法:#divBox ul li a{display:block;}
更好寫法:.block{display:block;}