ID,类的HTML命名约定以及包含元素类型前缀?

mar*_*ith 61 html css xhtml naming-conventions

有没有人知道一个很好的资源来解释HTML ID和类的良好命名约定,以及是否使用元素类型的ID(例如btn或按钮或类似物)作为前缀?

课程应该是复数还是单数?我知道ID应该是单数的,因为它们是唯一的,但是那些类呢?

ID和类应该使用名词,对吧?

我正在使用在现有页面中注入其他页面的页面,有点像部分页面......因此......我想知道是否有人在ID和/或类前面添加了一个名称..有点像命名空间或类似?

任何评论或见解真的很感激.

Adr*_* Be 68

2015:一个专注于现有CSS和HTML命名系统的新答案

对于您选择的任何惯例,我建议您选择针对项目需求的要求.

即:你的项目是小还是大?您的项目是否会被重用或需要处理某种主题?开发人员是否对CSS/HTML有敏锐的兴趣或经验足以坚持常规?等等..


首先,如果您不了解这种常见的(好的?)实践:避免将ID作为样式挂钩,尝试仅使用类

因为:

  • 只有极少数的块(即页面页眉,页脚)可以100%保证它们不会在其他地方重复使用

  • 你想保持特异性低,你总是需要覆盖它(不使用额外的ID选择器或者!重要)


共同要求/惯例:

  • 名称应该是直观/有意义的
  • 不要缩写名称,除非它是一个非常着名的缩写(即msg for Message,accnt for account)
  • 使用已知/常用名称:.site-nav,.aside-nav,.global-head,.btn-primary,.btn-secondary
  • 允许结构层次结构(即BEM惯例)
  • 使用-_在namings:可能主观(开发者的意见)和取决于使用的键盘语言.请注意,我认为camelCase已经被搁置以避免出现浏览器兼容性问题,尽管我从未找到过这方面的证据.
  • 除非特殊情况,否则切勿在选择器中使用元素:这样可以提供更大的灵活性,即.你有你创建的按钮<input type="button"></input>,你想切换到使用<button></button>,如果你在一些选择器中使用元素类型,那么你可以计划一些烦人/耗时的重构/测试/ prod-bug修复,而如果你使用无元素选择器然后开关将变得无比容易.SMACCS也在其公约中有它
  • 对于状态,尝试匹配其他语言(php,java,c#)的已知约定:即使用"is-active","is-badass"等等
  • 名称从左到右:从最通用到最精确,即.btn-bluetheme-create-accnt要么accordion-modrnlook-userlist
  • 类或id名称应始终具体到足以在整个项目中搜索并仅返回相关结果
  • 如果你使用后代选择器,则更喜欢直接后代 - 使用.module-name > .sub-module-namevs .module-name .sub-module-name- 你将在未来为自己节省一些头痛(更简单的CSS但也更高效,尽管术语"CSS性能可能是可笑的")

已知惯例:

结构命名约定:通过描述它是什么来命名元素的类,而不是它的位置或它的外观.见下面的例子.

.page-container
     .page-wrap-header-n-content
     .page-header
          .branding-logo
          .branding-tagline
          .wrapper-search
          .page-nav-main
     .page-main-content
     .page-secondary-content
          .nav-supplementary
     .page-footer
          .site-info
Run Code Online (Sandbox Code Playgroud)

表示命名约定:通过描述其位置和/或外观来命名元素的类.见下面的例子.

.theme-ocean-blue
.theme-apricot-orange
.skin-red-tango
.skin-darkness
Run Code Online (Sandbox Code Playgroud)

语义命名约定:通过描述它所包含的内容来命名.如在.见下面的例子.

.product-review
.notification
.language-switch
.currency-switch
.list-of-friends
.latest-status
Run Code Online (Sandbox Code Playgroud)

BEM命名约定:代表"块,元素,修饰符".语法就是这样的<module-name>__<sub-module-name>--<modifier-or-state>.Block是一个"主"容器,一种模块/组件,无论你怎么称呼它.元素只是主要组件(块)的子组件.修饰语是某种状态.特性:语法(使用dbl下划线和dbl破折号)和子元素必须包含其最接近的组件名称.见下面的例子.

.nav-primary
.nav-primary__list
.nav-primary__item
.nav-primary__link
.nav-primary__link--is-active

.grid
.grid__item
.grid__description
.grid__img-wrap
.grid__img

.global-footer
.global-footer__col
.global-footer__header
.global-footer__link
Run Code Online (Sandbox Code Playgroud)

OCSS命名约定:代表面向对象的CSS.使用皮肤进行品牌宣传或设计的一致性(即bg颜色,边框颜色......).抽象结构样式.下面的抽象结构样式示例.OOCSS的两个主要原则:分离结构和皮肤,其次是单独的容器和内容.

 .global-width {
      min-width: 780px;    /* minimum width */
      max-width: 1400px;   /* maximum width */
      margin: 0 auto;      /* Centering using margin: auto */
      position: relative;  /* Relative positioning to create a positioning context for child elements */
      padding-left: 20px;
      padding-right: 20px;
      overflow: hidden;    /* Overflow set to "hidden" for clearfixing */
 }
Run Code Online (Sandbox Code Playgroud)

一些CSS指南:

有一个"趋势"来分享你的CSS样式指南,这里有一些你可以阅读以挑选任何看起来适合你的需求(命名约定,但更多,这可能超出你的问题的范围):


我有偏见:

我目前使用BEM,语义结构命名约定的混合,并且它已经运行得很好.

BEM语义很好地协同工作(是的,我将我的类命名为 .list-of-friends__single-friend).BEM使事情变得特别简单:CSS中没有嵌套的疯狂和非常冗长的代码.

结构命名约定也欢迎网站的裸结构,或者如果网站有多个结构,则每个"模板".在我看来,这应该仅用于非常通用的元素,因此请谨慎使用.

演示命名约定:真的吗?谢谢,但不,谢谢.你可以在特殊情况下考虑它(即皮肤整个页面在不同的主题).

OCSS命名惯例:我必须承认,仍然需要进一步研究这个问题.我在下面的资源中提供了链接,供您进一步调查.


资源:

  • +1为最全面的答案之一!我个人认为,如果将来要更改站点的布局,BEM约定会更加万无一失. (2认同)

Rya*_*nce 19

很多人都没有意识到你可以做到这一点:

.awesome {
 /* rules for anything awesome */
}

div.awesome {
 /* rules for only awesome divs */
}

button.awesome {
 /* rules for any awesome buttons, but not awesome divs */
}

div.awesome h1 {
 /* rules for H1s inside of any div.awesome */
}

div.awesome>button {
 /* rules for immediate children buttons (not grandchildren+) of div.awesomes */
}
Run Code Online (Sandbox Code Playgroud)

  • 另一个陷阱:如何在项目中搜索所有具有“ awesome”类的按钮?您不能,因此您只需要手动过滤按钮。这就是为什么您的约定没有针对企业级项目进行优化的原因 (2认同)

ale*_*lex 11

我不会在类型前添加前缀,因为如果必须的话,你可以在选择器中推断出这个

form#contact {
    property: value;

}
Run Code Online (Sandbox Code Playgroud)

您描述的方法称为匈牙利表示法,并不是很受欢迎.

对于你提到的内容,你可以将注入的HTML放在一个具有一个唯一类/ id的div中,这有一种本地化的重置.查找CSS选择器特性以确保您的规则将生效,而不是主机页面的CSS中的其他规则.有关在父页面中设置元素样式的类似问题,请参阅此答案.