Less 具有多个条件/嵌套保护的保护

Less 具有多个条件/嵌套保护的保护,less,Less,我试图制作一个mixin,它同时计算参数typ和compare值 假设我有一个mixin来创建一个CSS3渐变,为旧的浏览器提供了后备功能,但是如果没有输入开始和/或结束颜色,则只输出背景颜色。除了检查输入的所有颜色是否正确之外,我还希望确保开始颜色或结束颜色都不等于回退颜色 这是我希望使用标准逻辑编写它的方式,但我不允许将卫兵嵌套在一起 .gradient(@color, @start: 0, @stop: 0) when (iscolor(@color)) and (iscolor(@sta

我试图制作一个mixin,它同时计算参数typ和compare值

假设我有一个mixin来创建一个CSS3渐变,为旧的浏览器提供了后备功能,但是如果没有输入开始和/或结束颜色,则只输出背景颜色。除了检查输入的所有颜色是否正确之外,我还希望确保开始颜色或结束颜色都不等于回退颜色

这是我希望使用标准逻辑编写它的方式,但我不允许将卫兵嵌套在一起

.gradient(@color, @start: 0, @stop: 0) when (iscolor(@color)) and (iscolor(@start)) and (iscolor(@stop)) and not ((@start = @color) and (@stop = @color)) {
    background: @color;
    background: -webkit-gradient(linear,left bottom,left top,color-stop(0, @start),color-stop(1, @stop));
    additional-browser-specific-prefixes;
}

.gradient(@color, @start: 0, @stop: 0) when (default()) {
    background-color: @color;
}
基本上,我希望执行以下Javascript条件:
if(iscolor(color)&&iscolor(start)&&iscolor(end)&&iscolor(start)&&iscolor(start!==color&&end!==color))
。有人知道这是否可能吗


任何想法都将不胜感激

Less-guard应该具有与CSS@media相同的实现(这可能只适用于语法??)。我找不到@media的例子,它使用您尝试使用的操作符的嵌套方式。所以CSS@media是不可能的,而更少的守卫也是不可能的

但是,我发现:

not运算符的优先级非常低。例如,不是 在以下查询中最后计算:

@media not all and(-moz-windows合成器){…}

这意味着查询的计算方式如下:

@media not(全部和(-moz-windows合成器)){…}

。。。而不是像这样:

@media(并非全部)和(-moz-windows合成器){…}

这意味着您不必在
not
关键字后面加上额外的括号。以下代码应该可以工作:

.gradient(@color,@start:0,@stop:0)在(iscolor(@color))和(iscolor(@start)而不是@start=@color)和(@stop=@color)时,但不幸的是,这并没有按预期工作。
如果Less-guard的操作符优先级必须等于CSS@media的操作符优先级,这可能被认为是一个bug

update我的上述假设是错误的,
not
关键字将仅应用于全媒体查询(或保护),因此
not(a)、not(b)
毫无意义。另见:

如果上述情况属实,请尝试恢复条件: .gradient(@color、@start:0、@stop:0) 当(@start=@color)和(@stop=@color)、not(iscolor(@color))、not(iscolor(@start))、not(iscolor(@stop)){ 背景色:@色; }

或者尝试使用嵌套的mixin,如下所示:

default(@a,@b,@c){
property: default;
}
.fallback(@a,@b,@c){
property: fallback;
}

.background(@a,@b,@c) when (@a>0) and (@b>0) and (@c>0)
{
.and(@a,@b,@c) when (@a=@c) and (@b=@c) {
.fallback(@a,@b,@a);
}
.and(@a,@b,@c) when (default()){
.default(@a,@b,@a);
}
.and(@a,@b,@c);
}
.background(@a,@b,@c) when (default())
{
.fallback(@a,@b,@c);
}

test0 { .background(0,1,1); }
test1 { .background(1,1,1); }
test2 { .background(2,1,1); }
test3 { .background(1,2,1); }
test4 { .background(1,1,2); }

谢谢你的全面答复。带还原保护的混入无法按预期工作,如果开始和停止颜色与回退颜色相同,它仍将呈现正结果并打印渐变。我想有一种方法可以使用经过评估的Javascript来解决这个问题,但这不仅不切实际,而且在我看来也是一种不好的做法。不过,我会接受你的回答,因为可以嵌套混音以获得预期的结果,即使这是一种有点乏味的实现方式。经过更多的测试,我认为你的回答是正确的,事实上,恢复的警卫将无法工作。尝试将
not(iscolor(@))
替换为
(iscolor(@)=false)
,恢复后的防护似乎工作正常。我错误地假设
不是
关键字
not@a,@b
应该被评估为
not(@a,@b)
,而not(@a),not(@b)根本没有意义。From::“not关键字适用于整个媒体查询…”很好!我们可以在较少的回购中发行相应的债券,但我怀疑
not
的优先权是否会改变(即使它与CSS规范冲突)-主要问题是,如果
not a和b
等于
not(a和b)
,那么你将如何编写
not(a)和b
?假设
用例与
@media
用例有很大差异时,即使语法本身假装是继承的,我想对于特定问题更好的解决方案是允许嵌套的
以及
而不是更改
的优先级。
default(@a,@b,@c){
property: default;
}
.fallback(@a,@b,@c){
property: fallback;
}

.background(@a,@b,@c) when (@a>0) and (@b>0) and (@c>0)
{
.and(@a,@b,@c) when (@a=@c) and (@b=@c) {
.fallback(@a,@b,@a);
}
.and(@a,@b,@c) when (default()){
.default(@a,@b,@a);
}
.and(@a,@b,@c);
}
.background(@a,@b,@c) when (default())
{
.fallback(@a,@b,@c);
}

test0 { .background(0,1,1); }
test1 { .background(1,1,1); }
test2 { .background(2,1,1); }
test3 { .background(1,2,1); }
test4 { .background(1,1,2); }