【发布时间】:2012-12-14 00:07:54
【问题描述】:
我在编写 CSS 时已经开始使用 BEM methodology,并且在少数情况下我很难找到做某件事的最佳方式。
我想在这里举一个简单的面板示例。
假设我正在使用 BEM 样式编写面板组件 CSS。所以我的 CSS 可能如下所示:
.panel {}
.panel__titlebar {}
.panel__content { display: none; }
面板可以是无镀铬的,也可以是镀铬的。所以我为面板定义了另一个修饰符类:
.panel--with-chrome {
border: 4px solid black;
border-radius: 4px;
}
现在让我们说,面板可以处于全屏/最大化状态,其中 chrome 和标题栏也会消失。不要为面板和标题栏定义修饰符,明智的做法是仅在父级(例如面板--全屏)上定义修饰符,其余元素应相应更改。所以现在我的 CSS 变成了:
.panel--fullscreen {
/* something has to be done here */
}
.panel--fullscreen .panel__titlebar { display: none; }
要在全屏模式下删除 chrome,我可以:
在 JS 中切换 panel--with-chrome 类和 panel--fullscreen 类
覆盖 panel--fullscreen 类中的 chrome CSS。
第一个不好,因为理想情况下我只想在 JS 中切换一个类 (.panel--fullscreen) 来切换全屏模式。
第二个不好,因为我必须覆盖以前的 CSS,这是一种不好的做法。
那么最好的方法是什么?感谢您的 cmets。
谢谢
【问题讨论】:
-
第一种方法有什么问题?您删除类
panel--with-chrome并添加panel--fullscreen,对吗? -
@apnerve 将单个修饰符类添加到父级的全部意义在于,其他所有内容都会根据最顶层父级上的一个类重置......在 CSS 和 JS 中。我现在可以在 JS 中更改 2 个类,但应用程序可能会扩展,我可能必须更改更多这样的类,这不好。另外,我猜 JS 应该最不知道所有这些修饰符类。它只需要知道它必须切换一个全屏类。
-
好的。在方法 2 的情况下,您可能必须覆盖 CSS,但这不是修饰符应该如何工作的吗? (我刚刚读过 BEM,但还没有在任何项目中实现它)