CSS的僞類和僞元素你知道多少?

本文首發於 邊玉傑的技術博客

轉載請註明出處

僞類

一個 CSS 僞類是以一個冒號( : )作爲前綴,被添加到一個選擇器末尾的關鍵字,可以讓指定的元素在特定的狀態呈現指定的樣式。例如 :hover,當用戶懸停在指定元素時,可以在這個狀態給指定元素添加相應的樣式,是在 DOM 樹無法描述的狀態下才能給元素添加樣式。

首先,下方的正方形都沒有背景色:

1、:first-child

:first-child 表示在一組兄弟元素中的第一個元素

/* 所有正方形都沒有背景色,因爲此時選中的是 <p> 標籤*/
<div class="list">
     <p>.square 這是一個p標籤</p>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
</div>
.square:first-child{
     background: orangered;
}

效果如下:

img

/* 第 1 個正方形有背景色,因爲此時選中的是第一個 .square */
<div class="list">
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
</div>
.square:first-child{
     background: orangered;
}

效果如下:

img

2、:first-of-type

:first-of-type 表示一組兄弟元素中指定類型的第一個元素

/* :first-of-type 選擇在父元素中第一個出現的 .square
而不管其在兄弟內的位置如何,第一個正方形有背景色 */
<div class="list">
     <p>.square 這是一個p標籤</p>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
</div>
.square:first-of-type{
     background: orangered;
}

效果如下:

img

3、:last-child

:last-child 表示在一組兄弟元素中的最後一個元素(類似 :first-child)

/* :last-child 此時選中的是最後一個 .square
最後一個正方形有背景色 */
<div class="list">
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
</div>
.square:last-child{
     background: orangered;
}

效果如下:

img

4、:last-of-type

:last-of-type 表示一組兄弟元素中指定類型的最後一個元素(類似 :first-of-type)

/* :last-of-type 選擇在父元素中最後一個出現的 .square
而不管其在兄弟內的位置如何,最後一個正方形有背景色 */
<div class="list">
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
</div>
.square:last-of-type{
     background: orangered;
}

效果如下:

img

5、:not

:not 一個否定僞類,用於匹配不符合參數選擇器的元素

/* 不含有 .not 的正方形有背景色*/
<div class="list">
     <div class="square not"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square not"></div>
</div>
.square:not(.not){
     background: orangered;
}

效果如下:

img

6、:nth-child(an+b)

:nth-child 這個 CSS 僞類首先會找到當前元素的兄弟元素,然後按照位置的先後順序從1開始排序,選擇的結果爲第(an+b)個元素的集合(n=0,1,2,3…)。如果 an+b 爲 0,無法選中任何元素

6-1、:nth-child(4) 匹配位置爲 4 的元素

/*第 3 個正方形有背景色 因爲第 3 個正方形在所有兄弟元素中排第 4 */
<div class="list">
     <p>.square 這是一個p標籤</p>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
</div>
.square:nth-child(4) {
     background: orangered;
}

效果如下:

img

 /*此時第 4 個正方形有背景色 */
<div class="list">
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
</div>
.square:nth-child(4) {
     background: orangered;
}

效果如下:

img

6-2、:nth-child(2n) 匹配位置爲2、 4、6、8… 的元素,可以使用 :nth-child(even) 代替

/*第 2、 4、6、8 個正方形有背景色 */
<div class="list">
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
</div>
.square:nth-child(2n) {
     background: orangered;
}

效果如下:

img

6-3、:nth-child(2n+1) 匹配位置爲1、 3、5、7… 的元素,可以使用 :nth-child(odd) 代替

/*第 1、 3、5、7 個正方形有背景色 */
<div class="list">
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
</div>
.square:nth-child(2n+1) {
     background: orangered;
}

效果如下:

img

6-4、:nth-child(3n) 匹配位置爲 3、6、9… 的元素

/*第 3、6 個正方形有背景色 */
<div class="list">
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
</div>
.square:nth-child(3n) {
     background: orangered;
}

效果如下:

img

7、:nth-of-type(an+b)

:nth-of-type 與 nth-child 相似,不同之處在於它是隻匹配特定類型的元素

<div class="list">
     <p>.square 這是一個p標籤</p> 
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
</div>
.square:nth-of-type(4) {
     background: orangered;
}

效果如下:

img

8、:nth-last-child(an+b)

:nth-last-child 與 nth-child 相似,它是從最後一個子元素開始計數的

<div class="list">
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <p>.square 這是一個p標籤</p>
</div>
.square:nth-last-child(4) {
     background: orangered;
}

效果如下:

img

9、:nth-last-of-type

:nth-last-of-type 與 nth-of-type 相似,不同之處在於它是從最後一個子元素開始計數的

<div class="list">
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <p>.square 這是一個p標籤</p>
</div>
.square:nth-last-of-type(4) {
     background: orangered;
}

效果如下:

img

僞元素

僞元素的前綴是兩個冒號 ( :: ) , 同樣是添加到選擇器後面去選擇某個元素的某個部分。僞元素創建了不存在 DOM 樹中的元素,併爲其添加樣式。例如,::after 選擇元素後,在其內容後使用 content 添加內容。雖然可以看到添加的內容,但是這些內容實際上不存在 DOM 樹中

1、::after(:after)

使用 ::after 會創建一個僞元素,該僞元素會成爲選中元素的最後一個子元素

<div class="list">
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <p>.square 這是一個p標籤</p>
</div>
p::after{
     content: "✨✨";
}

效果如下:

img

2、::before(:before)

使用 ::before 會創建一個僞元素,該僞元素會成爲選中元素的第一個子元素

<div class="list">
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <p>.square 這是一個p標籤</p>
</div>
p::before{
     content: "✨✨";
}

效果如下:

img

3、::first-letter(:first-letter)

::first-letter 選中某塊級元素第一行的第一個字母,並且文字所處的行之前沒有其他內容

<div class="list">
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <p>.square 這是一個p標籤</p>
</div>
p::first-letter{
     color: red;
}

效果如下:

img

4、::first-line(:first-line)

::first-line 在某塊級元素的第一行應用樣式。第一行的長度取決於很多因素,包括元素寬度,文檔寬度和文本的文字大小。和其他所有的僞元素一樣,::first-line 不能匹配任何真實存在的 html 元素。::first-line 僞元素只能在塊容器中,所以,::first-line 僞元素只能在一個 display 值爲 block,,inline-block,table-cell 或者 table-caption 中有用

<div class="list">
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <p>.square 這是一個p標籤</p>
</div>
p::first-line{
     color: red;
}

效果如下:

img

5、::selection

::selection 用於文檔中被用戶高亮的部分(比如使用鼠標或其他選擇設備選中的部分)

<div class="list">
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <div class="square"></div>
     <p>.square 這是一個p標籤</p>
</div>
p::selection{
     background-color: #ffeb3b;
}

使用鼠標選中亮字,效果圖:

img

兼容性

僞類的兼容性:

img

img

僞元素的兼容性:

img

元素兼容性查看

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章