Quali caratteri sono validi nei nomi / selettori di classi CSS?


1203

Quali caratteri / simboli sono ammessi nei selettori di classe CSS ?
So che i seguenti caratteri non sono validi , ma quali caratteri sono validi ?

~ ! @ $ % ^ & * ( ) + = , . / ' ; : " ? > < [ ] \ { } | ` #


32
che dire di utf8 personaggi? Come se
potessi

9
I caratteri speciali possono essere utilizzati in nomi di classi da loro fuga - nel file CSS è possibile definire una .hello/worldclasse sfuggire alla barra rovesciata: .hello\2fworld, hello\2f worldohello\/world
wyqydsyq

1
Un'altra domanda correlata, non sulla "sintassi dei nomi", ma sulla "sintassi dell'attributo di classe" quando si esprimono più nomi .
Peter Krauss,

Risposte:


1024

Puoi controllare direttamente nella grammatica CSS .

Fondamentalmente 1 , un nome deve iniziare con un trattino basso ( _), un trattino ( -) o una lettera ( a- z), seguito da un numero qualsiasi di trattini, caratteri di sottolineatura, lettere o numeri. C'è un problema: se il primo carattere è un trattino, il secondo personaggio deve 2 essere una lettera o di sottolineatura e il nome deve essere di almeno 2 caratteri.

-?[_a-zA-Z]+[_a-zA-Z0-9-]*

In breve, la regola precedente si traduce in quella seguente, estratta dalle specifiche del W3C. :

