CSSクラス名/セレクターで有効な文字はどれですか?


1203

CSSクラスセレクター内で使用できる文字/記号は何ですか?
次の文字は無効ですが、どの文字が有効ですか?

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


32
utf8文字はどうですか?ギリシャ語で入力するように
GorillaApe 2010年

9
特殊文字は、エスケープしてクラス名に使用できます。CSSファイルでは.hello/world、バックスラッシュをエスケープしてクラスを定義できます:.hello\2fworldhello\2f worldまたはhello\/world
wyqydsyq

1
「名前の構文」ではなく、複数の名前を表現する場合の「クラス属性の構文」に関する別の関連質問。
ピータークラウス

2
絵文字も使用できます。npmjs.com/package/postcss-modules-emoji-classname
Kevin

回答:


1024

CSS文法で直接確認できます。

基本的に1、名前は下線(_)、ハイフン(-)、または文字(az)で始まり、その後に任意の数のハイフン、下線、文字、または数字が続く必要があります。キャッチがあります:最初の文字がハイフンである場合は、2番目の文字はしなければならない2は、文字またはアンダースコアであること、および名前が長い、少なくとも2文字でなければなりません。

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

つまり、前述のルールは、W3C仕様から抽出された次のようになります

CSSでは、識別子(要素名、クラス、セレクターのIDを含む)に含めることができるのは、文字[a-z0-9]とISO 10646文字U + 00A1以上、さらにハイフン(-)とアンダースコア(_)だけです。 ; 数字で始めたり、ハイフンの後に数字を続けたりすることはできません。識別子には、エスケープ文字とISO 10646文字を数値コードとして含めることもできます(次の項目を参照)。たとえば、識別子「B&W?」「B \&W \?」と書くことができます または「B \ 26 W \ 3F」。

ハイフンまたはアンダースコアで始まる識別子は、通常、ブラウザ固有の拡張機能用に予約されてい-moz-opacityます。

1エスケープされたUnicode文字(実際には誰も使用しない)を含めることで、すべてが少し複雑になっています。

2リンクした文法によれば、2つのハイフンで始まるルール--indent1は無効であることに注意してください。しかし、実際にこれを見たことがあると思います。


57
注意:W3Cは、先頭の「-」または「_」の使用はベンダー固有のCSS拡張(たとえば、Mozillaブラウザーによって実装される-moz *クラス)用に予約する必要があると述べています。
ミパディ2009年

3
\ -escapesは一般的に使用されますが、通常は主にCSSハックの目的で、それらをサポートしないブラウザーを分離します。
ボビンス、2009年

5
基づいて、後から2年間@Pimイェーガーさんのコメントを更新するにはw3counter.com/globalstats.php 22%で、4%にIE9の後ろに、IE6は現在のユーザーの3%未満で使用されている9%のIE7、IE8を。Firefoxのすべてのバージョンは28%、Chromeのすべてのバージョンは17%です。
Daniel Earwicker

3
私はこれが古い答えであることを知っていますが、CSS(少なくとも2つ以上)では識別子に{Non-ASCII}文字を使用できます。
user2864740 2014

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"。したがって、- --indent1は無効であり、エスケープする必要があります\--indent1--たとえば、iOSではクラスが壊れます)
15年

177

驚いたことに、ここでのほとんどの答えは間違っています。次のことがわかります。

CSSでは、CSSクラス名にNUL以外の文字を使用できます。(CSSにNUL(エスケープされているかどうかに関係なく)が含まれている場合、結果は未定義です。[ CSS-characters ])

Mathias Bynensの回答は、これらの名前の使用方法を示す説明デモへのリンクです。ダウン書かれた CSSコードでは、クラス名はエスケープが必要な場合があり、それは、クラス名を変更しません。たとえば、不必要に過剰にエスケープされた表現は、その名前の他の表現とは異なって見えますが、それでも同じクラス名を参照しています。

