1. class 和 id 的使用場景:
- id:id選擇器,使用#name定義(name為id名,可任意取名),使用id="name"調用,其優先級高于類選擇器,一個標簽只能有一個id且每個id只能使用一次,多用于頁面分塊的塊級標簽上;
- class:類選擇器,使用.name定義(name為類名,可任意取名),使用class="name"調用,一個標簽可以有多個類且同一個類可以用到不同的標簽上,多用于多個標簽樣式相似或完全相同時。
2. CSS常見選擇器:
- 基礎選擇器
- * : 通用元素選擇器,匹配頁面任何元素(這也就決定了我們很少使用)
- #id : id選擇器,匹配特定id的元素
- .class: 類選擇器,匹配class包含(不是等于)特定類的元素
- element: 標簽選擇器
- 組合選擇器
- E,F 多元素選擇器,用,分隔,同時匹配元素E或元素F
- E F 后代選擇器,用空格分隔,匹配E元素所有的后代(不只是子元素、子元素向下遞歸)元素F
- E>F 子元素選擇器,用>分隔,匹配E元素的所有直接子元素
- E+F 直接相鄰選擇器,匹配E元素之后的相鄰的同級元素F
- E~F 普通相鄰選擇器(弟弟選擇器),匹配E元素之后的同級元素F(無論直接相鄰與否)
- .class1.class2 id和class選擇器和選擇器連寫的時候中間沒有分隔符,.和 # 本身充當分隔符的元素
- element#id id和class選擇器和選擇器連寫的時候中間沒有分隔符,.和 #本身充當分隔符的元素
- 屬性選擇器
- E[attr] 匹配所有具有屬性為attr的元素(div[id]能選擇所有具有id屬性的div)
- E[attr=value] 匹配所有屬性為value的元素(div[type=text]匹配id=text的div)
- E[attr~=value] 匹配所有屬性attr具有多個空格分隔,其中一個值等于value的元素
- E[attr ^=value] 匹配屬性attr的值以value開頭的元素
- E[attr $=value] 匹配屬性attr的值以value結尾的元素
- E[attr *=value] 匹配屬性attr的值包含value的元素
- *偽類選擇器
- E:first-child 匹配元素E的第一個子元素
- E:last-child 匹配元素e的最后一個子元素
- E:nth-child(n) 匹配其父元素的第n個子元素,第一個編號為1
- E:first-of-type 匹配父元素下使用同種標簽的第一個子元素,等同于nth-of-type(1)
- E:hover 匹配鼠標懸停的e元素
- E:focus 匹配獲得焦點的e元素
- 偽元素選擇器
- E::first-line 匹配E元素的第一行
- E::first-letter 匹配E元素的第一個字母
- E::before 在e元素之前插入生成的內容
- E::after 在e元素之后插入生成的內容
3. 選擇器的優先級及計算:
- 屬性后+!important:p {color:#ccc!important;}
- 內聯樣式:
- id選擇器: #id
- 類選擇器: .class
- 偽類選擇器:a:link
- 屬性選擇器:h1{}
- 標簽選擇器:p[XXX]
- 通用選擇器:*
- 瀏覽器自定義
復雜場景時,計算優先級時通過數標簽來計算,先數id,如果id相等再數類,如果id不相等,id多的選擇器權重高,權重越高,優先級越高。如果id選擇器數量相同,再數類選擇器,最后數標簽。
權重計算規則:
- 第一等:代表內聯樣式,如: style=" ",權值為1000。
- 第二等:代表ID選擇器,如:#content,權值為0100。
- 第三等:代表類,偽類和屬性選擇器,如.content,權值為0010。
- 第四等:代表類型選擇器和偽元素選擇器,如div p,權值為0001。
- 通配符、子選擇器、相鄰選擇器等的。如*、>、+,權值為0000。
- 繼承的樣式沒有權值。
!important 的作用是提升優先級,換句話說。加了這句的樣式的優先級是最高的(比內聯樣式的優先級還高)。
比較規則:
- 1,0,0,0 > 0,99,99,99。也就是說從左往右逐個等級比較,前一等級相等才往后比。
- 無論是行間、內部和外部樣式,都是按照這個規則來進行比較。而不是直觀的行間>內部>外部樣式;ID>class>元素。之所以有這樣的錯覺,是因為確實行間為第一等的權重,所以它的權重是最高的。而內部樣式可能一般寫在了外部樣式引用了之后,所以覆蓋掉了之前的。
- 在權重相同的情況下,后面的樣式會覆蓋掉前面的樣式。
- 通配符、子選擇器、相鄰選擇器等的。雖然權值為0000,但是也比繼承的樣式優先。
實例:
a{color: yellow;} /*特殊性值:0,0,0,1*/
div a{color: green;} /*特殊性值:0,0,0,2*/
.demo a{color: black;} /*特殊性值:0,0,1,1*/
.demo input[type="text"]{color: blue;} /*特殊性值:0,0,2,1*/
.demo *[type="text"]{color: grey;} /*特殊性值:0,0,2,0*/
#demo a{color: orange;} /*特殊性值:0,1,0,1*/
div#demo a{color: red;} /*特殊性值:0,1,0,2*/
<a href="">第一條應該是黃色</a> <!--適用第1行規則-->
<div class="demo">
<input type="text" value="第二條應該是藍色" /><!--適用第4、5行規則,第4行優先級高-->
<a href="">第三條應該是黑色</a><!--適用第2、3行規則,第3行優先級高-->
</div>
<div id="demo">
<a href="">第四條應該是紅色</a><!--適用第5、6行規則,第6行優先級高-->
</div>
4. a:link, a:hover, a:active, a:visited 意義及順序:
- a偽類解釋:
- link:設置a對象在未被訪問前的CSS樣式;
- visited:設置a對象在其鏈接地址已被訪問過時的CSS樣式;
- hover:設置對象在其鼠標懸停時的CSS樣式;
- active:設置對象在被用戶激活(在鼠標點擊與釋放之間發生的事件)時的CSS樣式;
- focus : 代表的是獲取焦點時的樣式,這個我們可以通過tab鍵來查看,一旦鏈接獲取了焦點,則它的樣式就是你設置的focus樣式。
-
順序:
a偽類的順序為:a:link > a:visited > a:focus >a:hover > a:active。
前四個的順序有個比較簡便的記憶方法:L-V-H-A,即love & hate。 - 原因:
- 鼠標經過的“未訪問鏈接”同時擁有a:link、a:hover兩種屬性,后面的屬性會覆蓋前面的屬性定義;
- 鼠標經過的“已訪問鏈接”同時擁有a:visited、a:hover兩種屬性,后面的屬性會覆蓋前面的屬性定義;
- a:active是鼠標點擊與釋放之間發生的事件,并擁有鼠標懸停a:hover屬性;
由于偽類的選擇器優先級一致,后面的a鏈接樣式會覆蓋前面的。
所以說,a:hover定義一定要放在a:link、a:visited的后面,才能在鼠標懸停時,a:hover樣式不被a:link和a:visited樣式覆蓋;
- a:visited一定要放在a:link的后面,因為這樣能保證訪問過的鏈接具有a:visited樣式,并能覆蓋a:link默認樣式;
- a:active一定要放在a:hover后面。假如a:active放在a:hover前面,由于a:active擁有鼠標懸停a:hover屬性,當鼠標按下時,首先會觸發a:hover事件,然后觸發
- a:active,但是a:ctive已被a:hover的樣式所覆蓋,因此無法看到a:active的樣式。所以,a:active一定要放在a:hover后面。
- 補充a:focus的順序:
- :hover 代表的是你光標經過某一元素時的樣式,如果將此樣式放在:focus之后,則當鏈接獲取焦點時,顯示:focus樣式,當光標經過此鏈接時,會顯示hover的樣式,因為hover排在后,會覆蓋focus樣式。
- 如果:hover排在前,:focus排在后,則當光標獲得焦點時顯示:focus的樣式,但當光標經過鏈接時,樣式并未顯示:hover的樣式,而是繼續是:focus的樣式,因為應用的focus樣式在hover之后,覆蓋了前面的樣式。
可用以下代碼進行具體演示
a:focus{
color:black;
text-decoration:underline;
}
a:hover{
color:#FF0000;
text-decoration:underline;
}
a:active{
color:#FFCC00;
}
綜上所述,a偽類的順序為:a:link > a:visited > a:focus > a:hover > a:active。
5. 選擇器舉例:
/*id選擇器,匹配id值為header的元素*/
#header{
}
/*class選擇器,匹配class值為header的所有元素*/
.header{
}
/*后代選擇器,匹配class值為header元素的所有class值為logo的后代*/
.header .logo{
}
/*匹配class值包含header和mobile的元素 */
.header.mobile{
}
/*匹配class值為header元素后代中的p和h3元素*/
.header p, .header h3{
}
/*匹配id值為header元素后代中class值為nav元素中的li元素*/
#header .nav>li{
}
/*為id值為header元素后代中的a元素指定鼠標移動到其上方的樣式 */
#header a:hover{
}
/*在id值為header的元素后代中尋找:class值為logo元素之后的同級p元素*/
#header .logo~p{
}
/*在id值為header的元素后代中尋找type屬性為”text"的input元素*/
#header input[type="text"]{
}
6. div:first-child和div:first-of-type的作用和區別
div:first-child 匹配的是 div 的父元素下第一個子元素,而 div:first-of-type
匹配的是父元素下同種元素類型的第一個子元素。例如:
<div class="father">
<h1 id="child1">AA</h1>
<h2 id="child2">BB</h1>
<h3 id="child3">CC</h1>
<h2 id="child4">DD</h1>
</div>
如果有選擇器如下:
#child2:first-child
,選中AA;
#child2:first-of-type
,選中BB;
#child4:first-child
,選中AA;
#child4:first-of-type
,選中BB。
實例如下:
<style>
.item1:first-child{
color: red;
}
.item1:first-of-type{
background: blue;
}
</style>
<div class="ct">
<p class="item1">aa</p>
<!-- 父元素div下第一個類為item1的子元素,父元素div下第一個類為item1的p標簽子元素,
因此滿足.item1:first-child和.item1:first-of-type-->
<h3 class="item1">bb</h3>
<!-- 父元素div下第一個類為item1的h3標簽子元素,滿足.item1:first-of-type-->
<h3 class="item1">ccc</h3>
</div>
輸出結果如下: