2012-08-17 98 views
73

是否有可能有多個:before假同一個元素?我可以有多個:在相同元素的僞元素之前?

.circle:before { 
    content: "\25CF"; 
    font-size: 19px; 
} 
.now:before{ 
    content: "Now"; 
    font-size: 19px; 
    color: black; 
} 

我想上面的樣式應用到使用jQuery相同的元素,但只有最近的一個應用,從來沒有他們兩個。

回答

69

在CSS2.1中,元素在任何時候最多隻能有一種僞元素。 (這意味着一個元素可以同時擁有一個:before:after僞元素 - 它只是不能有各種不止一個)

其結果是,當你有多個:before規則匹配相同的元素,他們將所有級聯並適用於單個:before僞元素,與正常元素一樣。在你的榜樣,最終的結果是這樣的:

.circle.now:before { 
    content: "Now"; 
    font-size: 19px; 
    color: black; 
} 

正如你所看到的,只有具有最高優先級的content聲明(如提到的,是最後一個)將生效 - 該聲明的其餘部分被丟棄,就像任何其他CSS屬性一樣。

這種行爲在Selectors section of CSS2.1描述:

與下述不同僞元素的表現就像在CSS現實元素和elsewhere.

這意味着,與僞元素選擇工作就像正常元素的選擇器一樣。這也意味着級聯應該以相同的方式工作。奇怪的是,CSS2.1似乎是唯一的參考; css3-selectorscss3-cascade都沒有提到這一點,它是否會在未來的規範中得到澄清還有待觀察。

如果一個元素可以使用相同的僞元素匹配多個選擇器,並且希望以某種方式應用所有這些選擇器,則需要使用組合選擇器創建額外的CSS規則,以便您可以精確指定瀏覽器應該在這些情況下做。我無法提供一個完整的示例,其中包括content屬性,因爲不清楚符號或文本是否應該優先。但是,您需要用於此組合規則的選擇器是.circle.now:before.now.circle:before--無論選擇哪個選擇器都是個人偏好,因爲兩個選擇器都是等效的,它只是您需要自定義的content屬性的值。

如果您仍然需要一個具體的例子,請參閱我對this similar question的回答。

The legacy css3-content specification contains a section on inserting multiple ::before and ::after pseudo-elements使用與CSS2.1級聯兼容的符號,但請注意,該特定文檔已過時 - 自2003年以來尚未更新,並且過去十年中沒有人實現過該功能。好消息是,廢棄文檔正在積極進行重寫,編號爲css-content-3css-pseudo-4。壞消息是,在任一規範中都沒有找到多個僞元素特徵,這可能是由於缺乏實施者的興趣所致。

+11

在給定的情況下,如果一個元素同時屬於類'circle'和類'now',兩個規則適用於元素的':前'僞元素,但普通的CSS意味着只有一個'content'設置可以生效(通過正常的級聯規則)。關鍵是「內容」不會累積。 – 2012-08-17 09:47:25

+0

原來[這個問題](http://stackoverflow.com/questions/14111751/what-happens-if-multiple-classes-of-the-same-element-define-a-before-pseudo-ele)那我幾個月後回答是這一個的重複。我自此合併了大部分來自其他答案的信息,這些答案基本上擴展了@Jukka上面所說的所有內容,因爲它正在獲得更多的流量,而且是首先出現的。 – BoltClock 2015-03-05 15:37:13

+0

13年後,css-content-3草案終於[已更新](https://www.w3.org/TR/2016/WD-css-content-3-20160602/#changes)。僞元素部分肯定已被刪除,以支持css-pseudo-4,它不允許多個':: before'和':: after'僞元素。 – Oriol 2016-06-05 18:18:56

15

如果你的主要元素有一些子元素或文本,你可以使用它。

定位你的主要元素相對(或絕對/固定),並使用兩個:之前和:之後定位絕對(在我的情況它必須是絕對的,不知道你的)。

現在,如果您想要一個僞元素,請將一個絕對:before附加到其中一個主元素的子元素(如果您只有文本,將其放在一個跨度中,現在您有一個元素),這不是相對的/絕對/固定。

此元素將開始行爲,就像他的主人是您的主要元素。

HTML

<div class="circle"> 
    <span>Some text</span> 
</div> 

CSS

.circle { 
    position: relative; /* or absolute/fixed */ 
} 

.circle:before { 
    position: absolute; 
    content: ""; 
    /* more styles: width, height, etc */ 
} 

.circle:after { 
    position: absolute; 
    content: ""; 
    /* more styles: width, height, etc */ 
} 

.circle span { 
    /* not relative/absolute/fixed */ 
} 

.circle span:before { 
    position: absolute; 
    content: ""; 
    /* more styles: width, height, etc */ 
} 
+0

雖然選定的答案是準確的,但這是一個可行的解決我的情況。我能夠模擬具有多個psuedo元素,而無需向DOM添加更多節點! – 2017-12-12 21:47:40

+0

@ matt.kauffman23那麼,請問你是怎麼模擬的? – BbIKTOP 2018-02-07 07:28:27

+0

@BbIKTOP抱歉,剛剛看到您的評論。在我的情況下,我正在研究一個總是有孩子的模式,所以我最終得到了如下結果:'.modal:first-child:before {...' – 2018-03-05 23:22:26

相關問題