CSS偽類和虛擬元素的區別

來源:互聯網
上載者:User
偽類和虛擬元素皆獨立於文檔結構。它們擷取元素的途徑也不是基於id、class、屬性這些基礎的元素特徵,而是在處於特殊狀態的元素(偽類),或者是元素中特別的內容(虛擬元素)。區別總結如下:

CSS偽類 (Pseudo-classes):用於向某些選取器添加特殊的效果,即在元素當前靜態樣式的基礎上添加特殊效果(一般都是動態效果),所以一個元素達到一個特定狀態時,它可能得到一個偽類的樣式;當狀態改變時,它又會失去這個樣式。
屬性 描述
:active 向被啟用的元素添加樣式
:focus 向擁有鍵盤輸入焦點的元素添加樣式
:hover 當滑鼠懸浮在元素上方時,向元素添加樣式
:link 向未被訪問的連結添加樣式
:visited 向已被訪問的連結添加樣式
:first-child 向元素的第一個子項目添加樣式
:lang 向帶有指定lang屬性的元素添加樣式
備忘:在 CSS 定義中,同一個元素的 :hover 必須位於 :link、:visited 之後才會生效,:active 必須位於 :hover 之後才會生效。

css虛擬元素 (Pseudo-elements):用於向某些選取器設定特殊效果,是對元素中的特定內容進行設定和操作,操作層次比偽類更深,故動態性比偽類要差。

屬性 描述
:first-letter 向文本的第一個字母添加特殊樣式
:first-line 向文本的首行添加特殊樣式
:before 在元素之前新增內容
:after 在元素之後新增內容

w3c 對兩者的定義:

  • CSS 偽類用於向某些選取器添加特殊的效果。

  • CSS 虛擬元素用於將特殊的效果添加到某些選取器。

區別

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

p>i:first-child {color: red}<p>    <i>first</i>    <i>second</i></p>

//偽類 :first-child 添加樣式到第一個子項目
如果我們不使用偽類,而希望達到上述效果,可以這樣做:

.first-child {color: red}<p>    <i class="first-child">first</i>    <i>second</i></p>

即我們給第一個子項目添加一個類,然後定義這個類的樣式。那麼我們接著看看虛擬元素:

p::first-letter {color: red}<p>I am stephen lee.</p>

//虛擬元素 ::first-letter 添加樣式到第一個字母
那麼如果我們不使用虛擬元素,要達到上述效果,應該怎麼做呢?

.first-letter {color: red}<p><span class='first-letter'>I</span> am stephen lee.</p>

即我們給第一個字母添加一個 span,然後給 span 增加樣式。
兩者的區別已經出來了。那就是:

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

總結

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

:Pseudo-classes::Pseudo-elements

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

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.