In CSS2.1, un elemento può avere al massimo uno qualsiasi tipo di pseudo-elemento in qualsiasi momento. (Questo significa che un elemento può avere sia un un pseudo-elemento :before
e :after
-. Semplicemente non può avere più di uno di ogni tipo)
Di conseguenza, quando si dispone di più :before
regole di corrispondenza dello stesso elemento, lo faranno tutto in cascata e si applica a un singolo pseudoelemento :before
, come con un elemento normale. Nel tuo esempio, il risultato finale è simile al seguente:
.circle.now:before {
content: "Now";
font-size: 19px;
color: black;
}
Come si può vedere, solo la dichiarazione content
che ha precedenza più alta (come detto, quello che arriva ultimo) avrà effetto - il resto delle dichiarazioni vengono scartati, come nel caso di qualsiasi altra proprietà CSS.
Questo comportamento è descritto nel Selectors section of CSS2.1:
pseudo-elementi si comportano proprio come elementi reali nei CSS con le eccezioni di seguito descritte e elsewhere.
Ciò implica che i selettori con gli pseudo-elementi funzionano proprio come i selettori per elementi normali. Significa anche che la cascata dovrebbe funzionare nello stesso modo. Stranamente, CSS2.1 sembra essere l'unico riferimento; né lo css3-selectors né lo css3-cascade ne parlano affatto, e resta da vedere se verrà chiarito in una specifica futura.
Se un elemento può corrispondere a più di un selettore con lo stesso pseudo-elemento e si desidera che tutti vengano applicati in qualche modo, sarà necessario creare regole CSS aggiuntive con selettori combinati in modo da poter specificare esattamente cosa il browser dovrebbe fare in quei casi. Non riesco a fornire un esempio completo, inclusa la proprietà content
, poiché non è chiaro ad esempio se il simbolo o il testo debbano venire prima. Ma il selettore di cui hai bisogno per questa regola combinata è .circle.now:before
o .now.circle:before
- qualsiasi selettore tu scelga è una preferenza personale in quanto entrambi i selettori sono equivalenti, è solo il valore della proprietà content
che dovrai definire tu.
Se è ancora necessario un esempio concreto, vedere la risposta a this similar question.
The legacy css3-content specification contains a section on inserting multiple ::before
and ::after
pseudo-elements utilizzando una notazione compatibile con la cascata CSS2.1, ma si noti che quel particolare documento è obsoleto - non è stato aggiornato dal 2003 e nessuno ha implementato quella funzionalità negli ultimi dieci anni. La buona notizia è che il documento abbandonato è attivamente sottoposto a una riscrittura nelle vesti di css-content-3 e css-pseudo-4. La cattiva notizia è che la caratteristica multipla degli pseudo-elementi non si trova in nessuna delle due specifiche, presumibilmente dovendo, ancora una volta, alla mancanza di interesse per l'implementatore.
Nel caso specifico, se un elemento appartiene ad entrambi classe 'circle' e alla classe' now', entrambe le regole si applicano all'elemento del ': prima 'pseudo-elemento, ma il normale CSS implica che solo una delle impostazioni del' contenuto' può avere effetto (secondo le normali regole a cascata). Il punto è che il 'contenuto' non si accumula. –
Risulta [questa domanda] (http://stackoverflow.com/questions/14111751/what-happens-if-multiple-classes-of-the-same-element-define-a-before-pseudo-ele) che I risposto diversi mesi dopo è un duplicato di questo. Da allora ho fuso la maggior parte delle informazioni dall'altra risposta, che sostanzialmente si espande su tutto ciò che ha detto @Jukka in precedenza, in quanto sta ottenendo molto più traffico, oltre a venire prima. – BoltClock
Dopo 13 anni, la bozza di css-content-3 è stata finalmente [aggiornata] (https://www.w3.org/TR/2016/WD-css-content-3-20160602##changes). La sezione pseudo-elementi è stata definitivamente rimossa a favore di css-pseudo-4, che non consente più pseudo-elementi ':: before' né' :: after'. – Oriol