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