Selettore CSS3: primo di tipo con nome di classe?


230

È possibile utilizzare il selettore CSS3 :first-of-typeper selezionare il primo elemento con un determinato nome di classe? Non ho avuto successo con il mio test, quindi sto pensando che non lo sia?

Il codice ( http://jsfiddle.net/YWY4L/ ):

p:first-of-type {color:blue}
p.myclass1:first-of-type {color:red}
.myclass2:first-of-type {color:green}
<div>
  <div>This text should appear as normal</div>
  <p>This text should be blue.</p>
  <p class="myclass1">This text should appear red.</p>
  <p class="myclass2">This text should appear green.</p>
</div>

Risposte:


336

No, non è possibile utilizzare un solo selettore. La :first-of-typepseudo-classe seleziona il primo elemento del suo tipo ( div, pecc). Usare un selettore di classe (o un selettore di tipo) con quella pseudo-classe significa selezionare un elemento se ha la classe data (o è del tipo dato) ed è il primo del suo tipo tra i suoi fratelli.

Sfortunatamente, CSS non fornisce un :first-of-classselettore che sceglie solo la prima occorrenza di una classe. Per ovviare al problema, puoi usare qualcosa del genere:

.myclass1 { color: red; }
.myclass1 ~ .myclass1 { color: /* default, or inherited from parent div */; }

Spiegazioni e illustrazioni per la soluzione alternativa sono fornite qui e qui .


7
No @justNik questo funziona per più elementi. Il .myclass1selettore selezionerebbe ogni elemento di .myclass1. Il selettore .myclass1 ~ .myclass1utilizza il combinatore di pari livello generale per selezionare ogni elemento con la classe .myclass1che è il seguente fratello di un elemento con una classe di .myclass1. Questo è spiegato in modo straordinario qui .
— WebWanderer,

ottima soluzione! ha funzionato bene per l'implementazione di scroll-spy usando l'osservatore di intersezione, in cui alcune sezioni potrebbero essere entrambe visibili sulla pagina, ma vogliamo disegnare in grassetto solo il primo attivo.
— zavr

45

La bozza Selettori CSS livello 4 propone di aggiungere una of <other-selector>grammatica all'interno del :nth-childselettore . Ciò consentirebbe di scegliere il n ° figlio che corrispondono a un determinato altro selettore:

:nth-child(1 of p.myclass) 

Le bozze precedenti utilizzavano una nuova pseudo-classe, :nth-match()quindi potresti vedere quella sintassi in alcune discussioni sulla funzione:

:nth-match(1 of p.myclass)

Questo è stato ora implementato in WebKit ed è quindi disponibile in Safari, ma sembra essere l'unico browser che lo supporta . Ci sono biglietti archiviati per implementarlo Blink (Chrome) , Gecko (Firefox) e una richiesta per implementarlo in Edge , ma nessun progresso apparente su nessuno di questi.


102
Solo 10 anni e posso usarlo. Anche se il progetto che userei questo deve essere fatto domani.
— Lajos Meszaros,

1
: nth-match () è stato abbandonato a favore di nuove funzionalità per nth-child (), che non sono ancora ben supportate: caniuse.com/#feat=css-nth-child-of
— nabrown,

@ nabrown78 Grazie per l'heads-up, aggiornata la risposta per essere attuale.
— Brian Campbell,

19

Ciò non è possibile utilizzare il selettore CSS3 : first-of-type per selezionare il primo elemento con un determinato nome di classe.

Tuttavia, se l'elemento target ha un fratello di elemento precedente, è possibile combinare la pseudo-classe CSS di negazione e i selettori di fratello adiacente per abbinare un elemento che non ha immediatamente un elemento precedente con lo stesso nome di classe:

:not(.myclass1) + .myclass1

Esempio di codice di lavoro completo:

p:first-of-type {color:blue}
p:not(.myclass1) + .myclass1 { color: red }
p:not(.myclass2) + .myclass2 { color: green }
<div>
  <div>This text should appear as normal</div>
  <p>This text should be blue.</p>
  <p class="myclass1">This text should appear red.</p>
  <p class="myclass2">This text should appear green.</p>
</div>


9

Ho trovato una soluzione per il tuo riferimento. da alcuni div di gruppo selezionare dal gruppo di due div della stessa classe il primo

p[class*="myclass"]:not(:last-of-type) {color:red}
p[class*="myclass"]:last-of-type {color:green}

A proposito, non so perché funzioni :last-of-type, ma :first-of-typenon funziona.

I miei esperimenti su jsfiddle ... https://jsfiddle.net/aspanoz/m1sg4496/


Questo non funziona come richiesto, come si può già vedere dal violino. L'unica cosa che fa, non è selezionare l'ultimo div se non ha la classe.
— Marten Koetsier,

6

Questo è un vecchio thread, ma sto rispondendo perché appare ancora in alto nell'elenco dei risultati di ricerca. Ora che il futuro è arrivato, puoi usare lo pseudo-selettore: nth-child.

p:nth-child(1) { color: blue; }
p.myclass1:nth-child(1) { color: red; }
p.myclass2:nth-child(1) { color: green; }

Lo pseudo-selettore: nth-child è potente: le parentesi accettano sia le formule che i numeri.

Altro qui: https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-child


6
Sì, non penso che funzioni
— Adam Youngers

2
Cosa intendi con "ora che il futuro è arrivato"? Funziona solo in Safari al momento della scrittura.
— Alejandro García Iglesias,

4

Come soluzione di fallback, puoi avvolgere le tue classi in un elemento padre come questo:

<div>
    <div>This text should appear as normal</div>
    <p>This text should be blue.</p>
    <div>
        <!-- first-child / first-of-type starts from here -->
        <p class="myclass1">This text should appear red.</p>
        <p class="myclass2">This text should appear green.</p>
    </div>
</div>

1

Non sono sicuro di come spiegarlo, ma mi sono imbattuto in qualcosa di simile oggi. Non essere in grado di impostare .user:first-of-type{}mentre .user:last-of-type{}funzionava bene. Questo è stato risolto dopo che li ho avvolti in un div senza alcuna classe o stile:

https://codepen.io/adrianTNT/pen/WgEpbE

<style>
.user{
  display:block;
  background-color:#FFCC00;
}

.user:first-of-type{
  background-color:#FF0000;
}
</style>

<p>Not working while this P additional tag exists</p>

<p class="user">A</p>
<p class="user">B</p>
<p class="user">C</p>

<p>Working while inside a div:</p>

<div>
<p class="user">A</p>
<p class="user">B</p>
<p class="user">C</p>
</div>

0

Puoi farlo selezionando ogni elemento della classe che è il fratello della stessa classe e invertendolo, che selezionerà praticamente ogni elemento sulla pagina, quindi dovrai selezionare nuovamente dalla classe.

per esempio:

<style>
    :not(.bar ~ .bar).bar {
        color: red;
    }
<div>
    <div class="foo"></div>
    <div class="bar"></div> <!-- Only this will be selected -->
    <div class="foo"></div>
    <div class="bar"></div>
    <div class="foo"></div>
    <div class="bar"></div>
</div>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.