Sass 有条件地使用选择器包装规则
我试图做的是一个mixin,它有一个可选的参数来包含或不包含规则周围的选择器。以下是预期的行为:Sass 有条件地使用选择器包装规则,sass,Sass,我试图做的是一个mixin,它有一个可选的参数来包含或不包含规则周围的选择器。以下是预期的行为: @include smth(true) => .class{ color:blue } @include smth(false) => color: blue 我试过这样的方法: @mixin smth($selector:true){ @if $selector { .class{ } color: blue; @if $selector{
@include smth(true) => .class{ color:blue }
@include smth(false) => color: blue
我试过这样的方法:
@mixin smth($selector:true){
@if $selector {
.class{
}
color: blue;
@if $selector{
}
}
}
显然,@if指令中的括号是问题所在。因此,我尝试将@if的内容放在双引号”.class{
下,并使用插值{.class{}
(带和不带转义字符\
}),这样它就不会干扰,但不会起任何作用。简而言之,我不希望sass处理@if的内容,只是“照原样说” 更新 从cimmanon的回答中,我设法创建了一个更通用的混音器:
@mixin conditional-wrap($condition, $selector){
@if $condition{
#{$selector}{
@content
}
}
@else{
@content
}
}
因此,我们现在可以做:
@mixin smth($selector:true){
@include conditional-wrap($selector, '.class'){
color: blue;
}
}
Sass是一种脚本语言。大括号是SCSS语法的一部分(就像其他任何使用大括号的语言一样:JavaScript、PHP、C/C++等),Sass不仅仅是“按原样放”。Sass(缩进)语法根本不使用花括号。每种语法的解析器都不同,但选择器的内部表示形式及其属性是相同的,生成CSS文件时这些结构的输出方式也是一样的:花括号根据输出样式适当插入。简言之,您要写的是什么这是不可能的
Sass不关心您如何使用SCSS语法缩进代码,它只关心匹配大括号。因此,您的mixin被解释为:
@mixin smth($selector: true) {
@if $selector {
.class {
}
color: blue;
@if $selector {
}
}
}
你能做的是改变你的逻辑
@mixin smth($selector: true) {
@at-root #{if($selector, selector-nest(&, '.class'), &)} {
color: blue;
}
}
对于Sass版本3.3或更高版本:
@mixin foo {
color: blue;
}
@mixin smth($selector: true) {
@if $selector {
.class {
@include foo;
}
} @else {
@include foo;
}
}
投票结束时出现印刷错误(提示:开始大括号不能多于结束大括号).你是说在同一个@if指令内吗?因为否则就没有了。那么你的嵌套就搞乱了,你需要找到一个编辑器来显示匹配的花括号.Thks作为解释。你的第二个解决方案是我一开始做的,但后来我意识到我最好使用2个mixin
smth
和smthSelector
rather而不是只使用一个参数。第一个解决方案看起来很有希望,我将在根目录下查找有关@和选择器嵌套的信息。您的第一个解决方案对我不起作用,这样做的全部目的是避免在最终css上重复相同的选择器。因为$selector
时根目录下的
是假的,我们将使用同一个选择器两次。@Ghetolay“不起作用”是对问题的无用描述。Sassmeister说它很好用:我不仅仅说“它不起作用”,我已经解释了(或至少尝试过)为什么它对我不起作用。下面是你的Sassmeister的一个分支,它演示了我试图解释的案例: