CSS3偽類和偽元素的特性和區(qū)別

前端er們大都或多或少地接觸過CSS偽類和偽元素,比如最常見的:focus,:hover以及<a>標(biāo)簽的:link锹雏、visited等巴比,偽元素較常見的比如:before:after等逼侦。

其實上面提到的這些偽類和偽元素都是CSS1和CSS2中的概念匿辩,CSS1和CSS2中對偽類的偽元素的區(qū)別比較模糊,甚至經(jīng)常有同行將:before榛丢、:after稱為偽類铲球。CSS3對這兩個概念做了相對較清晰地概念,并且在語法上也很明顯的講二者區(qū)別開晰赞。

偽類 - pseudo classes

首先看看CSS2中對偽類的定義:

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

單單看定義完全不懂在講什么。截止CSS2掖鱼,偽類有以下幾種(偷個懶然走,截圖引自W3School):

image

然后是CSS3對偽類的定義:

The pseudo-class concept is introduced to permit selection based on information that lies outside of the document tree or that cannot be expressed using the other simple selectors.

A pseudo-class always consists of a "colon" (:) followed by the name of the pseudo-class and optionally by a value between parentheses.

Pseudo-classes are allowed in all sequences of simple selectors contained in a selector. Pseudo-classes are allowed anywhere in sequences of simple selectors, after the leading type selector or universal selector (possibly omitted). Pseudo-class names are case-insensitive. Some pseudo-classes are mutually exclusive, while others can be applied simultaneously to the same element. Pseudo-classes may be dynamic, in the sense that an element may acquire or lose a pseudo-class while a user interacts with the document.

簡單翻譯一下:

偽類存在的意義是為了通過選擇器找到那些不存在與DOM樹中的信息以及不能被常規(guī)CSS選擇器獲取到的信息。

偽類由一個冒號:開頭戏挡,冒號后面是偽類的名稱和包含在圓括號中的可選參數(shù)芍瑞。

任何常規(guī)選擇器可以再任何位置使用偽類。偽類語法不區(qū)別大小寫褐墅。一些偽類的作用會互斥拆檬,另外一些偽類可以同時被同一個元素使用洪己。并且,為了滿足用戶在操作DOM時產(chǎn)生的DOM結(jié)構(gòu)改變竟贯,偽類也可以是動態(tài)的答捕。

其實第一段話就囊括CSS3偽類的全部定義了,這段話中指出CSS3偽類的功能有兩種:

  1. 獲取不存在與DOM樹中的信息屑那。比如<a>標(biāo)簽的:link拱镐、visited等,這些信息不存在與DOM樹結(jié)構(gòu)中持际,只能通過CSS選擇器來獲任掷拧;
  2. 獲取不能被常規(guī)CSS選擇器獲取的信息选酗。比如偽類:target阵难,它的作用是匹配文檔(頁面)的URI中某個標(biāo)志符的目標(biāo)元素,例如我們可以通過如下代碼來實現(xiàn)頁面內(nèi)的區(qū)域跳轉(zhuǎn):
<ul class="tabs">
    <li><a href="#tab1">標(biāo)簽一</a></li>
    <li><a href="#tab2">標(biāo)簽二</a></li>
    <li><a href="#tab3">標(biāo)簽三</a></li>
</ul>
<div id="tab1" class="tab_content">
<!--tabed content--></div>
<div id="tab2" class="tab_content">
<!--tabed content--></div>
<div id="tab3" class="tab_content">
<!--tabed content--></div>

CSS代碼如下:

.tab_content {
  height: 800px;
  background: red;
  margin-bottom: 100px;
}
#tab1:target, #tab2:target, #tab3:target {
    background:blue;
}

當(dāng)然芒填,通過JavaScript來獲取window.location.hash同樣可以實現(xiàn)上例中的效果,但這是另外一回事了空繁〉钏ィ總之,:target通過CSS實現(xiàn)了常規(guī)CSS無法實現(xiàn)的邏輯盛泡。

