命名“ class”和“ id” HTML属性-破折号与下划线[关闭]


113

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

本网站和Twitter使用第一种样式。Facebook和Vimeo-第二个。

您使用哪一个?为什么?


11
这两个链接现在都断开了
Steve

Answers:


135

使用连字符可确保HTML和JavaScript之间的隔离。

为什么?见下文。

连字符可在CSS和HTML中使用,但不适用于JavaScript对象。

许多浏览器在大型项目中将HTML Ids注册为窗口/文档对象上的全局对象,这可能会带来很大的麻烦。

出于这个原因,我通过连字符使用名称,因此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,但这不能解决问题,以后可能会遇到相同的问题,即您意外访问HTML对象而不是JavaScript对象。

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


我对您在这里的帖子一无所知,也许您可​​以澄清一下。因此,您说某些浏览器将html id注册为全局对象,并且如果在id中放置连字符,则将保证这些自动生成的对象与您创建的对象之间不会发生冲突,因为不允许使用连字符。但是,如果不允许使用连字符,浏览器又如何创建这些连字符的对象?似乎必须将它们剥离,从而给您留下命名冲突的可能性。
达拉斯卡利

@DallasCaley,如果您没有看到,这个答案正在更新window['message-text'];
Chris Marisic

啊,我想我明白了。奇怪的是,javascript不允许您创建名称中带有破折号的对象作为独立对象,但是如果您将其创建为另一个对象的属性,则将允许您创建名称中带有破折号的对象名称中没有破折号。
达拉斯卡利

这篇帖子实际上使我重新思考了我的立场,从一个愚蠢的否定立场与您达成几乎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样式指南。
克拉斯·梅尔本

嗯,很奇怪。Google的GWT框架使用camelcase。在以下文档中检查此行代码<h1 id =“ appTitle”> </ h1>。gwtproject.org/doc/latest/tutorial/i18n.html
karlihnos

4
Google!=自动正确。他们经常是,但是仅仅成为Google是不够的。
Craig Brett

2
这真是个坏主意。迟早您将要使用不支持变量名(基本上都是变量名)中的连字符的编程语言来使用您的名称,然后使用BOOM!惯用的重命名规则。
Timmmm

5

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


您是对的,但是在周围的“ html丛林”中看起来会更加混乱
KamilTomšík2011年

4

我相信这完全取决于程序员。如果需要,您也可以使用camelCase(但我认为这看起来很尴尬。)

我个人更喜欢连字符,因为它可以更快地在键盘上键入。因此,我要说的是,您应该选择最适合自己的方式,因为这两个示例都被广泛使用。


3
这个问题是类似的,验证这个答案stackoverflow.com/questions/70579/...
马特·史密斯

2

任何一个示例都是完全有效的,甚至可以将混合符“:”或“。”放入其中。根据w3c 规范作为分隔符。我个人使用“ _”(如果它是两个单词的名称)是因为它与空格相似。


14
是的,您可以为ID使用冒号和点号,但这是让编写CSS文件的人讨厌您的好方法。
戴夫·马克尔

5
HTML标识符ZZ:ZZ必须转义为ZZ\00003AZZ(CSS2及更高版本)。
McDowell

1
我没有说这是一种好习惯,我说这是有效的。
迈尔斯

5
听起来是让jQuery爆炸的一种有趣方式
Mike Robinson 2010年

0

我使用第一个(一两个),因为它更具可读性。对于图像,尽管我更喜欢下划线(btn_more.png)。骆驼套(oneTwo)是另一种选择。



-1

我建议使用下划线,主要是因为我遇到了JavaScript副作用。

如果要在位置栏中输入以下代码,则会出现错误:'example-value'未定义。如果div用下划线命名,那么它将起作用。

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

5
那应该是document.getElementById("example-value"),它将正常工作。
Chuck 2010年

在Html帮助器函数的HtmlAttributes参数中为属性指定值时,ASP.NET MVC出现了类似的问题。
Matthijs Wessels
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.