Come combinare classe e ID nel selettore CSS?


221

Se ho il seguente div:

<div class="sectionA" id="content">
    Lorem Ipsum...
</div>

C'è un modo per definire uno stile che esprima l'idea "Un div con id='content'AND class='myClass'"?

Oppure devi semplicemente andare in un modo o nell'altro come in

<div class="content-sectionA">
    Lorem Ipsum...
</div>

O

<div id="content-sectionA">
    Lorem Ipsum...
</div>

2
se hai intenzione di selezionare per ID, non è necessario selezionare anche per classe, perché l'id è univoco, quindi solo un elemento corrisponderà. Quindi aggiungendo la classe allo stesso selettore è solo una digitazione extra
TStamper,

21
@TStamper: non necessariamente. Stai pensando solo in termini di documenti statici. Caso in questione, potresti avere img#Inboxun'icona sulla tua pagina che è normalmente impostata su un'opacità del 50%. Tuttavia, quando l'utente ha un messaggio, si desidera che sia impostato al 100% di opacità e il backend lo indica aggiungendo una activeclasse all'elemento. In tale scenario, ha senso disporre di un selettore che combina ID e nome classe.
Lèse majesté,

@TStamper: Inoltre, avere il selettore combo classe id + più specifico non dà più peso / precedenza rispetto alla sola versione id? AFAIK, dovrebbe. (IOW, le regole del selettore di combo classe id + sovrascriveranno le regole del selettore di combo id. (Questa era la mia ragione / necessità di trovare questo thread proprio ora.)
govinda

Quindi, sto avendo una situazione simile. Ho ad esempio molti prodotti con descrizioni ma vorrei anche un controllo specifico sui singoli prodotti, quindi posso fare: code<p id = Product_1 class = Product> Product 1 </p> <p id = Product_2 class = Product> Product 2 </p> code Questo per consentire uno stile generale di tutti i prodotti ma anche uno stile individuale per prodotti specifici?
Tamer Ziady,

Risposte:


328

Nel tuo foglio di stile:

div#content.myClass

Modifica: anche questi potrebbero aiutare:

div#content.myClass.aSecondClass.aThirdClass /* Won't work in IE6, but valid */
div.firstClass.secondClass /* ditto */

e, per il tuo esempio:

div#content.sectionA

Modifica, 4 anni dopo: dato che è super vecchio e la gente continua a trovarlo: non usare i tagNames nei selettori. #content.myClassè più veloce di div#content.myClassperché tagName aggiunge un passaggio di filtro non necessario. Usa tagNames nei selettori solo dove devi!


31
Specificare che l'ID appartiene a un div può essere dannoso solo per le prestazioni di rendering (anche se praticamente trascurabile) senza alcun vantaggio in quanto un ID è già univoco. Preferirei invece # content.myClass per renderlo pulito.
mystrdat,

3
div.class#iddovrebbe essere equivalente sebbene meno raccomandato; utilizzare prima parti più uniche del selettore.
SF.

1
Bene grazie per il tuo impegno, anche dopo anni :). Aiutando ancora ragazzi come me. L'ho appena usato per il mio progetto. Voto sicuro.
C4d,

76

Ci sono differenze tra #header .calloute #header.calloutin css.

Ecco il "semplice inglese" di #header .callout:
Seleziona tutti gli elementi con il nome della classe calloutche sono discendenti dell'elemento con un ID di header.

E #header.calloutsignifica:
selezionare l'elemento che ha un ID di headere anche un nome di classe di callout.

Puoi leggere di più qui trucchi css


Ho fatto questo errore con gli spazi bianchi: #id .class vs # id.class
ERJAN

5

Non c'è niente di sbagliato nel combinare un id e una classe su un elemento, ma non dovresti identificarlo con entrambi per una regola. Se vuoi davvero puoi fare:

#content.sectionA{some rules}

Non è necessario il divdavanti all'ID come altri hanno suggerito.