其實對比來看闷祥,CSS2中對偽類的定義也是合理地,但是它并未指出“某些選擇器”是“哪些選擇器”傲诵,CSS3對偽類的定義就顯得明確了很多凯砍。

再舉個栗子,通過:nth-child()偽類可以實現(xiàn)一些很有意思的效果拴竹,比如:

table tr:nth-child(2n) td{
   background-color: #ccc;
}
table tr:nth-child(2n+1) td{
   background-color: #fff;
}
table tr:nth-child(2n+1):nth-child(5n) td{
   background-color: #f0f;
}

上面的代碼將所有偶數(shù)行背景色設(shè)置為#ccc悟衩,不能被5整除的奇數(shù)行設(shè)置背景色#fff,能夠被5整除的奇數(shù)行設(shè)置背景色#f0f栓拜。

如果不使用偽類而是使用JavaScript代碼來實現(xiàn)上述的效果座泳,恐怕要復(fù)雜很多。

可以總結(jié)出:nth-child()偽類的效果是將被常規(guī)css選擇器篩選出的元素按照既定規(guī)定進行再次篩選幕与。

CSS3中還引入了許多新的偽類挑势,感興趣的讀者可以參考這里

偽元素 - Pseudo-elements

CSS2中對偽元素的定義:

CSS 偽元素用于向某些選擇器設(shè)置特殊效果啦鸣。

好吧潮饱,跟偽類的定義完全一樣有木有(吐槽一下W3School的翻譯)。其實人家這樣翻譯也沒有錯诫给,本來CSS2對偽類和偽元素的定義就是完全一樣的:

CSS introduces the concepts of pseudo-elements and pseudo-classes to permit formatting based on information that lies outside the document tree.

截止CSS2香拉,偽元素有以下幾種:

image

然后再看CSS3中偽元素的定義

Pseudo-elements create abstractions about the document tree beyond those specified by the document language. For instance, document languages do not offer mechanisms to access the first letter or first line of an element's content. Pseudo-elements allow authors to refer to this otherwise inaccessible information. Pseudo-elements may also provide authors a way to refer to content that does not exist in the source document (e.g., the ::before and ::after pseudo-elements give access to generated content).

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 this specification.

Only one pseudo-element may appear per selector, and if present it must appear after the sequence of simple selectors that represents the subjects of the selector.

Note: A future version of this specification may allow multiple pseudo-elements per selector.

簡單翻譯一下:

偽元素在DOM樹中創(chuàng)建了一些抽象元素啦扬,這些抽象元素是不存在于文檔語言里的(可以理解為html源碼)。比如:documen接口不提供訪問元素內(nèi)容的第一個字或者第一行的機制缕溉,而偽元素可以使開發(fā)者可以提取到這些信息考传。并且,一些偽元素可以使開發(fā)者獲取到不存在于源文檔中的內(nèi)容(比如常見的::before,::after)证鸥。

偽元素的由兩個冒號::開頭僚楞,然后是偽元素的名稱。

使用兩個冒號::是為了區(qū)別偽類和偽元素(CSS2中并沒有區(qū)別)枉层。當(dāng)然泉褐,考慮到兼容性,CSS2中已存的偽元素仍然可以使用一個冒號:的語法鸟蜡,但是CSS3中新增的偽元素必須使用兩個冒號::膜赃。

一個選擇器只能使用一個偽元素,并且偽元素必須處于選擇器語句的最后揉忘。

注:不排除未來會加入同時使用多個偽元素的機制跳座。

同樣,第一段話是偽元素的清晰定義泣矛,也是偽元素與偽類最大的區(qū)別疲眷。簡單來說,偽元素創(chuàng)建了一個虛擬容器您朽,這個容器不包含任何DOM元素狂丝,但是可以包含內(nèi)容。另外哗总,開發(fā)者還可以為偽元素定制樣式几颜。

