"class"및 "id"HTML 속성 이름 지정-대시 대 밑줄 [닫힘]


114

<div id="example-value"> 또는 <div id="example_value"> ?

이 사이트와 트위터는 첫 번째 스타일을 사용합니다. Facebook과 Vimeo-두 번째.

어떤 것을 사용하고 왜 사용합니까?


11
두 링크가 모두 끊어졌습니다
Steve

답변:


136

하이픈을 사용하여 HTML과 자바 스크립트를 분리하세요.

왜? 아래를 참조하십시오.

하이픈은 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 객체에 실수로 액세스하는 동일한 문제가 발생할 수 있습니다.

한 가지 말로, window [ 'message-text']를 사용하여 (예를 들어) 창 개체를 통해 HTML 개체에 계속 액세스 할 수 있습니다.


여기에 귀하의 게시물에 대해 이해가되지 않습니다. 분명히 말씀해 주시면됩니다. 따라서 일부 브라우저는 html id를 전역 개체로 등록하고 id에 하이픈을 넣으면 이러한 자동 생성 개체와 하이픈이 허용되지 않기 때문에 생성 한 개체간에 충돌이 없음을 보장한다고 말합니다. . 그러나 하이픈이 허용되지 않는 경우 브라우저는 이러한 하이픈 개체를 어떻게 생성합니까? 제거해야 할 것 같으므로 이름 충돌 가능성이 있습니다.
Dallas Caley

당신이 보지 않았다 @DallasCaley 경우,이 답변이 부르고 갱신했다window['message-text'];
크리스 Marisic

아, 알 것 같아요. 이상하게도 자바 스크립트는 이름에 대시가있는 개체를 독립형 개체로 만들 수는 없지만 다른 개체의 속성으로 만들면 이름에 대시가있는 개체를 만들 수 있습니다. 이름에 대시가 없습니다.
Dallas Caley

이 게시물은 실제로 내가 어리석은 위치에서 거의 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표기?
이 울리 Onofrei

1
@IulianOnofrei는 물론 BEM을 무료로 사용할 수 있지만 Google 스타일 가이드를 엄격하게 준수하지는 않습니다.
Klas Mellbourn

흠, 매우 이상합니다. Google의 GWT 프레임 워크는 camelcase를 사용합니다. 다음 문서에서이 코드 줄 <h1 id = "appTitle"> </ h1>을 확인하십시오. gwtproject.org/doc/latest/tutorial/i18n.html
karlihnos

4
Google! = 자동으로 맞습니다. 종종 그렇습니다. 그러나 Google이라는 것만으로는 정당성이 충분하지 않습니다.
Craig Brett

2
이것은 정말 나쁜 생각입니다. 조만간 변수 이름 (기본적으로 모두)에 하이픈을 지원하지 않는 프로그래밍 언어로 이름을 사용한 다음 BOOM! Idiotic 이름 변경 규칙.
Timmmm

5

그것은 실제로 선호도에 달려 있지만 특정 방향으로 당신을 흔들리는 것은 당신이 코딩하는 편집기 일 수 있습니다. 예를 들어 TextMate 의 자동 완성 기능은 하이픈에서 멈추지 만 밑줄로 구분 된 단어는 단일 단어로 간주됩니다. 따라서 자동 완성 기능을 사용할 the_post때보 다 클래스 이름과 ID가 더 잘 작동 the-post합니다 ( Esc).


당신 말이 맞지만 주변의 "html 정글"에서 훨씬 더 지저분 해 보일 것입니다.
Kamil Tomšík 2011 년

4

나는 이것이 전적으로 프로그래머에게 달려 있다고 믿습니다. 원한다면 camelCase도 사용할 수 있습니다 (하지만 어색해 보일 것 같습니다.)

저는 개인적으로 하이픈을 선호합니다. 키보드로 입력하는 것이 더 빠르기 때문입니다. 따라서 두 가지 예가 모두 널리 사용되기 때문에 가장 편한 방법으로 가야한다고 말하고 싶습니다.


3
이 질문은 유사
Matt Smith

2

두 예 모두 완벽하게 타당하며 ":"또는 "."혼합에 넣을 수도 있습니다. w3c 사양 에 따라 구분자로 . 저는 개인적으로 "_"라는 이름이 공백과 유사하기 때문에 두 단어 이름이면 사용합니다.


14
예, Id에 콜론과 마침표를 사용할 수 있지만 CSS 파일을 작성하는 사람이 당신을 싫어하도록 만드는 좋은 방법입니다.
Dave Markle

5
HTML 식별자 ZZ:ZZZZ\00003AZZ(CSS2 이상) 으로 이스케이프되어야 합니다.
McDowell

1
나는 그것이 좋은 연습이라고 말하지 않았고 그것이 타당하다고 말했습니다.
Myles

5
jQuery를 폭발시키는 재미있는 방법처럼 들리 네요
Mike Robinson

0

더 읽기 쉽기 때문에 첫 번째 (1-2)를 사용합니다. 이미지의 경우 밑줄 (btn_more.png)을 선호합니다. 카멜 케이스 (oneTwo)는 또 다른 옵션입니다.


0

실제로 일부 외부 프레임 워크 (javascript, php)는 ID 이름에 hypen을 사용하는 데 어려움 (버그?)이 있습니다. 나는 밑줄을 사용하고 (960grid도 마찬가지) 모두 훌륭하게 작동합니다.


3
어느 것? 어쨌든 코드 가독성이 훨씬 더 중요합니다.
Kamil Tomšík 2011 년

-1

나는 주로 내가 만나는 자바 스크립트 부작용의 이유로 밑줄을 제안합니다.

아래 코드를 위치 표시 줄에 입력하면 'example-value'is undefined 오류가 발생합니다. div의 이름이 밑줄로 지정되면 작동합니다.

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

5
그것은 document.getElementById("example-value")잘 작동합니다.
Chuck

Html 도우미 함수의 HtmlAttributes 매개 변수에 특성 값을 지정할 때 ASP.NET MVC에서 비슷한 문제가 발생합니다.
Matthijs Wessels
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.