前端新手常見問題(四)-CSS選擇器

class 和 id 的使用場景?

class屬性:

指定標(biāo)簽的類名,CSS操作中,把一些特定的樣式放到一個類中,需要此樣式的標(biāo)簽,可以添加此類,可以把多個類放到一個class屬性中,但必須用空格隔開來。

id屬性:

1、指定標(biāo)簽的唯一id號,快速獲取標(biāo)簽對象,如:document.getElementById(id);
2、用于充當(dāng)label標(biāo)簽for屬性的值。
3、CSS中,用于對應(yīng)的id選擇器 #id名{xxx:xxx}。

CSS選擇器常見的有幾種?

基礎(chǔ)選擇器

1、*{ }:通用元素選擇器,匹配頁面任何元素(這也就決定了我們很少使用)
2、#id:id選擇器,匹配特定id的元素
3、.class:類選擇器,匹配class包含(不是等于)特定類的元素
4、element:標(biāo)簽選擇器,直接使用標(biāo)簽名

范例:
  • {
    margin: 0;
    padding: 0;
    }
    ‘#id-selector{
    color: #333;
    }
    .class-selector{
    background: #ccc;
    }
    p {
    font-size: 20px;
    }

組合選擇器:

1、E,F:多元素選擇器,用,分隔,同時匹配元素E或元素F
2、E F:后代選擇器,用空格分隔,匹配E元素所有的后代(不只是子元素、子元素向下遞歸)元素F
3、E>F:子元素選擇器,用>分隔,匹配E元素的所有直接子元素F
4、E+F:直接相鄰選擇器,匹配E元素之后的相鄰的同級元素F
5、E~F:普通相鄰選擇器(弟弟選擇器),匹配E元素之后的同級元素F(無論直接相鄰與否)
6、.class1.class2:id和class選擇器和選擇器連寫的時候中間沒有分隔符,. 和 # 本身充當(dāng)分隔符的元素
7、element#id:id和class選擇器和選擇器連寫的時候中間沒有分隔符,. 和 # 本身充當(dāng)分隔符的元素

范例:

1、div,p{xxx:xxx} 同時匹配div元素和p元素
2、div p{xxx:xxx}匹配div元素下的所有子元素p(包括孫元素)
3、div>p{xxx:xxx} 匹配div元素下的所有第一級子元素p(不包括孫元素)
4、h1+p{xxx:xxx} 匹配所有h1元素之后的相鄰的同級p元素
5、h1~p{xxx:xxx} 匹配h1元素之后的所有同級p元素

屬性選擇器:

1、E[attr]:匹配所有具有屬性attr的元素,div[id]就能取到所有有id屬性的div
2、E[attr = value]:匹配屬性attr值為value的元素,div[id=test],匹配id=test的div
3、E[attr ~= value]:匹配所有屬性attr具有多個空格分隔、其中一個值等于value的元素
4、E[attr ^= value]:匹配屬性attr的值以value開頭的元素
5、E[attr $= value]:匹配屬性attr的值以value結(jié)尾的元素
6、E[attr *= value]:匹配屬性attr的值包含value的元素

偽類選擇器

E:first-child 匹配作為長子(第一個子女)的元素E
E:link 匹配所有未被點擊的鏈接
E:visited 匹配所有已被點擊的鏈接
E:active 匹配鼠標(biāo)已經(jīng)其上按下、還沒有釋放的E元素
E:hover 匹配鼠標(biāo)懸停其上的E元素
E:focus 匹配獲得當(dāng)前焦點的E元素
E:lang(c) 匹配lang屬性等于c的E元素
E:enabled 匹配表單中可用的元素
E:disabled 匹配表單中禁用的元素
E:checked 匹配表單中被選中的radio或checkbox元素
E::selection 匹配用戶當(dāng)前選中的元素
?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()作用類似,但是僅匹配使用同種標(biāo)簽的元素
E:nth-last-of-type(n) 與:nth-last-child() 作用類似,但是僅匹配使用同種標(biāo)簽的元素
E:last-child 匹配父元素的最后一個子元素,等同于:nth-last-child(1)
E:first-of-type 匹配父元素下使用同種標(biāo)簽的第一個子元素,等同于:nth-of-type(1)
E:last-of-type 匹配父元素下使用同種標(biāo)簽的最后一個子元素,等同于:nth-last-of-type(1)
E:only-child 匹配父元素下僅有的一個子元素,等同于:first-child:last-child或 :nth-child(1):nth-last-child(1)
E:only-of-type 匹配父元素下使用同種標(biāo)簽的唯一一個子元素,等同于:first-of-type:last-of-type或 :nth-of-type(1):nth-last-of-type(1)
E:empty 匹配一個不包含任何子元素的元素,文本節(jié)點也被看作子元素
E:not(selector) 匹配不符合當(dāng)前選擇器的任何元素

注意:n的取值

1,2,3,4,5
2n+1, 2n, 4n-1
odd, even

偽元素選擇器

E::first-line 匹配E元素內(nèi)容的第一行
E::first-letter 匹配E元素內(nèi)容的第一個字母
E::before 在E元素之前插入生成的內(nèi)容
E::after 在E元素之后插入生成的內(nèi)容

CSS選擇器優(yōu)先級問題

從高到低分別是