In generale, le regole CSS specifiche per quell'elemento dovrebbero essere impostate con l'ID e quelle avranno un peso maggiore rispetto a quelle della sola classe. Le regole specificate dalla classe sarebbero proprietà che si applicano a più elementi che non si desidera modificare in più punti ogni volta che è necessario modificare.

Questo si riduce a questo:

 .sectionA{some general rules here}
 #content{specific rules, and overrides for things in .sectionA}

Ha senso?


4

Bene, generalmente non dovresti aver bisogno di classificare un elemento specificato da id, perché id è sempre univoco, ma se davvero è necessario, dovrebbe funzionare quanto segue:

div#content.sectionA {
    /* ... */
}

1

È possibile combinare ID e classe nei CSS, ma gli ID devono essere univoci, quindi l'aggiunta di una classe a un selettore CSS lo qualificherebbe eccessivamente.


È un buon punto. Sto pensando se forse hai una serie di classi molto generali (impostazione di cose come float, altezza / larghezza, forse cose come font) e ti piacerebbe scavalcare qualcosa in esse in questa eccezione unica?
Aj

5
A meno che tu non usi lo stesso foglio di stile con pagine diverse. :-)
Patrick McElhaney il

5
Un altro esempio: quando le classi vengono aggiunte in modo dinamico con Javascript (# optionalFields.enabled)
Patrick McElhaney,

Anche se usi lo stesso foglio di stile con pagine diverse, sarebbe davvero meglio mettere una classe sul corpo o avere uno stile per l'ID e quindi separare le definizioni di classe per le classi con gli stili di sostituzione appropriati.
Eric Wendelin,

Sì, penso che sia abbastanza comune farlo. es. li # SomeTab.state-selected
Yablargo,


0

Si suppone che gli ID siano univoci a livello di documento, quindi non è necessario selezionare in base a entrambi. Tuttavia, puoi assegnare un elemento a più classiclass="class1 class2"


1
La classe può cambiare. Ad esempio, puoi avere div # id.active e div # id.inactive.
Daniel Moura,

abbastanza equo, vieni a pensarci bene, ho usato questa funzionalità, ma ho frainteso quale fosse il comportamento desiderato.
Ben Hughes,

0

Penso che ti sbagli tutti. ID contro classe non è una questione di specificità; hanno usi logici completamente diversi.

Gli ID devono essere utilizzati per identificare parti specifiche di una pagina: intestazione, barra di navigazione, articolo principale, attribuzione dell'autore, piè di pagina.

Le classi devono essere utilizzate per applicare gli stili alla pagina. Supponiamo che tu abbia un sito di una rivista generale. Ogni pagina del sito avrà gli stessi elementi: intestazione, navigazione, articolo principale, barra laterale, piè di pagina. Ma la tua rivista ha diverse sezioni: economia, sport, divertimento. Volete che le tre sezioni abbiano un aspetto diverso: economia conservatrice e quadrata, sport d'azione, intrattenimento luminoso e giovane.

Usi le classi per questo. Non devi creare più ID: #economics-article e # sports-article e # entertainment-article. Non ha senso. Piuttosto, definiresti tre classi, .economics, sports e .entertainment, quindi definiresti gli ID #nav, #article e #footer per ciascuno.


Puoi effettivamente utilizzare tag HTML semantici invece di ID per la maggior parte degli elementi citati. I tag header, footer, nav, section ecc. Esistono per un motivo.
Walter Schwarz,

Ma in effetti dovresti usare gli ID solo per elementi che dovrebbero essere unici, singoli. Ma anche in questo caso è davvero utile se devi accedere a quell'elemento tramite JavaScript, perché l'uso degli ID rende il tuo CSS troppo specifico e difficile da unire successivamente con altri CSS e / o HTML. C'è anche l'argomento che gli ID sono più veloci delle classi, ma la differenza è davvero trascurabile.
Walter Schwarz,

-1
.sectionA[id='content'] { color : red; }

Non funzionerà quando il tipo di documento è HTML 4.01 però ...

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.