詳解 CSS 屬性 偽類和偽元素的區別

2022-08-16 12:54:11 字數 3389 閱讀 1077

css的元素選擇器除了根據id(#)、class(.)、屬性([ ])選取元素以外,還有很重要的一類,就是根據元素的特殊狀態來選取元素。它們就是偽類和偽元素。跟id選擇器、類選擇器、屬性選擇器以及派生選擇器等等這些從html文件層次結構(dom樹)中獲取元素不同的是,偽類和偽元素是預定義的、獨立於文件元素的。它們獲取元素的途徑也不是基於id、class、屬性這些基礎的元素特徵,而是在處於特殊狀態的元素(偽類),或者是元素中特別的內容(偽元素)。當然,偽類和偽元素的表示形式也使用「:」(英文冒號)與其它選擇器相區分。

可以明確兩點,第一兩者都與選擇器相關,第二就是新增一些「特殊」的效果。這裡特殊指的是兩者描述了其他css無法描述的東西。

偽類選擇元素基於的是當前元素處於的狀態,或者說元素當前所具有的特性,而不是元素的id、class、屬性等靜態的標誌。由於狀態是動態變化的,所以乙個元素達到乙個特定狀態時,它可能得到乙個偽類的樣式;當狀態改變時,它又會失去這個樣式。由此可以看出,它的功能和class有些類似,但它是基於文件之外的抽象,所以叫偽類。

下面的示例是對:link, :hover, :active, :visited 個偽類效果的展示:

<

html

>

<

head

>

<

meta

content

="text/html"

charset

="utf-8"

/>

<

style

type

="text/css"

>

a:link

a:visited

a:hover

a:active

style

>

head

>

<

body

>

<

ahrefahref

=""a>

body

>

html

>

需要注意的是在css的定義中,同乙個元素的:hover必須位於:link、:visited之後才能生效,:active必須位於:hover之後才能生效。

下面的示例展示了:focus, :lang, :first-child個偽類的效果:

doctype html public "-//w3c//dtdxhtml 1.0 transitional//en"""

>

<

html

>

<

head

>

<

meta

charset

="utf-8"

content

="text/html"

/>

<

title

>

title

>

<

style

type

="text/css"

>

div:first-child

textarea:focus

div:lang(zh)

style

>

head

>

<

body

>

<

div>

<

textarea

>

textarea

>

div>

<

div>

<

textarea

>

textarea

>

div>

<

div

lang

="zh"

>

<

textarea

>

textarea

>

div>

body

>

html

>

與偽類針對特殊狀態的元素不同的是,偽元素是對元素中的特定內容進行操作,它所操作的層次比偽類更深了一層,也因此它的動態性比偽類要低得多。實際上,設計偽元素的目的就是去選取諸如元素內容第乙個字(母)、第一行,選取某些內容前面或後面這種普通的選擇器無法完成的工作。它控制的內容實際上和元素是相同的,但是它本身只是基於元素的抽象,並不存在於文件中,所以叫偽元素。

:before和:after通常與css內容生成配合使用。

這裡用偽類:first-child和偽元素:first-letter來進行比較。

p>i:first-child 

<

p>

<

i>first

i>

<

i>second

i>

p>

如果我們不使用偽類,而希望達到上述效果,可以這樣做:

.first-child 

<

p>

<

i class

="first-child"

>first

i>

<

i>second

i>

p>

那麼我們接著看看偽元素:

p:first-letter 

<

p>i am stephen lee.

p>

那麼如果我們不使用偽元素,要達到上述效果,應該怎麼做呢?

.first-letter 

<

p><

span

class

='first-letter'

>i

span

> am stephen lee.

p>

偽類的效果可以通過新增乙個實際的類來達到,而偽元素的效果則需要通過新增乙個實際的元素才能達到,這也是為什麼他們乙個稱為偽類,乙個稱為偽元素的原因。

偽元素和偽類之所以這麼容易混淆,是因為他們的效果類似而且寫法相仿,但實際上css3為了區分兩者,已經明確規定了偽類用乙個冒號來表示,而偽元素則用兩個冒號來表示。

:pseudo-classes      //偽類

::pseudo-elements //偽元素

但因為相容性的問題,所以現在大部分還是統一的單冒號,但是拋開相容性的問題,我們在書寫時應該盡可能養成好習慣,區分兩者。

css偽類和偽元素屬性

對css中基本選擇器和屬性選擇器以及偽類選擇器做了總結,但是提到偽類,與之相對應的必然是偽元素。那麼,二者到底有什麼不能說的秘密呢?接下來 先歸類下兩者 偽類的種類 偽元素的種類 兩者的使用方法 css3為了區分兩者,已經明確規定了偽類用乙個冒號來表示,而偽元素則用兩個冒號來表示。pseudo cl...

詳解 CSS 屬性 偽類和偽元素的區別

之前寫了一篇 詳解 css 屬性 before after 的博文,當時自己沒分清楚偽元素和偽類,所以在文章內把概念混淆了,慶幸 riophae 兄指正了我的錯誤,所以今天打算好好研究下兩者的區別。首先,閱讀w3c對兩者的定義 可以明確兩點,第一兩者都與選擇器相關,第二就是新增一些 特殊 的效果。這...

詳解 CSS 屬性 偽類和偽元素的區別

之前寫了一篇 詳解 css 屬性 before after 的博文,當時自己沒分清楚偽元素和偽類,所以在文章內把概念混淆了,慶幸 riophae 兄指正了我的錯誤,所以今天打算好好研究下兩者的區別。首先,閱讀 w3c 對兩者的定義 可以明確兩點,第一兩者都與選擇器相關,第二就是新增一些 特殊 的效果...