::first-line為例,它獲取了指定元素的第一行內(nèi)容并且將第一行的內(nèi)容加入到虛擬容器中讯屈。如果通過JavaScript來實現(xiàn)這個邏輯蛋哭,那么要考慮的因素就太多了,比如制定元素的寬度耻煤、字體大小具壮,甚至浮動元素的圖文混排等等。當(dāng)然哈蝇,這些問題確實是可以用JavaScript來解決的棺妓,但是相對于::first-line簡簡單單的幾個字,用JavaScript恐怕不止這些吧炮赦!

舉個綜合使用偽類和偽元素的栗子:

q:lang(de)::after{
    content: " (German) ";
}
q:lang(en)::after{
    content: " (English) ";
}
q:lang(fr)::after{
    content: " (French) ";
}
q:not(:lang(fr)):not(:lang(de)):not(:lang(en))::after{
    content: " (Unrecognized language) ";
}

以上代碼通過偽類"lang獲取不同lang屬性的節(jié)點怜跑,并為之設(shè)置偽元素::after,偽元素的內(nèi)容是此節(jié)點的語言類型。

最后性芬,總結(jié)一下偽類與偽元素的特性及其區(qū)別:

  1. 偽類本質(zhì)上是為了彌補常規(guī)CSS選擇器的不足峡眶,以便獲取到更多信息;
  2. 偽元素本質(zhì)上是創(chuàng)建了一個有內(nèi)容的虛擬容器植锉;
  3. CSS3中偽類和偽元素的語法不同辫樱;
  4. 可以同時使用多個偽類,而只能同時使用一個偽元素俊庇;
    來源:才子鍋鍋博客 https://www.cnblogs.com/ihardcoder/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狮暑,一起剝皮案震驚了整個濱河市搬男,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖歉糜,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異甘耿,居然都是意外死亡于游,警方通過查閱死者的電腦和手機倾剿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門芹缔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了藻丢?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摄乒。 經(jīng)常有香客問我悠反,道長,這世上最難降的妖魔是什么馍佑? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任斋否,我火速辦了婚禮,結(jié)果婚禮上拭荤,老公的妹妹穿的比我還像新娘茵臭。我一直安慰自己,他們只是感情好舅世,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布旦委。 她就那樣靜靜地躺著,像睡著了一般雏亚。 火紅的嫁衣襯著肌膚如雪缨硝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天评凝,我揣著相機與錄音追葡,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛宜肉,可吹牛的內(nèi)容都是我干的匀钧。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼谬返,長吁一口氣:“原來是場噩夢啊……” “哼之斯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起遣铝,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤佑刷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后酿炸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘫絮,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年填硕,在試婚紗的時候發(fā)現(xiàn)自己被綠了麦萤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡扁眯,死狀恐怖壮莹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姻檀,我是刑警寧澤命满,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站绣版,受9級特大地震影響胶台,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜杂抽,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一概作、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧默怨,春花似錦、人聲如沸骤素。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽济竹。三九已至痕檬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間送浊,已是汗流浹背梦谜。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唁桩。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓闭树,卻偏偏與公主長得像,于是被迫代替她去往敵國和親荒澡。 傳聞我的和親對象是個殘疾皇子报辱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

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

  • CSS偽類用于向某些選擇器添加特殊的效果。 CSS偽元素用于將特殊的效果添加到某些選擇器单山。 可以明確兩點碍现,第一兩者...
    曾基錕閱讀 1,201評論 0 1
  • 本文轉(zhuǎn)載自:眾成翻譯譯者:為之漫筆鏈接:http://www.zcfy.cc/article/239原文:http...
    極樂君閱讀 7,369評論 1 62
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)米奸。 注意:講述HT...
    kismetajun閱讀 27,450評論 1 45
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案昼接? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補...
    _Yfling閱讀 13,737評論 1 92
  • 世人皆識蝶戀花 唯我獨笑愛蜜罷 山雨嘈嘈落未停 踢踏踢踏踩風(fēng)去
    四月一日君啊閱讀 119評論 0 1