class 和 id 的使用場景?
- class 和 id 有什么區(qū)別
- class是設置標簽的類, class屬性用于指定元素屬于何種樣式的類;
- id是設置標簽的標識。id屬性用于定義一個元素的獨特的樣式。
- class是一個樣式,先定義好, 然后可以套給多個結構/內容, 便于復用。也就是說class名稱可以相同。
- id是一個標簽,用于區(qū)分不同的結構和內容,就象你的名字, 如果一個屋子有2個人同名,就會出現(xiàn)混淆;id是先找到結構/內容,再給它定義樣式;
- id的優(yōu)先級要高于class
- 那么什么時候用 class 什么時候用 id呢
- 單一的元素,或需要程序、JS控制的東西,需要用id定義;重復使用的元素、類別,用class定義。
- 如果在頁面中要對某個對象進行腳本操作(js),那么可以給他定義一個id,否則只能利用遍歷頁面元素加上指定特定屬性來找到它,這是相對浪費時間資源,遠遠不如一個id來得簡單.
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] 匹配屬性attr值為value的元素,div[id=test],匹配id=test的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:link 匹配所有未被點擊的鏈接
E:visited 匹配所有已被點擊的鏈接
E:active 匹配鼠標已經其上按下、還沒有釋放的E元素
E:hover 匹配鼠標懸停其上的E元素
E:focus 匹配獲得當前焦點的E元素
E:lang(c) 匹配lang屬性等于c的E元素
E:enabled 匹配表單中可用的元素
E:disabled 匹配表單中禁用的元素
E:checked 匹配表單中被選中的radio或checkbox元素
E::selection 匹配用戶當前選中的元素
E:root 匹配文檔的根元素,對于HTML文檔,就是HTML元素
E:nth-child(n) 匹配其父元素的第n個子元素,第一個編號為1
E:nth-last-child(n) 匹配其父元素的倒數(shù)第n個子元素,第一個編號為1
E:nth-of-type(n) 與:nth-child()作用類似,但是僅匹配使用同種標簽的元素
E:nth-last-of-type(n) 與:nth-last-child() 作用類似,但是僅匹配使用同種標簽的元素
E:last-child 匹配父元素的最后一個子元素,等同于:nth-last-child(1)
E:first-of-type 匹配父元素下使用同種標簽的第一個子元素,等同于:nth-of-type(1)
E:last-of-type 匹配父元素下使用同種標簽的最后一個子元素,等同于:nth-last-of-type(1)
E:only-child 匹配父元素下僅有的一個子元素,等同于:first-child:last-child或 :nth-child(1):nth-last-child(1)
E:only-of-type 匹配父元素下使用同種標簽的唯一一個子元素,等同于:first-of-type:last-of-type或 :nth-of-type(1):nth-last-of-type(1)
E:empty 匹配一個不包含任何子元素的元素,文本節(jié)點也被看作子元素
E:not(selector) 匹配不符合當前選擇器的任何元素
-
偽元素選擇器
選擇器 含義
E::first-line 匹配E元素內容的第一行
E::first-letter 匹配E元素內容的第一個字母
E::before 在E元素之前插入生成的內容
E::after 在E元素之后插入生成的內容
選擇器的優(yōu)先級是怎樣的?對于復雜場景如何計算優(yōu)先級?
選擇器優(yōu)先級
-
從高到低分別是
- 在屬性后面使用 !important 會覆蓋頁面內任何位置定義的元素樣式
- 作為style屬性寫在元素標簽上的內聯(lián)樣式
- id選擇器
- 類選擇器
- 偽類選擇器
- 屬性選擇器
- 標簽選擇器
- 通配符選擇器
- 瀏覽器自定義
-
復雜場景
#test p.class1 {...}
#test .class1.class2 {...}
行內樣式 <div style="xxx"></div> ==> a
ID 選擇器 ==> b
類,屬性選擇器和偽類選擇器 ==> c
標簽選擇器、偽元素 ==> d
小測試
* {} /* a=0 b=0 c=0 d=0 -> 0,0,0,0 */
p {} /* a=0 b=0 c=0 d=1 -> 0,0,0,1 */
a:hover {} /* a=0 b=0 c=1 d=1 -> 0,0,1,1 */
ul li {} /* a=0 b=0 c=0 d=2 -> 0,0,0,2 */
ul ol+li {} /* a=0 b=0 c=0 d=3 -> 0,0,0,3 */
h1+input[type=hidden]{} /* a=0 b=0 c=1 d=2 -> 0,0,1,1 */
ul ol li.active {} /* a=0 b=0 c=1 d=3 -> 0,0,1,3 */
#ct .box p {} /* a=0 b=1 c=1 d=1 -> 0,1,1,1 */
div#header:after {} /* a=0 b=1 c=0 d=2 -> 0,1,0,2 */
style="" /* a=1 b=0 c=0 d=0 -> 1,0,0,0 */
從a開始看,誰數(shù)值越大優(yōu)先級越高;如果a數(shù)值一樣,接著看b,如此類推。
選擇器使用經驗
遵守 CSS 書寫規(guī)范
使用合適的命名空間
合理的復用class
a:link, a:hover, a:active, a:visited 的順序是怎樣的? 為什么?
- 正確順序
- a:link
- a:visited
- a:hover
- a:active
因為 a:visited 在鏈接點擊過一次之后永久生效,如果放在最后會覆蓋掉其他的樣式,在鏈接訪問過一次之后 a:hover 和 a:active 樣式都會被覆蓋。
以下選擇器分別是什么意思?
#header{} /* id為header的元素 */
.header{} /* class為header的元素 */
.header .logo{} /* class為header的元素下子元素Class為logo的元素 */
.header.mobile{} /* 類名包含header和mobile的元素,如class = 'header mobile' */
.header p, .header h3{} /* class為header下的子元素p標簽 和 class為header的子元素的h3標簽 */
#header .nav>li{} /* id為header下的子元素class為nav的元素下的直接子元素的li標簽 */
#header a:hover{} /* id為header下的子元素a標簽在hover狀態(tài)(鼠標懸停)下的樣式 */
#header .logo~p{} /* id為header下的子元素class為logo的同級元素中為p標簽的元素 */
#header input[type="text"]{} /* id為header下的子元素input標簽的type屬性為text的元素 */
列出你知道的偽類選擇器
選擇器 含義
E:first-child 匹配元素E的第一個子元素
E:link 匹配未被點擊的鏈接
E:visited 匹配點擊過的鏈接
E:active 匹配當前被鼠標點下未釋放的元素
E:hover 匹配鼠標懸停其上的元素
E:focus 匹配當前獲得焦點的元素
E:lang(c) 匹配lang屬性值等于c的元素
E:enabled 匹配表單中可用的元素
E:disabled 匹配表單中禁用的元素
E:checked 匹配表單中被選中的radio或checkbook元素
E:selection 匹配當前用戶選中的元素
E:first-of-type 匹配父元素下使用同種標簽的第一個子元素
E:first-child 匹配父元素下第一個子元素
div:first-child和div:first-of-type的作用和區(qū)別
- div:first-child —— 選擇div標簽的父元素下的第一個子元素(類型為div),通俗的講就是長子div。
- div:first-of-type —— 選擇div標簽的父元素的div類型的第一個元素。
運行如下代碼,解析下輸出樣式的原因。
<style>
.item1:first-child{
color: red;
}
.item1:first-of-type{
background: blue;
}
</style>
<div class="ct">
<p class="item1">aa</p>
<h3 class="item1">bb</h3>
<h3 class="item1">ccc</h3>
</div>

jsbin代碼.png

代碼結果.png
.item1:first-child{ color: red; }
- 這段代碼的意思是選擇class為item1的元素的父元素下的第一個class為item1的子元素
- 滿足條件的是class為item1的p標簽。
.item1:first-of-type{ background: blue; }
- 這段代碼的意思是選擇所有class為item1的元素的相同元素類型中第一個出現(xiàn)的元素。
- 滿足條件的有第一個class為item1的p標簽 和 第一個class為item1的h3標簽。