Nel CSS, gli identificatori (inclusi nomi di elementi, classi e ID nei selettori) possono contenere solo i caratteri [a-z0-9] e ISO 10646 caratteri U + 00A1 e versioni successive, più il trattino (-) e il trattino basso (_) ; non possono iniziare con una cifra o un trattino seguito da una cifra. Gli identificatori possono anche contenere caratteri di escape e qualsiasi carattere ISO 10646 come codice numerico (vedere l'elemento successivo). Ad esempio, l'identificatore "B&W?" può essere scritto come "B \ & W \?" o "B \ 26 W \ 3F".

Gli identificatori che iniziano con un trattino o un trattino basso sono in genere riservati alle estensioni specifiche del browser, come in -moz-opacity.

1 Tutto è reso un po 'più complicato dall'inclusione di caratteri unicode sfuggiti (che nessuno usa davvero).

2 Si noti che, secondo la grammatica che ho collegato, una regola che inizia con DUE trattini, ad esempio --indent1, non è valida. Tuttavia, sono abbastanza sicuro di averlo visto in pratica.


57
NB: Il W3C afferma che l'uso di un '-' o '_' dovrebbe essere riservato alle estensioni CSS specifiche del fornitore (ad esempio, le classi -moz * implementate dai browser Mozilla).
mipadi,

3
I \ -escapes sono comunemente usati, ma generalmente principalmente per scopi di hacking CSS, isolando i browser che non li supportano.
bobince

5
Per aggiornare il commento di @Pim Jager più di due anni dopo, secondo w3counter.com/globalstats.php IE6 è ora utilizzato da meno del 3% degli utenti, dietro IE9 il 4%, IE7 il 9%, IE8 il 22%. Tutte le versioni di Firefox hanno il 28%, tutte le versioni di Chrome hanno il 17%.
Daniel Earwicker,

3
So che questa è una vecchia risposta, ma CSS (almeno 2+) consente qualsiasi carattere {Non ASCII} negli identificatori.
user2864740

11
In CSS, identifiers (including element names, classes, and IDs in selectors) can contain only the characters [a-zA-Z0-9] and ISO 10646 characters U+00A0 and higher, plus the hyphen (-) and the underscore (_); they cannot start with a digit, two hyphens, or a hyphen followed by a digit. Identifiers can also contain escaped characters and any ISO 10646 character as a numeric code (see next item). For instance, the identifier "B&W?" may be written as "B\&W\?" or "B\26 W\3F". Quindi - --indent1non è valido e deve essere salvato come \--indent1(le --lezioni si rompono su iOS, ad esempio)
avuto inizio il

177

Con mia sorpresa, la maggior parte delle risposte qui sono sbagliate. Si scopre che:

Qualsiasi carattere tranne NUL è consentito nei nomi di classe CSS in CSS. (Se CSS contiene NUL (con escape o no), il risultato non è definito. [ Caratteri CSS ])

La risposta di Mathias Bynens si collega a spiegazioni e dimostrazioni che mostrano come utilizzare questi nomi. Scritto nel codice CSS, potrebbe essere necessario scappare un nome di classe , ma ciò non cambia il nome della classe. Ad esempio, una rappresentazione inutilmente sovrascritta apparirà diversa dalle altre rappresentazioni con quel nome, ma si riferisce comunque allo stesso nome di classe.

La maggior parte degli altri linguaggi (di programmazione) non ha quel concetto di escape di nomi di variabili ("identificatori"), quindi tutte le rappresentazioni di una variabile devono avere lo stesso aspetto. Questo non è il caso dei CSS.

Si noti che in HTML non è possibile includere caratteri di spazio (spazio, tabulazione, avanzamento riga, avanzamento modulo e ritorno a capo) in un attributo nome classe , poiché già separano le classi l'una dall'altra.

Quindi, se hai bisogno di trasformare una stringa casuale in un nome di classe CSS: prenditi cura di NUL e spazio, e scappa (di conseguenza per CSS o HTML). Fatto.


7
La prima riga della tua risposta dovrebbe essere "la maggior parte delle risposte qui sono obsolete / si applicano solo a CSS2".
Salman A

7
@SalmanA Le risposte a cui mi riferisco erano sbagliate dall'inizio. Non si applicano a CSS2.1, CSS2 né CSS1.
Robert Siemer,

@RobertSiemer buon punto, ho spostato il mio commento su stackoverflow.com/questions/50812118/… (che non è mai meno correlato a questo argomento)
Peter T.


71

Ho risposto alla tua domanda in modo approfondito qui: http://mathiasbynens.be/notes/css-escapes

L'articolo spiega anche come sfuggire a qualsiasi personaggio in CSS (e JavaScript) e ho creato uno strumento utile anche per questo. Da quella pagina:

Se dovessi dare a un elemento un valore ID di ~!@$%^&*()_+-=,./';:"?><[]{}|`#, il selettore sarebbe simile al seguente:

CSS:

<style>
  #\~\!\@\$\%\^\&\*\(\)\_\+-\=\,\.\/\'\;\:\"\?\>\<\[\]\\\{\}\|\`\#
  {
    background: hotpink;
  }
</style>

JavaScript:

<script>
  // document.getElementById or similar
  document.getElementById('~!@$%^&*()_+-=,./\';:"?><[]\\{}|`#');
  // document.querySelector or similar
  $('#\\~\\!\\@\\$\\%\\^\\&\\*\\(\\)\\_\\+-\\=\\,\\.\\/\\\'\\;\\:\\"\\?\\>\\<\\[\\]\\\\\\{\\}\\|\\`\\#');
</script>

4
@Darryl Ovviamente, questo è un esempio piuttosto estremo, ma cose del genere class="404-error"possono essere utili.
Mathias Bynens,

ho un esempio: converto l'output di un sistema che evidenzia la sintassi in CSS. ha nomi di classe come "ISO C ++: Tipi ( _t / _type)". se sostituisco solo gli spazi bianchi ho nomi di classe validi.
pecore volanti

Sul tuo sito web, dici che il carattere spaziale può essere evitato con la barra rovesciata. Quando lo provo con un nome di classe, non riesco a farlo funzionare. Ho notato che non c'è spazio in questo esempio. È possibile?
Adamarla,

@Adamarla <p class="foo bar">aggiunge due classi pall'elemento :, fooe bar. Non c'è modo (che mi viene in mente) di aggiungere un nome di classe contenente spazi bianchi a un elemento HTML. Le informazioni su come sfuggire ai caratteri degli spazi bianchi sono state incluse perché è utile sfuggire a tali caratteri in altri contesti di identificatori, ad esempio i nomi delle famiglie di caratteri.
Mathias Bynens,

3
Come per la maggior parte delle cose nella vita, sembra che nei CSS ci sia una differenza tra "tecnicamente legale all'estremo" e "sano".
Volksman,

69

Leggi le specifiche del W3C . (questo è CSS 2.1, trova la versione appropriata per la tua assunzione di browser)

modifica: segue il paragrafo pertinente:

Nel CSS, gli identificatori (inclusi nomi di elementi, classi e ID nei selettori) possono contenere solo i caratteri [a-z0-9] e ISO 10646 caratteri U + 00A1 e versioni successive, più il trattino (-) e il trattino basso (_) ; non possono iniziare con una cifra o un trattino seguito da una cifra. Gli identificatori possono anche contenere caratteri di escape e qualsiasi carattere ISO 10646 come codice numerico (vedere l'elemento successivo). Ad esempio, l'identificatore "B&W?" può essere scritto come "B \ & W \?" o "B \ 26 W \ 3F".

modifica 2: come sottolinea @mipadi nella risposta di Triptych, c'è questo avvertimento , anche nella stessa pagina web:

Nel CSS, gli identificatori possono iniziare con '-' (trattino) o '_' (trattino basso). Le parole chiave e i nomi delle proprietà che iniziano con '-' o '_' sono riservati per le estensioni specifiche del fornitore. Tali estensioni specifiche del fornitore dovrebbero avere uno dei seguenti formati:

'-' + vendor identifier + '-' + meaningful name 
'_' + vendor identifier + '-' + meaningful name

Esempio (s):

Ad esempio, se l'organizzazione XYZ ha aggiunto una proprietà per descrivere il colore del bordo sul lato est del display, potrebbe chiamarlo -xyz-border-east-color.

Altri esempi noti:

 -moz-box-sizing
 -moz-border-radius
 -wap-accesskey

Un trattino iniziale o un trattino di sottolineatura iniziale è garantito per non essere mai usato in una proprietà o parola chiave da alcun livello attuale o futuro di CSS. Pertanto, le implementazioni CSS tipiche potrebbero non riconoscere tali proprietà e ignorarle in base alle regole per la gestione degli errori di analisi. Tuttavia, poiché il trattino iniziale o il trattino basso fa parte della grammatica, gli implementatori CSS 2.1 dovrebbero sempre essere in grado di utilizzare un parser conforme a CSS, indipendentemente dal fatto che supportino o meno estensioni specifiche del fornitore.

Gli autori dovrebbero evitare estensioni specifiche del fornitore


Mi riferivo alla tua seconda modifica sui trattini e le sottolineature principali, ma ho dimenticato di chiarirlo. Dispiace per la confusione.
Albin,

24

L'espressione regolare completa è:

-?(?:[_a-z]|[\200-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])(?:[_a-z0-9-]|[\200-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])*

Quindi, tutti i personaggi elencati tranne " -" e " _" non sono consentiti se utilizzati direttamente. Ma puoi codificarli usando una barra rovesciata foo\~baro usando la notazione unicode foo\7E bar.


perchè [\200-\377]? [\178-\1114112]è consentito senza caratteri di escape nel CSS 3.
volare pecore l'

\377qui è in realtà sbagliato. C'è una nota nella sezione Grammatica dello scanner lessicale CSS2.1 che afferma: "Il" \ 377 "rappresenta il numero di carattere più alto che le attuali versioni di Flex possono gestire (decimale 255). Dovrebbe essere letto come" \ 4177777 "( decimale 1114111), che è il punto di codice più alto possibile in Unicode / ISO-10646. " Dovrebbe anche provenire da \240, no \377. Immagino che ora abbia 7 anni, quindi probabilmente le cose sono cambiate un po 'da allora.
James Donnelly,

1
Credo che sarebbe un'espressione regolare più accurata -?(?:[_a-z]|(?![\u0000-\u0239]).*|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])(?:[_a-z0-9-]|(?![\u0000-\u0239]).*|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])*.
James Donnelly,

2
@JamesDonnelly Non esitare a modificare la mia risposta se ritieni che necessiti di un aggiornamento.
Gumbo,

11

Per coloro che cercano una soluzione alternativa, è possibile utilizzare un selettore di attributi, ad esempio, se la classe inizia con un numero. Modificare:

.000000-8{background:url(../../images/common/000000-0.8.png);} /* DOESN'T WORK!! */

a questo:

[class="000000-8"]{background:url(../../images/common/000000-0.8.png);} /* WORKS :) */

Inoltre, se ci sono più classi, dovrai specificarle nel selettore, credo.

fonti:

  1. https://benfrain.com/when-and-where-you-can-use-numbers-in-id-and-class-names/
  2. Esiste una soluzione alternativa per rendere valide le classi CSS con nomi che iniziano con numeri?

5

La mia comprensione è che il carattere di sottolineatura è tecnicamente valido. Check-out:

https://developer.mozilla.org/en/underscores_in_class_and_id_names

"... errata alle specifiche pubblicate all'inizio del 2001 ha reso i caratteri di sottolineatura legali per la prima volta."

L'articolo sopra riportato dice che non li usano mai, quindi fornisce un elenco di browser che non li supportano, che sono, almeno in termini di numero di utenti, a lunga ridondanza.


4

Per HTML5 / CSS3 le classi e gli ID possono iniziare con i numeri.


1
Hai una fonte per questo? Forse mi manca qualcosa, ma la specifica dei selettori CSS3 si collega alla definizione degli identificatori nella specifica CSS 2.1 che non consente i numeri iniziali.
Ryan,

11
w3.org/TR/2003/WD-css3-syntax-20030813/#characters <- ancora non consente numeri iniziali ecc. (anche se funziona)
Jamie Pate

10
HTML 5 consente alle classi e agli ID di iniziare con un numero (ad es class="1a".). Tuttavia, un identificatore CSS non può iniziare con un numero (ad es. .1aNon funzionerà). Puoi scappare, duro (ad esempio .\31 ao .\000031a).
Oriol,

Anche se normalmente funziona anche nei CSS, ma sembra che non sia ancora ufficiale. "I nomi delle proprietà e dei nomi delle regole sono sempre identificatori, che devono iniziare con una lettera o un trattino seguiti da una lettera e quindi possono contenere lettere, numeri, trattini o caratteri di sottolineatura." - w3.org/TR/css3-syntax/#syntax-description
Adesivi

@Pangloss Ma i nomi delle classi non sono nomi di proprietà o nomi di regole.
Bennett McElwee,

1

Uscendo dalla risposta di @ Triptych, puoi usare le seguenti 2 corrispondenze regex per rendere valida una stringa:

[^a-z0-9A-Z_-]

Questa è una corrispondenza inversa che seleziona tutto ciò che non è una lettera, un numero, un trattino o un trattino basso per una facile rimozione.

^-*[0-9]+

Questo corrisponde a 0 o 1 trattini seguiti da 1 o più numeri all'inizio di una stringa, anche per una facile rimozione.

Come lo uso in PHP:

//Make alphanumeric with dashes and underscores (removes all other characters)
$class = preg_replace("/[^a-z0-9A-Z_-]/", "", $class);
//Classes only begin with an underscore or letter
$class = preg_replace("/^-*[0-9]+/", "", $class);
//Make sure the string is 2 or more characters long
return 2 <= strlen($class) ? $class : '';
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.