我刚刚阅读了 CSS 的可扩展和模块化架构,它让我思考了一些事情。Snook 的两条原则是:
- 增加一段 HTML 和内容的语义价值
- 降低对特定 HTML 结构的期望
因此,这意味着使用语义类名称而不是依赖非语义元素类型进行定位。例如,而不是定位.someClass h5
,我可能会定位,.someClass-title
这样如果 h5 被换成别的东西,事情就不会中断。
就我个人而言,我发现以元素的名称编码元素的层次结构有点令人不快(即使它在语义上是正确的)。我宁愿做.someClass .title
. 但是要使用像标题一样通用的类,您需要接受这个类将在许多不同的上下文中使用。
那么,如果我知道它会被选择器中的前一个项目命名,那么在完全不同的上下文中使用同一个类有什么问题吗?
例如,假设我的网站中有三个不同的地方,其中一类“标题”是有意义的:
HTML
<header class="pageHeader">
<h1 class="title">Some Title</h1>
</header>
...
<article class="leadArticle>
<h3 class="title">Some Article Title</h3>
</article>
...
<ul class="productPreviews">
<li class="product">
<h5 class="title">Some Product Name</h5>
</li>
</ul>
CSS
.pageHeader .title
{
}
.leadArticle .title
{
}
.productPreview .product .title
{
}
编辑:正如Alohci在下面的回答中提到的那样,标题标签并非没有语义,所以也许这不是最好的例子。
显然,在这些上下文中我可能会做一些与标题完全不同的事情,但是标题对于它的模块命名空间来说绝对有意义,而且我从来没有打算将标题用作一般选择器。
这似乎勾选了所有方框。它语义丰富,与实现完全解耦。例如,如果将最后一个示例更改为 ol 或一堆 div,则不会破坏任何内容,并且如果将 title 包装在 div 中,它仍然会成为目标。
这对我来说很有意义,但我没有看到这种方法被大量使用,我想知道为什么。一个明显的缺点是您在选择器中链接类,但我认为这比命名每个类名更可取。