在过去,我总是使用下划线来定义HTML中的类和id属性。在过去的几年里,我把破折号换成了破折号,主要是为了让自己与社区的趋势保持一致,不一定是因为这对我来说有意义。

我一直认为破折号有更多的缺点,我没有看到好处:

代码完成和编辑

大多数编辑器将破折号作为单词分隔符,因此我无法通过tab键找到我想要的符号。假设这个类是“featured-product”,我必须自动完成“featured”,输入一个连字符,并完成“product”。

带有下划线的“featured_product”被视为一个单词,因此它可以在一个步骤中填充。

这同样适用于在文档中导航。按单词跳转或双击类名会被连字符打断。

(更一般地,我认为类和id是标记,所以对我来说,标记应该如此容易地在连字符上拆分是没有意义的。)

算术运算符的模糊性

使用破折号破坏了JavaScript中对表单元素的对象属性访问。这只适用于下划线:

form.first_name.value='Stormageddon';

(不可否认,我自己没有这样访问表单元素,但当决定将破折号和下划线作为通用规则时,考虑到有人可能会这样做。)

像Sass这样的语言(特别是在Compass框架中)已经将破折号作为标准,甚至对于变量名也是如此。他们一开始也使用下划线。事实是,这种不同的解析方式让我感到奇怪:

$list-item-10
$list-item - 10

跨语言变量命名不一致

以前,我经常在PHP、ruby、HTML/CSS和JavaScript中为变量写下划线。这很方便,也很一致,但为了“适应”,我现在使用:

HTML/CSS中的破折号 JavaScript中的camelCase 在PHP和ruby中的underscore_case

这并没有给我带来太大的困扰,但我想知道为什么它们变得如此不一致,似乎是故意的。至少下划线可以保持一致性:

var featured_product = $('#featured_product'); // instead of
var featuredProduct = $('#featured-product');

这些差异导致我们不得不不必要地翻译字符串,同时还可能出现错误。

所以我问:为什么社区几乎都选择破折号,还有什么比下划线更重要的原因吗?

在这开始的时候,有一个相关的问题,但我的观点是,这不是(或不应该)只是一个品味的问题。我很想知道为什么我们都选择了这个惯例如果这真的只是一个品味问题的话。


当前回答

近年来,以连字符分隔的全字段url明显增多。这是SEO最佳实践所鼓励的。谷歌明确“建议您在url中使用连字符(-)而不是下划线(_)”:http://www.google.com/support/webmasters/bin/answer.py?answer=76329。

如上所述,在不同的情况下,不同的公约在不同的时间流行,但它们通常不是任何协议或框架的正式组成部分。

因此,我的假设是,谷歌的位置将这种模式固定在一个关键上下文(SEO)中,而在类、id和属性名中使用这种模式的趋势只是朝着这个大致的方向缓慢移动。

其他回答

原因有很多,但最重要的一点是保持一致性。

我认为这篇文章解释得很全面。

CSS是一种用连字符分隔的语法。我的意思是我们写诸如字体大小,行高,边界底部等。

So:

你只是不应该混合语法:这是不一致的。

近年来,以连字符分隔的全字段url明显增多。这是SEO最佳实践所鼓励的。谷歌明确“建议您在url中使用连字符(-)而不是下划线(_)”:http://www.google.com/support/webmasters/bin/answer.py?answer=76329。

如上所述,在不同的情况下,不同的公约在不同的时间流行,但它们通常不是任何协议或框架的正式组成部分。

因此,我的假设是,谷歌的位置将这种模式固定在一个关键上下文(SEO)中,而在类、id和属性名中使用这种模式的趋势只是朝着这个大致的方向缓慢移动。

point of refactoring only btn to bt

case: btn_pink
search btn in word
result btn

case: btn-pink
search btn in word
result btn | btn-pink

case: btn-pink
search btn in regexp
\bbtn\b(?!-) type to hard
result btn

代码自动完成

我想,破折号是解释为标点符号还是不透明的标识符取决于所选择的编辑器。然而,就个人喜好而言,我喜欢在CSS文件中的每个单词之间使用制表符,如果它们用下划线分隔,并且没有停止符,我会觉得很讨厌。

此外,使用连字符可以让你利用|=属性选择器,它可以选择任何包含文本的元素,后面可以选择一个破折号:

span[class|="em"] { font-style: italic; }

这将使以下HTML元素具有斜体字体样式:

<span class="em">I'm italic</span>
<span class="em-strong">I'm italic too</span>

算术运算符的模糊性

我想说,通过JavaScript中的点符号访问HTML元素是一个bug,而不是一个特性。这是糟糕的JavaScript实现早期的一个糟糕的构造,并不是一个很好的实践。对于目前使用JavaScript所做的大多数事情,无论如何都希望使用CSS选择器从DOM中获取元素,这使得整个点表示法相当无用。你喜欢哪一种?

var firstName = $('#first-name');
var firstName = document.querySelector('#first-name');
var firstName = document.forms[0].first_name;

我发现前两个选项更可取,特别是因为“#first-name”可以用JavaScript变量替换并动态构建。我还发现它们更赏心悦目。

The fact that Sass enables arithmetic in its extensions to CSS doesn't really apply to CSS itself, but I do understand (and embrace) the fact that Sass follows the language style of CSS (except for the $ prefix of variables, which of course should have been @). If Sass documents are to look and feel like CSS documents, they need to follow the same style as CSS, which uses dash as a delimiter. In CSS3, arithmetic is limited to the calc function, which goes to show that in CSS itself, this isn't an issue.

跨语言变量命名不一致

所有的语言,无论是标记语言、编程语言、样式语言还是脚本语言,都有自己的风格。您将在XML等语言组的子语言中发现这一点,例如XSLT使用小写字母加连字符分隔符,而XML Schema使用驼峰式大小写。

一般来说,你会发现采用感觉和看起来最适合你写作语言的风格比试图把你自己的风格硬塞到每一种不同的语言中要好。由于您无法避免必须使用本机库和语言结构,因此无论您喜欢与否,您的样式都会被本机样式“污染”,因此即使尝试也几乎是徒劳的。

我的建议是,不要在各种语言中找到一种最喜欢的风格,而是让自己在每种语言中都感到自在,并学会喜欢它所有的怪癖。CSS的一个奇怪之处是关键字和标识符用小写字母书写,并用连字符分隔。就我个人而言,我觉得这在视觉上非常吸引人,并且认为它适合全小写(尽管没有连字符)HTML。

我认为这与程序员有关。有人喜欢用破折号,有人喜欢用下划线。 我个人使用下划线(_),因为我在其他地方也使用它。如: JavaScript变量(var my_name); -我的控制器动作(公共函数view_detail) 我使用下划线的另一个原因是,在大多数ide中,用下划线分隔的两个单词被认为是一个单词。(并且可以选择double_click)。