「class」および「id」HTML属性の命名-ダッシュと下線の比較[終了]


113

<div id="example-value">または<div id="example_value">

このサイトとTwitterは最初のスタイルを使用しています。FacebookとVimeo-2番目。

どちらを使用していますか、またその理由は何ですか。


11
これらのリンクはどちらも壊れています
Steve

回答:


135

ハイフンを使用して、HTMLとJavaScriptを確実に分離します。

どうして?下記参照。

ハイフンはCSSおよびHTMLでの使用に有効ですが、JavaScriptオブジェクトには使用できません。

多くのブラウザは、ウィンドウ/ドキュメントオブジェクトのグローバルオブジェクトとしてHTML IDを登録します。大きなプロジェクトでは、これは本当の痛みになる可能性があります。

このため、HTML IDがJavaScriptと競合しないように、ハイフンを含む名前を使用しています。

以下を検討してください。

message.js

message = function(containerObject){
    this.htmlObject = containerObject;
};
message.prototype.write = function(text){
    this.htmlObject.innerHTML+=text;
};

html

<body>
    <span id='message'></span>
</body>
<script>
    var objectContainer = {};
    if(typeof message == 'undefined'){
        var asyncScript = document.createElement('script');
        asyncScript.onload = function(){
            objectContainer.messageClass = new message(document.getElementById('message'));
            objectContainer.messageClass.write('loaded');
        }
        asyncScript.src = 'message.js';
        document.appendChild(asyncScript);
    }else{
        objectContainer.messageClass = new message(document.getElementById('message'));
        objectContainer.messageClass.write('loaded');
    }
</script>

ブラウザがHTML IDをグローバルオブジェクトとして登録する場合、メッセージは「未定義」ではないため上記は失敗し、HTMLオブジェクトのインスタンスを作成しようとします。HTML IDの名前にハイフンが含まれていることを確認することで、以下のような競合を回避できます。

message.js

message = function(containerObject){
    this.htmlObject = containerObject;
};
message.prototype.write = function(text){
    this.htmlObject.innerHTML+=text;
};

html

<body>
    <span id='message-text'></span>
</body>
<script>
    var objectContainer = {};
    if(typeof message == 'undefined'){
        var asyncScript = document.createElement('script');
        asyncScript.onload = function(){
            objectContainer.messageClass = new message(document.getElementById('message-text'));
            objectContainer.messageClass.write('loaded');
        }
        asyncScript.src = 'message.js';
        document.appendChild(asyncScript);
    }else{
        objectContainer.messageClass = new message(document.getElementById('message-text'));
        objectContainer.messageClass.write('loaded');
    }
</script>

もちろん、messageTextまたはmessage_textを使用することもできますが、これは問題を解決せず、後でJavaScriptの代わりにHTMLオブジェクトに誤ってアクセスしてしまう同じ問題に遭遇する可能性があります

1つの注意点として、window ['message-text']を使用すると、(たとえば)windowオブジェクトを介してHTMLオブジェクトにアクセスできます。


ここであなたの投稿について何か理解できません。おそらく明確にできます。つまり、一部のブラウザはhtml IDをグローバルオブジェクトとして登録し、IDにハイフンを挿入すると、これらの自動生成されたオブジェクトと作成したオブジェクトとの間にハイフンが許可されないため競合が発生しないことが保証されます。 。しかし、ハイフンが許可されていない場合、ブラウザはこれらのハイフネーションされたオブジェクトをどのように作成しますか?それらを取り除く必要があるように思われるため、名前が競合する可能性があります。
ダラスケーリー

@DallasCaley表示されない場合、この答えは更新の呼び出しでしたwindow['message-text'];
Chris Marisic

ああ、わかったと思う。奇妙なことに、名前にダッシュを含むオブジェクトをスタンドアロンオブジェクトとして作成することはできませんが、別のオブジェクトのプロパティとして作成された場合は、名前にダッシュを含むオブジェクトを作成できます。名前にダッシュはありません。
ダラスケーリー2016年

この投稿により、実際には、私の立場を愚かではないという立場から、ほぼ100%の合意に再考させることになりました。この問題についての私の唯一の留保は、すべてのIDが-特定のIDで特に機能させたい場合を除き、同じ問題です。
user254694

