HTML 和 CSS 之间的关注点分离
尽管从 HTML CSS 外部化应该被认为是独立的,但实际上并不是在插入 HTML 元素特定的选择器的情况下。在您的选择器与实际 HTML 元素相关的情况下,它们的层次结构使您的 CSS 与您的 HTML 源紧密绑定。这使您的 CSS 不灵活,并且可能比应有的更大。
因此 CSS 类。每当您使用类时,只要它们定义了足够的属性,这些定义就可以附加到任何 HTML 元素。尽管由于附加属性,您的 HTML 会变得更大,但语义不会改变。
为什么.form-button
比input[type=submit]
那时更好?
因为您可以将您的容器更改<input type=submit />
为<button type=submit>
容器,并为 UI 设计师提供更多的设计自由。如果您使用 CSS 类,那么您可能不会对其属性进行太多更改,但如果您使用标签名称,则必须彻底检查您的 CSS 文件并对其进行修改。
另一个例子是其他类型的输入,即取消按钮。如果它在视觉上与提交按钮相同,设计师可能会说提交是主要操作,取消是次要操作,因此它应该仅显示为一个链接。使用类将再次减少维护。
为什么只有类的 CSS 也不是灵丹妙药?
某些元素可能具有其他元素没有的特定 CSS 属性。以(未)有序列表为例。在这种情况下,编写基于标签的选择器来定义适用于特定 HTML 元素的 CSS 样式确实很有意义。但是为了避免选择页面上所有相同类型的元素,建议将 CSS 选择器定义为基于标签和基于类的选择器的组合。这可以说是在这种情况下有意义的CSS 类选择器约束。
建议仅将公共样式属性与基于类的选择器分开,并将特定样式添加到基于标签+类的选择器,约束为(LESS/SCSS 语法):
/* generic */
.navigation {
background-color: #999;
margin: 0;
.item {
display: inline-block;
padding: 10px;
}
}
/* specific to UL */
ul.navigation {
list-style: none;
}
这为您提供了最大的自由度并最大限度地提高了可维护性。
结论:基于类的选择器是首选提示:OOCSS
是的。大多数时候。通过这种方式,您将能够编写面向对象的 CSS(关于 SmashingMag 的文章,GitHub 存储库),减少代码重复和异常。它将提高您的 CSS 可维护性。
重要提示:与任何代码一样,您也不应该过度设计您的 CSS。我已经向您展示了如何提供灵活的样式定义,但您不应该总是遵循这些规则。您应该在开始时提供足够的灵活性,并在进行时根据需要进行重构。但大多数时候让自己站在课堂一边。