stylus-lang 和命名空间中的 BEM 层次结构
BEM hierarchy in stylus-lang and namespace
考虑这个 html(用 BEM 方法编写):
<div class="app app--light">
<div class="longblockname longblockname--modifier">
<div class="longblockname__element">
...
</div>
</div>
</div>
我正在尝试为此找到方便且简短的手写笔样式表,并避免在任何地方重复 longblockname
。我将用简单的 color: #111
替换真实样式,但在实际情况下有很多代码:
我开始于:
.longblockname
&__element
color #111
然后我希望块修改器影响元素:
.longblockname
&__element
color #111
&--modifier
// How to refer to &__element here?
// If I use &__element, it will compile to `.longblockname--modifier__element`
// But I need `.longblockname--modifier .longblockname__element`
我看到有两种方法可以实现:
不要使用换行符:
.longblockname
&__element
color #111
&--modifier &__element
color #222
这会起作用,但是如果我们想使用 stylus 的嵌套功能,有什么方法可以避免丑陋的 ^[-1]
语法,例如:
.longblockname
&__element
color #111
&--modifier
& ^[-1]
&__element
color #222
好吧,可能这只是语法偏好,但对我来说,使用 &&
之类的东西来引用嵌套的父项会更好。
那么,真正的问题来了。有没有办法在手写笔中声明 css 命名空间?整个应用程序用具有 app app--light
样式的容器包装。我希望这种风格影响容器内的一切。我首先将所有内容放入 .app-light 中:
.app--light
.longblockname
&__element
color #333
&--modifier
& ^[-1]__element
color #444
但这行不通,因为 & ^[-1]__element
会编译成 .app-light .longblockname--modifier .app--light .longblockname__element
,而正确的语法应该是 .app--light .longblockname--modifier .longblockname__element
。我希望 .app--light
前置任何样式声明,但只是第一次。有什么办法吗?
您可以使用 Ranges in partial references 来仅获取您想要的树中的选择器:
手写笔
.app--light
& .longblockname
&__element
color #333
&--modifier
& ^[1..1]__element
color #444
输出
.app--light .longblockname__element {
color: #333;
}
.app--light .longblockname--modifier .longblockname__element {
color: #444;
}
考虑这个 html(用 BEM 方法编写):
<div class="app app--light">
<div class="longblockname longblockname--modifier">
<div class="longblockname__element">
...
</div>
</div>
</div>
我正在尝试为此找到方便且简短的手写笔样式表,并避免在任何地方重复 longblockname
。我将用简单的 color: #111
替换真实样式,但在实际情况下有很多代码:
我开始于:
.longblockname
&__element
color #111
然后我希望块修改器影响元素:
.longblockname
&__element
color #111
&--modifier
// How to refer to &__element here?
// If I use &__element, it will compile to `.longblockname--modifier__element`
// But I need `.longblockname--modifier .longblockname__element`
我看到有两种方法可以实现:
不要使用换行符:
.longblockname
&__element
color #111
&--modifier &__element
color #222
这会起作用,但是如果我们想使用 stylus 的嵌套功能,有什么方法可以避免丑陋的 ^[-1]
语法,例如:
.longblockname
&__element
color #111
&--modifier
& ^[-1]
&__element
color #222
好吧,可能这只是语法偏好,但对我来说,使用 &&
之类的东西来引用嵌套的父项会更好。
那么,真正的问题来了。有没有办法在手写笔中声明 css 命名空间?整个应用程序用具有 app app--light
样式的容器包装。我希望这种风格影响容器内的一切。我首先将所有内容放入 .app-light 中:
.app--light
.longblockname
&__element
color #333
&--modifier
& ^[-1]__element
color #444
但这行不通,因为 & ^[-1]__element
会编译成 .app-light .longblockname--modifier .app--light .longblockname__element
,而正确的语法应该是 .app--light .longblockname--modifier .longblockname__element
。我希望 .app--light
前置任何样式声明,但只是第一次。有什么办法吗?
您可以使用 Ranges in partial references 来仅获取您想要的树中的选择器:
手写笔
.app--light
& .longblockname
&__element
color #333
&--modifier
& ^[1..1]__element
color #444
输出
.app--light .longblockname__element {
color: #333;
}
.app--light .longblockname--modifier .longblockname__element {
color: #444;
}