87

Google HTML / CSSスタイルガイドをお勧めします

それは、具体的に述べ

IDとクラス名の単語はハイフンで区切ります。理解とスキャンしやすさを向上させるために、セレクター内の単語や省略形をハイフン以外の文字(何も含まない)で連結しないでください。

/* Not recommended: does not separate the words “demo” and “image” */
.demoimage {}

/* Not recommended: uses underscore instead of hyphen */
.error_status {}

/* Recommended */
#video-id {}
.ads-sample {}

1
何についてのBEM表記は?
Iulian Onofrei 2014

1
@IulianOnofreiでは、もちろんBEMを自由に使用できますが、Googleスタイルガイドに厳密に準拠していないことは明らかです。
Klas Mellbourn、2015

うーん、非常に奇妙です。googleのGWTフレームワークはキャメルケースを使用しています。次のドキュメントでこのコード行<h1 id = "appTitle"> </ h1>を確認してください。gwtproject.org/doc/latest/tutorial/i18n.html
karlihnos

4
Google!=自動的に正しい。彼らはしばしばそうですが、グーグルであることだけでは十分ではありません。
Craig Brett 2017

2
これは本当に悪い考えです。遅かれ早かれ、変数名(基本的にはすべて)のハイフンをサポートしていないプログラミング言語で自分の名前を使用し、次にBOOMを使用する必要があります。馬鹿な名前変更のルール。
Timmmm

5

それは本当に好みに帰着しますが、特定の方向にあなたを揺さぶるのは、あなたがコーディングするエディタかもしれません。たとえば、TextMateのオートコンプリート機能はハイフンで止まりますが、アンダースコアで区切られた単語は1つの単語として表示されます。そのため、クラス名とIDは、オートコンプリート機能()を使用する場合the_postよりもthe-post機能しEscます。


あなたは正しいですが、その周りの「htmlジャングル」では
かなり厄介な

4

これは完全にプログラマ次第だと思います。必要に応じてキャメルケースも使用できます(ただし、見た目が悪いと思います)。

キーボードで入力する方が速いので、個人的にはハイフンを好みます。したがって、どちらの例も広く使用されているため、最も使いやすいものを使用する必要があります。


3
この質問は似ており、この答えを確認しstackoverflow.com/questions/70579/...を
マット・スミス

2

どちらの例も完全に有効ですが、 ":"または "。"の組み合わせを使用することもできます。w3c 仕様に従ってセパレータとして。個人的には、スペースとの類似性から2語の名前の場合は「_」を使用します。


14
はい、IDにコロンとピリオドを使用できますが、CSSファイルを書いている人に嫌われるようにするための良い方法です。
Dave Markle、

5
HTML識別子ZZ:ZZZZ\00003AZZ(CSS2以上)としてエスケープする必要があります。
McDowell

1
良い練習だとは言わなかったが、有効だと言った。
Myles、

5
jQueryを爆発させる楽しい方法のように聞こえます
Mike Robinson

0

読みやすいので、最初の1つ(1-2)を使用します。画像の場合は、アンダースコア(btn_more.png)を使用します。キャメルケース(oneTwo)は別のオプションです。


0

実際、一部の外部フレームワーク(javascript、php)では、ID名にハイフンを使用するのに問題があります(バグ?)。私はアンダースコア(960gridもそうです)を使用しており、すべてうまくいきます。


3
どれ?とにかく、コードの可読性ははるかに重要です。
KamilTomšík、2011年

-1

主に、私が遭遇しているJavaScriptの副作用のために、下線を引くことをお勧めします。

ロケーションバーに以下のコードを入力すると、「example-value」が定義されていないというエラーが発生します。divにアンダースコアを付けた場合、機能します。

javascript:alert(example-value.currentStyle.hasLayout);

5
それはdocument.getElementById("example-value")正常に動作するはずです。
Chuck

Htmlヘルパー関数のHtmlAttributesパラメーターで属性の値を指定すると、ASP.NET MVCで同様の問題が発生します。
Matthijs Wessels、2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.