欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

CSS中的before和:after偽元素使用詳解

  發(fā)布時(shí)間:2015-05-27 15:17:18   作者:佚名   我要評(píng)論
這篇文章主要介紹了CSS中的before和:after偽元素使用詳解,包括對(duì)一些非文本內(nèi)容的插入操作使用,需要的朋友可以參考下

如果你一直密切關(guān)注著各種網(wǎng)頁(yè)設(shè)計(jì)的博客,你可能已經(jīng)注意到了:before和:after偽元素已經(jīng)在前端開(kāi)發(fā)中獲得了相當(dāng)多的關(guān)注。特別是在Nicolas Gallagher的博客中,后期運(yùn)用了很多偽類元素。
2015527152013288.png (500×334)

Nicolas Gallagher使用偽元素用靜態(tài)的HTML標(biāo)簽創(chuàng)建84個(gè)GUI圖標(biāo)。

為了補(bǔ)充說(shuō)明上述內(nèi)容(和利用當(dāng)前發(fā)展的趨勢(shì)),我收集一些完全在偽元素下運(yùn)行的東西。本文主要針對(duì)這一類人群,即已經(jīng)看到了用偽元素做出了很酷的東西,但想知道所有有關(guān)before在css技術(shù)里的運(yùn)用。

盡管css 規(guī)范中包含其他的偽元素,我們焦點(diǎn)是 :before 和 :after。因此,為了簡(jiǎn)便起見(jiàn),我所說(shuō)的“偽元素”泛指這兩個(gè)特別的偽元素。
偽元素能做什么呢?

“偽元素”,顧名思義。它創(chuàng)建了一個(gè)虛假的元素,并插入到目標(biāo)元素內(nèi)容之前或之后。

單詞“pseudo”是希臘語(yǔ)的英譯,它的基本意思是“說(shuō)謊的,不誠(chéng)實(shí)的,錯(cuò)誤的。”因此叫偽元素是適合的。因?yàn)樵谖臋n中它不實(shí)際改變什么。相反的,它們是像幽靈一般的元素插入在css中,他們對(duì)用戶是可見(jiàn)的,可以通過(guò)css控制。
基本語(yǔ)法

:before 和 :after 偽元素編碼非常簡(jiǎn)單(和大多數(shù)的css屬性一樣不需要一大堆的前綴)。這里是一個(gè)簡(jiǎn)單的例子。
 

CSS Code復(fù)制內(nèi)容到剪貼板
  1. #example:before {   
  2.   content"#";   
  3. }   
  4.     
  5. #example:after {   
  6.   content".";   
  7. }  

這個(gè)例子中提到了兩件事情,第一,我們用#example:before和#example:after來(lái)目標(biāo)鎖定相同的元素.嚴(yán)格的說(shuō),在代碼中他們是偽元素。

第二,在內(nèi)容模塊中提到,偽元素如果沒(méi)有設(shè)置“content”屬性,偽元素是無(wú)用的。

在這個(gè)例子中,擁有屬性id的元素將有一個(gè)哈希符號(hào)放置內(nèi)容之前,和一個(gè)句號(hào)在內(nèi)容之后。
語(yǔ)法筆記

你可以設(shè)置content屬性值為空,并且僅僅把他當(dāng)做一個(gè)內(nèi)容很少的盒子。像這樣:
 

CSS Code復(fù)制內(nèi)容到剪貼板
  1. #example:before {   
  2.   content"";   
  3.   displayblock;   
  4.   width100px;   
  5.   height100px;   
  6. }  

然而,你不可以完全的移除content屬性,如果你移除了,偽元素將不會(huì)起作用。至少,content屬性需要空引用作為它的值(即:content:“”)。

你也許注意到,你也可以用兩個(gè)冒號(hào)(::before 和 ::after) 寫(xiě)偽元素,這個(gè)我以前討論過(guò)的。簡(jiǎn)短的解釋是,對(duì)于這兩種語(yǔ)法沒(méi)有什么不同,僅僅一點(diǎn)的不同是,偽元素(雙冒號(hào)),css3中的偽類是(單冒號(hào))

最后就語(yǔ)法而言。從技術(shù)上講,你可以普遍的應(yīng)用偽元素,不是放在特殊的元素上,像這樣:
 

CSS Code復(fù)制內(nèi)容到剪貼板
  1. :before {   
  2.   content"#";   
  3. }  

雖然上面是有效的,但是它十分的沒(méi)用。代碼會(huì)在DOM里的每個(gè)元素的內(nèi)容之前插入散列符號(hào)。即使你刪除了<body>標(biāo)簽和它的所有內(nèi)容,你仍會(huì)在頁(yè)面上看見(jiàn)兩個(gè)散列符號(hào):一個(gè)在<html>里,另一個(gè)在<body>標(biāo)簽里,瀏覽器會(huì)自動(dòng)創(chuàng)建哪一個(gè)。
插入內(nèi)容的特點(diǎn)

正如前面提及的,插入的內(nèi)容在頁(yè)面的源碼里是不可見(jiàn)的。只能在css里可見(jiàn)

同時(shí),插入的元素在默認(rèn)情況下是內(nèi)聯(lián)元素(或者,在html5中,在文本語(yǔ)義的類別里)。因此,為了給插入的元素賦予高度,填充,邊距等等,你通常必須顯式地定義它是一個(gè)塊級(jí)元素。

這會(huì)是對(duì)如何設(shè)計(jì)偽元素的一個(gè)簡(jiǎn)要的說(shuō)明,看我下面文本編輯器的這幅圖
2015527152044668.jpg (500×324)

在這個(gè)例子中,我高亮的樣式將被應(yīng)用到元素里插入到目標(biāo)元素內(nèi)容的前面和后面。

還要注意的是典型的CSS繼承規(guī)則適用于插入的元素。例如,你有字體系列黑體,宋體,無(wú)襯線字體應(yīng)用到body元素里,然后偽元素會(huì)像其他元素一樣繼承這些字體系列。

同樣的,偽元素不會(huì)繼承沒(méi)有自然繼承自父元素(如 padding and margins)的樣式。
之前或之后是什么?

你的直覺(jué)是:before和:after偽元素可能是 插入的內(nèi)容會(huì)被注入到目標(biāo)元素的前或后注入。但是,正如上面提到的,不是這樣的。

注入的內(nèi)容將是有關(guān)聯(lián)的目標(biāo)元素的子元素,但它會(huì)被置于這個(gè)元素的任何內(nèi)容的“前”或“后”。

為了證明這一點(diǎn),看看下面的代碼。首先,在HTML:
 

XML/HTML Code復(fù)制內(nèi)容到剪貼板
  1. <p class="box">Other content.</p>  

下面是插入偽元素的css:
 

CSS Code復(fù)制內(nèi)容到剪貼板
  1. p.box {   
  2.   width300px;   
  3.   bordersolid 1px white;   
  4.   padding20px;   
  5. }   
  6.     
  7. p.box:before {   
  8.   content"#";   
  9.   bordersolid 1px white;   
  10.   padding2px;   
  11.   margin: 0 10px 0 0;   
  12. }  

在此html里,你所看的一段文字帶有的是一個(gè)類的box,還有這樣的文字“Other content”在里面(像你所會(huì)看到的一樣,如果你看見(jiàn)了首頁(yè)的源代碼)。在css中,這段內(nèi)容被設(shè)置了寬度,以及一些padding和可見(jiàn)的邊框

然后我們有了偽元素。在這個(gè)例子中,它是一個(gè)散列符號(hào)插入到該段內(nèi)容之前。隨后css給了它一個(gè)邊框以及一些padding和margins。

這里是瀏覽器中查看的結(jié)果:
2015527152119859.jpg (500×175)

外面的盒子是這個(gè)段落。圍繞有散列符號(hào)的邊框表示偽元素的邊界。所以,不是插入“before”到段落,而是偽元素被置于到此段落的“Other content”的前面。
插入非文本內(nèi)容

我簡(jiǎn)要的提醒,你可以把屬性的值置為空字符串或是插入文本內(nèi)容。你基本上有屬性的值要包含什么的兩個(gè)額外的選擇

首先,你可以包含一個(gè)指向一個(gè)圖像的URL,就像在css里包含一個(gè)背景圖像一樣做你能做的
 

CSS Code復(fù)制內(nèi)容到剪貼板
  1. p:before {   
  2.   contenturl(image.jpg);   
  3. }  

