詳解 CSS 屬性 - 偽類和偽元素的區(qū)別

CSS偽類用于向某些選擇器添加特殊的效果。

CSS偽元素用于將特殊的效果添加到某些選擇器。

可以明確兩點,第一兩者都與選擇器相關(guān),第二就是添加一些“特殊”的效果。這里特殊指的是兩者描述了其他css無法描述的東西。

偽類種類

偽元素種類

區(qū)別

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

p>i:first-child {color: red}

<p>

? ? ?<i >first</i>

? ? ?<i>second</i>

</p>

?效果 :

//偽類:first-child添加樣式到第一個子元素

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

.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添加樣式到第一個字母

那么如果我們不使用偽元素,要達(dá)到上述效果,應(yīng)該怎么做呢?

.first-letter {color: red}

<p><span class="first-child">I</span> ?am stephen lee.</p>

即我們給第一個字母添加一個span,然后給span增加樣式。

兩者的區(qū)別已經(jīng)出來了。那就是:

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

總結(jié)

偽元素和偽類之所以這么容易混淆,是因為他們的效果類似而且寫法相仿,但實際上css3為了區(qū)分兩者,已經(jīng)明確規(guī)定

冒號(:)用于CSS3偽類,雙冒號(::)用于CSS3偽元素

偽元素由雙冒號偽元素名稱組成。雙冒號是在css3規(guī)范中引入的,用于區(qū)分偽類和偽元素。但是偽類兼容現(xiàn)存樣式,瀏覽器需要同時支持舊的偽類,比如:first-line、:first-letter、:before、:after等。

對于CSS2之前已有的偽元素,比如:before,單冒號和雙冒號的寫法::before作用是一樣的。

提醒,如果你的網(wǎng)站只需要兼容webkit、firefox、opera等瀏覽器,建議對于偽元素采用雙冒號的寫法,如果不得不兼容IE瀏覽器,還是用CSS2的單冒號寫法比較安全。

在一次項目中,有一次要用到::selection偽元素,然后開發(fā)同學(xué)問我,CSS中一個冒號和兩個冒號有神馬區(qū)別?

這好像真的是個問題,或許很多前端同學(xué)對此都有疑惑,查了些資料,證實了下兩個符號的區(qū)別,簡而言之:單冒號(:)用于CSS3偽類,雙冒號(::)用于CSS3偽元素。

W3C關(guān)于CSS3選擇器的規(guī)范中有一段描述:

A pseudo-element is made of two colons (::) followed by the name of the pseudo-element. This :: notation is introduced by the current document in order to establish a discrimination between pseudo-classes and pseudo-elements. For compatibility with existing style sheets, user agents must also accept the previous one-colon notation for pseudo-elements introduced in CSS levels 1 and 2 (namely, :first-line, :first-letter, :before and :after). This compatibility is not allowed for the new pseudo-elements introduced in CSS level 3.

簡單翻譯一下,大意就是,偽元素由雙冒號和偽元素名稱組成。雙冒號是在當(dāng)前規(guī)范中引入的,用于區(qū)分偽類和偽元素。但是偽類兼容現(xiàn)存樣式,瀏覽器需要同時支持舊的偽類,比如:first-line、:first-letter、:before、:after等。

那么現(xiàn)在就可以完整的回答標(biāo)題中的問題了,對于CSS2之前已有的偽元素,比如:before,單冒號和雙冒號的寫法::before作用是一樣的。

所以,如果你的網(wǎng)站只需要兼容webkit、firefox、opera等瀏覽器,建議對于偽元素采用雙冒號的寫法,如果不得不兼容IE瀏覽器,還是用CSS2的單冒號寫法比較安全。

:Pseudo-classes

::Pseudo-elements

但因為兼容性的問題,所以現(xiàn)在大部分還是統(tǒng)一的單冒號,但是拋開兼容性的問題,我們在書寫時應(yīng)該盡可能養(yǎng)成好習(xí)慣,區(qū)分兩者。

2017年4月18日

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容