As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened,
visit the help center提供指导。
11年前关闭。
我只使用类,而不使用ID。
许多人出于不同的原因喜欢使用ID。
我已经看到了许多关于ID与Stackoverflow上的类的问题,但没有人从兼容性和运行时性能的 Angular 来讨论纯代码组织的观点。
从代码组织的 Angular 来看,我认为使用ID就像在Visual Basic代码中使用全局变量一样不好。
原因之一是ID必须是唯一的,这会在代码的不同独立部分(控制HTML DOM树的不同部分)之间引入不必要和严重的依赖性。
另一个原因是,实际上,创建新的类名要比ID命名容易,因为使用ID时,您不必担心全局范围,而使用类名时,则只需担心局部范围的唯一性,这与局部变量的好处相同。
大多数人会认为按ID寻址比按类寻址的性能要好,我同意这一点。但是,随着浏览器变得更加先进,并且从javascript到CSS的本地实现,计算机也变得越来越快,性能变得越来越不重要。因此,让我们忽略它,仅在当前问题的上下文中专注于代码的组织。
讨论从
here开始,但是我潜在的错误建议产生了负面意见,并且变得太大而无法发表评论,因此在这里,我尝试将其转换为积极且易于管理的内容。
支持ID的一个明显观点是将它们用作规则优先级的工具,因为#name的优先级高于.name的优先级。
我的回答:使用ID来提高优先级是不好的技巧,如果您在主体和其他树的级别之间插入其他根元素,使用ID来提高优先级会更干净,例如
body div div span.class1{}
的优先级高于
body div span.class1{}
的优先级高于
body span.class1{}
的优先级高于
span.class1{}
。另一个用于此目的的工具是
!important
。
有人可能会争辩说,当页面结构发生更改时,使用更多根元素会带来更多困难,但是我认为情况并非如此,因为您不必在body和为优先级div指定的内容之间放置任何内容。这些div始终可以位于正文之下,而在所有其他内容之上。
另一个有趣的关联是指针,并且ID不错,因为指针还不错。
我的回答:如果您在代码中硬编码绝对内存地址,则指针是错误的。使用相对指针总是更好(例如:在8086 CPU中使用segment(CS,DS,SS,ES);由编译器生成的相对变量和方法地址)。如果我们将DOM树视为内存,并使用ID与使用类进行比较,则
#name
表示绝对内存地址,但是
div.tab1 .name
表示相对地址(相对于
div.tab1
)。
我看到的ID的另一个支持点是,随着javascript成为全局属性,具有ID的元素更容易在javascript中使用。我的回答:再次,这就像说Visual Basic中的全局变量更方便地可用。问题在于,如果不引入诸如level1_level2_name之类的命名层次结构,就无法按顺序保留足够大的全局(或任何其他)命名空间,这只是一种用另一种命名空间机制替换的技巧。 DOM树足够方便地组织 namespace ,为什么不理会它呢?
使用下划线在ID中进行 namespace 模拟是不好的,因为您无法建立命名上下文,并且必须在代码中的所有位置重复所有路径。实际上,这意味着您将无法使用可修复CSS无法使用上下文的CSS
preprocessors。