Quels caractères / symboles sont autorisés dans les sélecteurs de classe CSS ?
Je sais que les caractères suivants ne sont pas valides , mais quels caractères sont valides ?
~ ! @ $ % ^ & * ( ) + = , . / ' ; : " ? > < [ ] \ { } | ` #
css
css-selectors
Darryl Hein
la source
la source
.hello/world
classe en échappant à la barre oblique inverse:.hello\2fworld
,hello\2f world
ouhello\/world
Réponses:
Vous pouvez vérifier directement à la grammaire CSS .
Fondamentalement 1 , un nom doit commencer par un trait de soulignement (
_
), un trait d'union (-
) ou une lettre (a
-z
), suivi d'un nombre quelconque de tirets, traits de soulignement, lettres ou chiffres. Il y a un hic: si le premier caractère est un trait d'union, le deuxième caractère doit 2 être une lettre ou un trait de soulignement, et le nom doit comporter au moins 2 caractères.En bref, la règle précédente se traduit par ce qui suit, extrait de la spécification W3C. :
Les identifiants commençant par un trait d'union ou un trait de soulignement sont généralement réservés aux extensions spécifiques au navigateur, comme dans
-moz-opacity
.1 Tout est rendu un peu plus compliqué par l'inclusion de caractères unicode échappés (que personne n'utilise vraiment).
2 Notez que, selon la grammaire que j'ai liée, une règle commençant par DEUX traits d'union, par exemple
--indent1
, n'est pas valide. Cependant, je suis presque sûr d'avoir vu cela en pratique.la source
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"
. Donc ---indent1
n'est pas valide et doit être échappé comme\--indent1
(les--
classesÀ ma grande surprise, la plupart des réponses ici sont fausses. Il se trouve que:
Tout caractère sauf NUL est autorisé dans les noms de classe CSS en CSS. (Si CSS contient NUL (échappé ou non), le résultat n'est pas défini. [ CSS-caractères ])
La réponse de Mathias Bynens contient des liens vers des explications et des démos montrant comment utiliser ces noms.Écrit dans le code CSS, un nom de classe peut nécessiter un échappement , mais cela ne change pas le nom de la classe. Par exemple, une représentation inutilement trop échappée sera différente des autres représentations de ce nom, mais elle fait toujours référence au même nom de classe.
La plupart des autres langages (de programmation) n'ont pas ce concept d'échappement des noms de variables («identificateurs»), donc toutes les représentations d'une variable doivent avoir la même apparence. Ce n'est pas le cas en CSS.
Notez qu'en HTML, il n'y a aucun moyen d'inclure des caractères d'espace (espace, tabulation, saut de ligne, saut de page et retour chariot) dans un attribut de nom de classe , car ils séparent déjà les classes les unes des autres.
Donc, si vous devez transformer une chaîne aléatoire en un nom de classe CSS: prenez soin de NUL et de l'espace, et échappez (en conséquence pour CSS ou HTML). Terminé.
la source
J'ai répondu à votre question en profondeur ici: http://mathiasbynens.be/notes/css-escapes
L'article explique également comment échapper n'importe quel caractère en CSS (et JavaScript), et j'ai également créé un outil pratique pour cela. Depuis cette page:
la source
class="404-error"
peuvent être utiles.<p class="foo bar">
ajoute deux classes à l'p
élément :,foo
etbar
. Il n'y a aucun moyen (auquel je peux penser) d'ajouter un nom de classe contenant des espaces à un élément HTML. Les informations sur la façon d'échapper les caractères d'espacement ont été incluses car il est utile d'échapper ces caractères dans d'autres contextes d'identification, par exemple les noms de famille de polices.Lire la spécification W3C . (c'est CSS 2.1, trouvez la version appropriée pour votre hypothèse de navigateurs)
modifier: le paragraphe pertinent suit:
edit 2: comme le souligne @mipadi dans la réponse de Triptych, il y a cette mise en garde , également sur la même page Web:
la source
L'expression régulière complète est:
Ainsi, tous vos personnages répertoriés, à l'exception de "
-
" et "_
", ne sont pas autorisés s'ils sont utilisés directement. Mais vous pouvez les encoder en utilisant une barre oblique inversefoo\~bar
ou en utilisant la notation unicodefoo\7E bar
.la source
[\200-\377]
?[\178-\1114112]
est autorisé sans échappatoire en CSS 3.\377
ici est en fait mal. Il y a une note sur la grammaire de la section Lexical Scanner de CSS2.1 qui stipule: "Le" \ 377 "représente le plus grand nombre de caractères que les versions actuelles de Flex peuvent traiter (décimal 255). Il doit être lu comme" \ 4177777 "( décimal 1114111), qui est le point de code le plus élevé possible dans Unicode / ISO-10646. " Cela devrait également être le\240
cas non\377
. Je suppose que cela fait maintenant 7 ans, donc les choses ont probablement changé un peu depuis lors.-?(?:[_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])*
.Pour ceux qui recherchent une solution de contournement, vous pouvez utiliser un sélecteur d'attribut, par exemple, si votre classe commence par un nombre. Changement:
pour ça:
De plus, s'il y a plusieurs classes, vous devrez les spécifier dans le sélecteur je pense.
Sources:
la source
Je crois comprendre que le soulignement est techniquement valable. Check-out:
https://developer.mozilla.org/en/underscores_in_class_and_id_names
"... les errata des spécifications publiées début 2001 ont rendu les soulignements légaux pour la première fois."
L'article lié ci-dessus dit de ne jamais les utiliser, puis donne une liste des navigateurs qui ne les prennent pas en charge, qui sont tous, en termes de nombre d'utilisateurs au moins, redondants depuis longtemps.
la source
Pour les classes et les ID HTML5 / CSS3 peuvent commencer par des nombres.
la source
class="1a"
). Cependant, un identifiant CSS ne peut pas commencer par un nombre (par exemple.1a
, ne fonctionnera pas). Vous pouvez y échapper, difficile (par exemple.\31 a
ou.\000031a
).En partant de la réponse de @ Triptych, vous pouvez utiliser les 2 correspondances d'expression régulière suivantes pour rendre une chaîne valide:
Il s'agit d'une correspondance inverse qui sélectionne tout ce qui n'est pas une lettre, un chiffre, un tiret ou un trait de soulignement pour un retrait facile.
Cela correspond à 0 ou 1 tirets suivi d'un ou plusieurs chiffres au début d'une chaîne, également pour une suppression facile.
Comment je l'utilise en PHP:
la source