我试图了解和理解 CSS 命名约定(如 BEM 或 SUITCss)背后的原因。在存在 SCSS 的情况下,我很难理解后代类名的价值。
例如:
<ul class="menu">
<li class="menu__item"></li>
<li class="menu__item"></li>
<li class="menu__item">
<a href="#" class="menu__item_link">link</a>
</li>
</ul>
.menu {
.menu__item {
//styles
.menu__item__link { //styles }
}
//or alternatively this syntax..
&__item { //styles }
}
有了在 SCSS 中嵌套规则的能力,我看不出有什么令人信服的理由让我在我的代码中包含祖先类名。上面我定义了应该只用于“菜单”内的“项目”的样式,使用后代类名。但是,嵌套结构已经传达了这一点!menu__item 的规则无论如何都只适用于菜单下的项目,那么为什么我需要在类名中包含它呢?
为什么不:
<ul class="menu">
<li class="item"></li>
</ul>
.menu {
.item {//styles}
}
我知道后代命名约定更明确,也许对未来更友好。然而,我认为它只是在 html 中更加明确。如果我想咨询如何构建这个“菜单”模块,我可以参考 CSS 并清楚地了解菜单是如何嵌套其中的项目的。
我想一个可能的优势是我可以编写非嵌套的 css,如下所示:
.menu { //styles }
.menu__item { //styles }
.menu__item__link { //styles }
然后在任何地方使用“menu__item”,它仍然会在类名中明确表明这是菜单下项目的样式..但是为什么将它定义为菜单的后代呢?(我想,另一个优点是如果没有嵌套,CSS 标识符字符串会更短)
在我看来,如果一个类名被用作另一个类名的后代,那么 SCSS 中的嵌套可以实现这一点并清楚地呈现该逻辑。那么为什么需要这种 BEM 语法呢?
我想听听有人解释这种约定的原因。我想坚持所谓的最佳实践,但在不完全理解约定的情况下,我很难盲目地这样做。