他のほとんどの(プログラミング)言語には、変数名(「識別子」)をエスケープするという概念がないため、変数のすべての表現が同じに見える必要があります。これはCSSでは当てはまりません。

HTMLでは、クラス名属性スペース文字(スペース、タブ、ラインフィード、フォームフィード、およびキャリッジリターン)を含める方法がないことに注意してください。これらは、すでにクラスを互いに分離しているためです。

したがって、ランダムな文字列をCSSクラス名に変換する必要がある場合は、NULとスペースに注意してエスケープします(したがって、CSSまたはHTMLの場合)。できました。


7
回答の最初の行は、「ここでのほとんどの回答は古くなっている/ CSS2にのみ適用する」である必要があります。
Salman A

7
@SalmanA私が言及した答えは最初から間違っていました。CSS2.1、CSS2、CSS1には適用されません。
Robert Siemer 2014年

@RobertSiemer良い点、私はコメントをstackoverflow.com/questions/50812118/に移動しました(これは決してこのトピックにそれほど関係がありません)
Peter T.


71

私はここであなたの質問に詳細に答えました:http : //mathiasbynens.be/notes/css-escapes

この記事では、CSS(およびJavaScript)で任意の文字をエスケープする方法についても説明しています。また、このための便利なツールも作成しました。そのページから:

要素にID値を指定する~!@$%^&*()_+-=,./';:"?><[]{}|`#場合、セレクターは次のようになります。

CSS:

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

JavaScript:

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

4
@Darrylもちろん、これはかなり極端な例ですが、などのものclass="404-error"が役立つ場合があります。
Mathias Bynens、2011

例があります。構文強調表示システムの出力をCSSに変換します。「ISO C ++:Types(_t / _type)」のようなクラス名があります。空白のみを置き換える場合、有効なクラス名があります。
空飛ぶ羊

あなたのウェブサイトでは、スペース文字はバックスラッシュでエスケープできると言っています。クラス名で試してみると、うまく動かない。この例ではスペースがないことに気づきました。出来ますか?
Adamarla 2016

@Adamarla <p class="foo bar">は、p要素fooにとの2つのクラスを追加しますbar。HTML要素に空白を含むクラス名を追加する方法(私が考えることができる)はありません。空白文字をエスケープする方法に関する情報が含まれているのは、フォントファミリー名などの他の識別子コンテキストでそのような文字をエスケープするのに役立つためです。
Mathias Bynens 16

3
生活のほとんどのことと同様に、CSSでは「極端に技術的に合法」と「正気」の違いがあるようです。
Volksman、2017年

69

W3C仕様を読んでください。(これはCSS 2.1です。ブラウザーの想定に適したバージョンを見つけてください)

編集:関連する段落が続きます:

CSSでは、識別子(要素名、クラス、セレクターのIDを含む)に含めることができるのは、文字[a-z0-9]とISO 10646文字U + 00A1以上、さらにハイフン(-)とアンダースコア(_)だけです。 ; 数字で始めたり、ハイフンの後に数字を続けたりすることはできません。識別子には、エスケープ文字とISO 10646文字を数値コードとして含めることもできます(次の項目を参照)。たとえば、識別子「B&W?」「B \&W \?」と書くことができます または「B \ 26 W \ 3F」。

編集2:@mipadiがトリプティクの答えで指摘しているように、同じ警告がこのウェブページにもあります:

CSSでは、識別子は「-」(ダッシュ)または「_」(アンダースコア)で始まる場合があります。'-'または '_'で始まるキーワードおよびプロパティ名は、ベンダー固有の拡張用に予約されています。このようなベンダー固有の拡張機能は、次のいずれかの形式である必要があります。

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

例:

たとえば、XYZ組織がディスプレイの東側の境界線の色を説明するプロパティを追加した場合、それらは-xyz-border-east-colorと呼ばれることがあります。

その他の既知の例:

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

最初のダッシュまたはアンダースコアは、CSSの現在または将来のレベルでは、プロパティまたはキーワードで使用されないことが保証されています。したがって、典型的なCSS実装はそのようなプロパティを認識せず、解析エラーの処理規則に従ってそれらを無視する場合があります。ただし、最初のダッシュまたはアンダースコアは文法の一部であるため、CSS 2.1の実装者は、ベンダー固有の拡張機能をサポートしているかどうかにかかわらず、常にCSS準拠のパーサーを使用できる必要があります。

著者はベンダー固有の拡張を避けるべきです


先頭のダッシュとアンダースコアに関する2番目の編集について言及しましたが、それを明確にするのを忘れていました。混乱させて申し訳ありません。
アルビン、2015年

24

完全な正規表現は次のとおりです。

-?(?:[_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])*

したがって、「-」と「_」以外のリストされた文字はすべて、直接使用すると許可されません。ただし、バックスラッシュfoo\~barまたはUnicode表記を使用してエンコードできますfoo\7E bar


なんで[\200-\377][\178-\1114112]CSS 3ではエスケープなしで許可されています
飛ぶ羊

\377ここは実際には間違っています。CSS2.1の字句スキャナセクションの文法に、「「\ 377」は、Flexの現在のバージョンが処理できる最大の文字数(10進数の255)を表します。「4167777」( 10進数1114111)、これはUnicode / ISO-10646で可能な最高のコードポイントです。また\240、からのものである必要があり\377ます。これは7歳になったと思いますが、それ以来おそらく少し変わっています。
James Donnelly、2016年

1
より正確な正規表現が得られると思います-?(?:[_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更新が必要だと思われる場合は、お気軽に私の回答を編集してください。
ガンボ2016年

11

回避策を探している人のために、たとえば、クラスが数値で始まる場合は、属性セレクターを使用できます。変化する:

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

これに:

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

また、クラスが複数ある場合は、セレクターで指定する必要があると思います。

出典:

  1. https://benfrain.com/when-and-where-you-can-use-numbers-in-id-and-class-names/
  2. 数字で始まる名前のCSSクラスを有効にする回避策はありますか?

5

私の理解では、アンダースコアは技術的に有効です。チェックアウト:

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

「... 2001年初頭に公開された仕様の正誤表は、初めてアンダースコアを合法にした」と語った。

上記のリンクされた記事は、それらを使用しないことを示しており、それらをサポートしていないブラウザーのリストを提供します。


4

HTML5 / CSS3の場合、クラスとIDは数字で始めることができます。


1
これのソースはありますか?たぶん私は何かが足りないかもしれませんが、CSS3セレクター仕様はCSS 2.1仕様の識別子定義にリンクしており、先行番号を許可していません。
ライアン、

11
w3.org/TR/2003/WD-css3-syntax-20030813/#characters <-それでも、先行番号などは許可されません(たとえ機能しても)
Jamie Pate

10
HTML 5では、クラスとIDを数字で始めることができます(例:)class="1a"。ただし、CSS識別子を数字で始めることはできません(たとえば、機能し.1aません)。あなたはそれをタフにすることができます(例:.\31 aまたは.\000031a)。
Oriol

通常はCSSでも動作しますが、まだ公式ではないようです。「プロパティ名とat-rule名は常に識別子であり、文字またはハイフンで始まり、その後に文字が続く必要があります。その後、文字、数字、ハイフン、またはアンダースコアを含めることができます。」- w3.org/TR/css3-syntax/#syntax-description
ステッカー

@Panglossしかし、クラス名はプロパティ名や規則名ではありません。
Bennett McElwee 2015

1

@Triptychの答えから離れて、次の2つの正規表現一致を使用して文字列を有効にすることができます。

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

これは、簡単に削除できるように、文字、数字、ダッシュ、アンダースコア以外のものを選択する逆一致です。

^-*[0-9]+

これは、文字列の先頭にある0個または1個のダッシュとそれに続く1個以上の数字に一致し、簡単に削除することもできます。

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 : '';
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.