命名"class"和"id"HTML属性 - 破折号与下划线

Ema*_*sev 108 html coding-style naming-conventions

<div id="example-value">还是<div id="example_value">

这个网站和Twitter使用的是第一种风格.Facebook和Vimeo--第二个.

你使用哪一个?为什么?

Raa*_*tje 128

使用连字符确保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;
};
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

如果浏览器将HTML ID注册为全局对象,则上述操作将失败,因为该消息不是"未定义",并且它将尝试创建HTML对象的实例.通过确保HTML ID在名称中有连字符可以防止如下所示的冲突:

message.js

message = function(containerObject){
    this.htmlObject = containerObject;
};
message.prototype.write = function(text){
    this.htmlObject.innerHTML+=text;
};
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用messageText或message_text但这不能解决问题,您可能会在以后意外访问HTML对象而不是JavaScript对象时遇到同样的问题

一句话,您仍然可以通过(例如)窗口对象使用window ['message-text']访问HTML对象;


Kla*_*urn 82

我会推荐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 {}
Run Code Online (Sandbox Code Playgroud)

  • [`BEM`](http://csswizardry.com/2013/01/mindbemding-getting-your-head-round-bem-syntax) 表示法怎么样? (2认同)
  • Google!=自动正确。他们经常是,但仅仅成为Google还不够。 (2认同)
  • 这是一个非常糟糕的主意。迟早你会想在一种不支持变量名(基本上所有变量名)中使用连字符的编程语言中使用你的名字,然后轰隆隆![愚蠢的重命名规则。](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/style) (2认同)

ada*_*mse 5

我相信这完全取决于程序员。如果你愿意的话,你也可以使用驼峰命名法(但我认为这看起来很尴尬。)

我个人更喜欢连字符,因为它在键盘上打字速度更快。所以我想说你应该选择你最舒服的,因为你的两个例子都被广泛使用。

  • 这个问题是类似的,并验证了这个答案http://stackoverflow.com/questions/70579/what-is-a-valid-value-for-id-attributes-in-html (3认同)

Dou*_*ner 5

这确实归结为偏好,但会在特定方向上影响您的可能是您编码时使用的编辑器。例如,TextMate的自动完成功能在连字符处停止,但将下划线分隔的单词视为单个单词。因此,与使用其自动完成功能 ( )the_post相比the-post,类名和 id 的效果更好Esc