Answers:
正如Kumar所指出的,自Sass以来,这是可能的3.3.0.rc.1 (Maptastic Maple)
。
@ at-root指令使一个或多个规则在文档的根目录发出,而不是嵌套在其父选择器下方。
我们可以将@at-root
指令与插值#{}
结合起来以达到预期的结果。
萨斯
.item {
color: black;
@at-root {
a#{&} {
color:blue;
}
}
}
// Can also be written like this.
.item {
color: black;
@at-root a#{&} {
color:blue;
}
}
输出CSS
.item {
color: black;
}
a.item {
color: blue;
}
.item a.item
出于某种原因而输出。我也尝试过a#{&}
自己做,但结果仍然相同。
的@at-root
,如果你打算扩大最接近的选择了连锁-only方法不能解决问题。举个例子:
#id > .element {
@at-root div#{&} {
color: blue;
}
}
将编译为:
div#id > .element {
color: blue;
}
如果您需要加入标签.element
而不是标签#id
怎么办?
Sass中有一个函数selector-unify()
可以解决此问题。结合使用@at-root
它可以定位.element
。
#id > .element {
@at-root #{selector-unify(&, div)} {
color: blue;
}
}
将编译为:
#id > div.element {
color: blue;
}
#id > .element #id > div.element { color: blue; }
。另一种方法是使用selector_replace
,#id { > .element { @at-root #{selector-replace(&,'.element', 'div.element')} { color: blue;}}}
。这是要点,以提高可读性。
selector-replace
也是另一种实现方法,但是它需要知道选择器是什么。该selector-unify
方法的好处是可以在混合中使用。
对于初学者,(在编写此答案时)没有使用选择器&的 sass语法。如果要执行类似的操作,则需要在选择器和&符之间留一个空间。例如:
.item {
.helper & {
}
}
// compiles to:
.helper .item {
}
使用“&”号的另一种方法可能是您(错误地)在寻找:
.item {
&.helper {
}
}
// compiles to:
.item.helper {
}
这使您可以使用其他类,ID,伪选择器等扩展选择器。不幸的是,对于您的情况,理论上将其编译为.itema之类的东西,显然不起作用。
您可能只想重新考虑如何编写CSS。是否可以使用父元素?
<div class="item">
<p>text</p>
<p>text</p>
<a href="#">a link</a>
</div>
这样,您可以通过以下方式轻松编写SASS:
.item {
p {
// paragraph styles here
}
a {
// anchor styles here
}
}
(旁注:您应该看一下html。您正在混合单引号和双引号,并将href属性放在p标签上。)
href
标记p
以编写有效的CSS。
.item { a& { ... } }
现在可以通过@Blaine用指出.item { @at-root a#{&} { ... } }
。关键是,如果您在元素上有一个类很容易做到,.item { &.class { ... } }
那么为什么不可以对原始html元素做同样的事情。仅仅因为在OP发布之时没有办法做到这一点并不意味着他不希望该功能实际执行。
AFAIK如果要同时为类和标记组合“&”号,则需要使用以下语法:
.c1 {
@at-root h1#{&},
h2#{&}
&.c2, {
color: #aaa;
}
}
将编译为
h1.c1,
h2.c1,
.c1.c2 {
color: #aaa;
}
其他用途(例如,使用之前的类@at-root
或使用多个@at-root
)将导致错误。
希望它会有用
#{&}
这基本上是在欺骗编译器-否则将来会一直有效!?
#{}
被评估。也&
表示电流选择器。因此#{&}
被评估为.c1
。
此功能已安装在最新版本的Sass中, 3.3.0.rc.1
(Maptastic Maple)
您需要使用的两个紧密相关的功能是scriptable &
(可在嵌套样式中插值以引用父元素)和@at-root
指令(将紧随其后的选择器或css块放置在根目录(不会输出的CSS中有任何父母)
有关更多详细信息,请参见此Github问题