注意不能使用引號(hào)。如果你將URL用引號(hào)括起來(lái),那么它會(huì)變成一個(gè)字符串和插入文本“url(image.jpg)”作為其內(nèi)容,插入的而不是圖像本身。

當(dāng)然,你可以包含一個(gè)Data URI代替圖像引用,正如你可以用css背景一樣。

你還可以選擇ATRR(X)中的函數(shù)的形式。此功能,根據(jù)規(guī)范?,“把X屬性的值以字符串的形式返回”

下面是一個(gè)例子:
 

CSS Code復(fù)制內(nèi)容到剪貼板
  1. a:after {   
  2.   contentattr(href);   
  3. }  

attr()函數(shù)的功能是什么?它得到特定屬性的值并把它作為插入的文本成為一個(gè)偽元素。

上面的代碼會(huì)導(dǎo)致頁(yè)面上的每一個(gè)<a>元素的href值立即被放置在每個(gè)各自的<a>元素的后面。在文檔被打印時(shí),它可以用作一個(gè)包含所有URl的打印樣式表。

你也可以用這個(gè)函數(shù)去獲取元素的title屬性,或者甚至是microdata的值。當(dāng)然,并不是所有的例子都符合自己的實(shí)際,但根據(jù)不同的情況,一個(gè)特定的屬性值作為一個(gè)偽元素可以是實(shí)際的

然而,獲取title或者圖像的alt的值并作為實(shí)際的偽元素顯示在頁(yè)面上是不可能的。記住偽元素必須是被應(yīng)用元素的子元素。圖像,這是void(或者是空元素),沒(méi)有子元素,所以它在這個(gè)列子中不可用,同樣也適用于其他空元素,例如:<input>。
可怕的瀏覽器兼容性

任何前端技術(shù)的發(fā)展勢(shì)頭,第一個(gè)問(wèn)題就是瀏覽器的支持。在這種情況之下,它不是個(gè)很大的問(wèn)題。

瀏覽器支持:before 和 :after 偽元素棧,像這樣:

  •     Chrome 2+,
        Firefox 3.5+ (3.0 had partial support),
        Safari 1.3+,
        Opera 9.2+,
        IE8+ (with some minor bugs),
        幾乎所有的移動(dòng)瀏覽器。

唯一真正的問(wèn)題是沒(méi)有獲得支持的(不用奇怪)IE6和IE7。所以,如果你的愛(ài)好者是在良好合適的web開(kāi)發(fā)(或者其他具有較低IE版本的市場(chǎng)),你可以繼續(xù)自由地使用偽元素。
偽元素不是決定性的

幸運(yùn)的是,缺少偽元素不會(huì)造成大問(wèn)題。大多數(shù)情況下,偽元素一般修飾(或者幫助)內(nèi)容,不會(huì)給不支持的瀏覽器造成問(wèn)題。所以,如果你的支持者具有較高的IE版本,你仍然可以在某種程度上使用它們。
一些提醒

正如前面提到的,偽元素不會(huì)出現(xiàn)在DOM中。這些元素不是真正的元素。因此,它們不是可用的。所以,不要使用偽元素生成內(nèi)容,是您的網(wǎng)頁(yè)的可用性和可訪問(wèn)性的關(guān)鍵。

另外一件需要記住的是,開(kāi)發(fā)工具,例如火狐,不要用偽元素顯示內(nèi)容。所以,如果使用了,偽元素會(huì)造成難以維護(hù)和調(diào)試緩慢。

(更新:在評(píng)論中提到的,你可以使用谷歌的開(kāi)發(fā)工具來(lái)查看一個(gè)偽元素相關(guān)聯(lián)的風(fēng)格,但不會(huì)出現(xiàn)在DOM元素里。同時(shí),火狐在1.8版加入偽元素支持它。)

你所需要用有的理念是用這個(gè)技術(shù)以創(chuàng)造出實(shí)用的東西。與此同時(shí),將來(lái)進(jìn)一步研究CSS偽元素,一定要看看我們已經(jīng)鏈接的一些文章。

譯者手語(yǔ):整個(gè)翻譯依照原文線路進(jìn)行,并在翻譯過(guò)程略加了個(gè)人對(duì)技術(shù)的理解。如果翻譯有不對(duì)之處,還煩請(qǐng)同行朋友指點(diǎn)。謝謝!

相關(guān)文章

最新評(píng)論