1、在屬性后面使用 !important 會覆蓋頁面內(nèi)任何位置定義的元素樣式
2、作為style屬性寫在元素標(biāo)簽上的內(nèi)聯(lián)樣式
3、id選擇器
4、類選擇器
5、偽類選擇器
6、屬性選擇器
7、標(biāo)簽選擇器
8、通配符選擇器
9、瀏覽器自定義

復(fù)雜場景中:

1.如果聲明來自于“style”屬性,而不是帶有選擇器的規(guī)則,則記為 1,否則記為 0 (= a)(HTML元素的style屬性也是樣式規(guī)則,因為這些樣式規(guī)則沒有選擇器,因此記為a=1,b=0,c=0,d=0)
2.計算選擇器中 ID 屬性的個數(shù) (= b)
3.計算選擇器中其他屬性(類、屬性選擇器)和偽類的個數(shù) (= c)
4.計算選擇器中元素名稱和偽元素的個數(shù) (= d)
四個級別分別為:行內(nèi)選擇符、ID選擇符、類別選擇符、元素選擇符。
  優(yōu)先級的算法:
  每個規(guī)則對應(yīng)一個初始"四位數(shù)":0、0、0、0
  若是 行內(nèi)選擇符,則加1、0、0、0
  若是 ID選擇符,則加0、1、0、0
  若是 類選擇符/屬性選擇符/偽類選擇符,則分別加0、0、1、0
  若是 元素選擇符/偽元素選擇符,則分別加0、0、0、1
  算法:將每條規(guī)則中,選擇符對應(yīng)的數(shù)相加后得到的”四位數(shù)“,從左到右進(jìn)行比較,大的優(yōu)先級越高。
  需注意的:
  ①、!important的優(yōu)先級是最高的,但出現(xiàn)沖突時則需比較”四位數(shù)“;
 ?、凇?yōu)先級相同時,則采用就近原則,選擇最后出現(xiàn)的樣式;
 ?、?、繼承得來的屬性,其優(yōu)先級最低;
  !important > 行內(nèi)樣式>ID選擇器 > 類選擇器 > 標(biāo)簽 > 通配符 > 繼承 > 瀏覽器默認(rèn)屬性

a:link, a:hover, a:active, a:visited 的順序是怎樣的? 為什么?

css中關(guān)于超鏈接的四個屬性一般正常順序為:link,visited,hover,active:
a:link,定義正常鏈接的樣式;
a:visited,定義已訪問過鏈接的樣式;
a:hover,定義鼠標(biāo)懸浮在鏈接上時的樣式;
a:active,定義鼠標(biāo)點擊鏈接時的樣式。

原因:

1、鏈接未被訪問時,鼠標(biāo)經(jīng)過同時擁有l(wèi)ink,hover兩種屬性,后面的屬性會覆蓋前面屬性的定義。
2、鏈接被點擊時會觸發(fā)active屬性,同時覆蓋前面的屬性
3、鏈接被訪問過后,鼠標(biāo)經(jīng)過時同時擁有visited、hover兩種屬性。
4、所以說hover要放在link、visired的后面。

div:first-child和div:first-of-type的作用和區(qū)別

先看下面一條代碼:

QQ截圖20170402142212.png

p:first-child 匹配到的是p元素,因為p元素是div的第一個子元素;
h1:first-child 匹配不到任何元素,因為在這里h1是div的第二個子元素,而不是第一個;
span:first-child 匹配不到任何元素,因為在這里兩個span元素都不是div的第一個子元素;

p:first-of-type 匹配到的是p元素,因為p是div的所有類型為p的子元素中的第一個;
h1:first-of-type 匹配到的是h1元素,因為h1是div的所有類型為h1的子元素中的第一個;
span:first-of-type 匹配到的是第三個子元素span。這里div有兩個為span的子元素,匹配到的是它們中的第一個。

總結(jié):

1、:first-child 匹配的是某父元素的第一個子元素,可以說是結(jié)構(gòu)上的第一個子元素。
2、:first-of-type 匹配的是某父元素下相同類型子元素中的第一個,比如 p:first-of-type,就是指所有類型為p的子元素中的第一個。這里不再限制是第一個子元素了,只要是該類型元素的第一個就行了。
3、同樣類型的選擇器 :last-child 和 :last-of-type、:nth-child(n) 和 :nth-of-type(n) 也可以這樣去理解。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.class 和 id 的使用場景? 兩者都能選取DOM節(jié)點并給DOM節(jié)點添加樣式,但是W3C標(biāo)準(zhǔn)里規(guī)定頁面中只...
    饑人谷_米彌輪閱讀 511評論 0 1
  • 1.class 和 id 的使用場景? class:類選擇器,一個標(biāo)簽可以有多個類且同一個類可以用到不同的標(biāo)簽上,...
    饑人谷_兔子君閱讀 1,282評論 0 0
  • 1.class 和 id 的使用場景? 類選擇器允許以一種獨(dú)立于文檔元素的方式來指定樣式。該選擇器可以單獨(dú)使用,也...
    草鞋弟閱讀 2,562評論 0 1
  • class 和 id 的使用場景 class:一個標(biāo)簽可以有多個class且同一個class可以用到不同的標(biāo)簽上,...
    尾巴尾巴尾巴閱讀 482評論 0 0
  • 選擇器 元素選擇符 關(guān)系選擇符 屬性選擇符 偽類選擇符 偽對象選擇符 一、元素選擇符 通配選擇符 (*):選擇所有...
    云外之境閱讀 1,958評論 0 0

友情鏈接更多精彩內(nèi)容