html – SMACSS,语义类名称和嵌套元素
我刚读了
Scalable and Modular Architecture for CSS,它让我想到了一些事情. Snook的两个主要原则是:
>增加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在下面的回答中提到的,标题标签不是非语义的,所以这可能不是最好的例子. 显然,我可能会在这些上下文中做一些与标题完全不同的东西,但title对于模块的命名空间是绝对有意义的,而且我从来没有打算使用title作为常规选择器. 这似乎勾选了所有方框.它在语义上很丰富,完全与实现分离.例如,如果最后一个示例被更改为ol或一堆div,则没有任何内容会中断,如果title被包装在div中,它仍然会被定位. 这对我来说很有意义,但我没有看到这种方法用得太多,我想知道为什么.一个明显的缺点是你在选择器中链接类,但我认为这比命名每个类名称更可取. 解决方法
我更喜欢使用像.title这样的类,而不是只选择h5元素,因为我觉得它将HTML与CSS分离了一些.无论出于何种原因,如果你认为h4或h6更适合文档大纲或其他一些元素/原因,如果你选择元素(h5)而不是选择一个类,你将不得不重构你的CSS(.标题).
这就是为什么我更喜欢将所有事情与元素选择器分类,因为标记可能会随着时间的推移而改变.如果您在一个没有看到很多更新的小型网站上工作,这可能不是一个问题,尽管知道这一点很好. 如果在完全不同的上下文中使用同一个类有任何问题,如果你知道它将被选择器中的前一个项命名,那么我对它有不同的想法. 一方面,我会想到一些问题,例如.title的使用/含义/角色可能是空的,没有它的父选择器. (.pageHeader .title)虽然我认为.title是一个非常精细的类名,但是其他开发者可能很难理解它的意思来自像.pageHeader这样的父选择器.title 另一个问题是,如果您将类.title用于模块中的多个“标题”实例,则可能会遇到问题.基本思想是,如果试图在模块中扩展.title的可重用性,那么本地作用域后代选择器提供的有时可能会受到限制.我设置了一个代码演示来展示我所说的here. 另一方面,后代选择器是最常用的选择器之一,专门用于其范围目的. Tim Murtaugh是A List Apart的开发人员之一(不确定他是不是主要开发人员)A List Apart在他的个人网站上使用了后代选择器. 我最近一直在探索这个和BEM,并同意你的结论,“这比命名每个类名更好.” 我更喜欢.pageHeader .title {…}与.pageHeader__title {…}相比,但总有一种方法可以让一种方法在另一方面更有利. 与大多数事情一样,这取决于,但我认为如果你不让嵌套过于深入并且对如何使用它们深思熟虑,那么后代选择器是提供本地范围样式的强大而好的解决方案,同时也为全局提供解决方案范围风格. 例如: /* Globally scoped styles for all .title(s) */ .title{ font-family: serif; font-weight: bold; } /* Locally scoped styles for individual .title(s) */ .pageHeader .title { color: #f00; } .leadArticle .title { color: #00f; } .productPreview .product .title { color: #0f0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |