Quais caracteres / símbolos são permitidos nos seletores de classe CSS ?
Sei que os seguintes caracteres são inválidos , mas que caracteres são válidos ?
~ ! @ $ % ^ & * ( ) + = , . / ' ; : " ? > < [ ] \ { } | ` #
css
css-selectors
Darryl Hein
fonte
fonte
.hello/world
classe por escapar a barra invertida:.hello\2fworld
,hello\2f world
ouhello\/world
Respostas:
Você pode verificar diretamente na gramática CSS .
Basicamente 1 , um nome deve começar com um sublinhado (
_
), um hífen (-
) ou uma letra (a
-z
), seguido por qualquer número de hífens, sublinhados, letras ou números. Existe um problema: se o primeiro caractere é um hífen, o segundo caractere deve ser 2 uma letra ou sublinhado e o nome deve ter pelo menos 2 caracteres.Em resumo, a regra anterior se traduz no seguinte, extraída da especificação do W3C. :
Identificadores começando com um hífen ou sublinhado são normalmente reservados para extensões específicas do navegador, como em
-moz-opacity
.1 Tudo ficou um pouco mais complicado com a inclusão de caracteres unicode escapados (que ninguém realmente usa).
2 Observe que, de acordo com a gramática que eu vinculei, uma regra começando com DOIS hífens, por exemplo
--indent1
, é inválida. No entanto, tenho certeza que já vi isso na prática.fonte
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"
. Então ---indent1
é inválido e precisa ser escapado como\--indent1
(as--
classes quebram no iOS, por exemplo)Para minha surpresa, a maioria das respostas aqui estão erradas. Acontece que:
Qualquer caractere, exceto NUL, é permitido nos nomes de classe CSS em CSS. (Se o CSS contiver NUL (escapado ou não), o resultado será indefinido. [ CSS-caracteres ])
A resposta de Mathias Bynens tem links para explicações e demos mostrando como usar esses nomes. Escrito em código CSS, um nome de classe pode precisar ser escapado , mas isso não altera o nome da classe. Por exemplo, uma representação desnecessariamente excedida em escape parecerá diferente de outras representações com esse nome, mas ainda se refere ao mesmo nome de classe.
A maioria das outras linguagens (de programação) não tem esse conceito de escapar nomes de variáveis (“identificadores”), portanto, todas as representações de uma variável devem ter a mesma aparência. Este não é o caso em CSS.
Observe que, no HTML, não há como incluir caracteres de espaço (espaço, tabulação, avanço de linha, avanço de formulário e retorno de carro) em um atributo de nome de classe , porque eles já separam as classes.
Portanto, se você precisar transformar uma sequência aleatória em um nome de classe CSS: cuide de NUL e espaço e escape (de acordo com CSS ou HTML). Feito.
fonte
Respondi a sua pergunta em profundidade aqui: http://mathiasbynens.be/notes/css-escapes
O artigo também explica como escapar de qualquer caractere em CSS (e JavaScript), e eu fiz uma ferramenta útil para isso também. A partir dessa página:
fonte
class="404-error"
podem ser úteis.<p class="foo bar">
adiciona duas classes aop
elemento :,foo
ebar
. Não há como (em que eu possa pensar) adicionar um nome de classe contendo espaço em branco a um elemento HTML. As informações sobre como escapar caracteres em branco foram incluídas porque é útil escapar desses caracteres em outros contextos identificadores, por exemplo, nomes de família de fontes.Leia a especificação do W3C . (isto é CSS 2.1, encontre a versão apropriada para sua suposição de navegadores)
editar: parágrafo relevante a seguir:
edit 2: como o @mipadi aponta na resposta do Triptych, há essa ressalva , também na mesma página da web:
fonte
A expressão regular completa é:
Portanto, todos os seus personagens listados, exceto “
-
” e “_
”, não são permitidos se usados diretamente. Mas você pode codificá-los usando uma barra invertidafoo\~bar
ou usando a notação unicodefoo\7E bar
.fonte
[\200-\377]
?[\178-\1114112]
é permitido sem escape no CSS 3.\377
aqui está realmente errado. Há uma observação na seção Gramática do Scanner Lexical do CSS2.1, que afirma: "O" \ 377 "representa o número de caractere mais alto com o qual as versões atuais do Flex podem lidar (decimal 255). Ele deve ser lido como" \ 4177777 "( decimal 1114111), que é o ponto de código mais alto possível em Unicode / ISO-10646. " Também deve ser\240
também, não\377
. Eu acho que agora tem 7 anos, então as coisas provavelmente mudaram um pouco desde então.-?(?:[_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])*
.Para quem procura uma solução alternativa, você pode usar um seletor de atributos, por exemplo, se sua classe começar com um número. Mudança:
para isso:
Além disso, se houver várias classes, você precisará especificá-las no seletor, eu acho.
Fontes:
fonte
Meu entendimento é que o sublinhado é tecnicamente válido. Verificação de saída:
https://developer.mozilla.org/en/underscores_in_class_and_id_names
"... erratas às especificações publicadas no início de 2001 tornaram os sublinhados legais pela primeira vez."
O artigo vinculado acima diz que nunca os utiliza e, em seguida, fornece uma lista de navegadores que não os suportam, os quais são, em termos de número de usuários, pelo menos, redundantes.
fonte
Para HTML5 / CSS3, as classes e os IDs podem começar com números.
fonte
class="1a"
). No entanto, um identificador CSS não pode começar com um número (por exemplo.1a
, não funcionará). Você pode escapar, difícil (por exemplo,.\31 a
ou.\000031a
).Ao sair da resposta do @ Triptych, você pode usar as 2 correspondências de regex a seguir para validar uma string:
Esta é uma correspondência inversa que seleciona qualquer coisa que não seja uma letra, número, traço ou sublinhado para facilitar a remoção.
Corresponde a 0 ou 1 traços seguidos por 1 ou mais números no início de uma sequência, também para facilitar a remoção.
Como eu o uso no PHP:
fonte