如何在LESS中使用if语句

nki*_*int 55 css if-statement less

我正在寻找某种if语句来控制background-color不同的div元素.

我已经尝试了下面的内容,但它没有编译

@debug: true;

header {
  background-color: (yellow) when (@debug = true);
  #title {
      background-color: (orange) when (@debug = true);
  }
}

article {
  background-color: (red) when (@debug = true);
}
Run Code Online (Sandbox Code Playgroud)

Onu*_*rım 119

有一种方法可以将保护用于个人(或多个)属性.

@debug: true;

header {
    /* guard for attribute */
    & when (@debug = true) {
        background-color: yellow;
    }
    /* guard for nested class */
    #title when (@debug = true) {
        background-color: orange;
    }
}

/* guard for class */
article when (@debug = true) {
    background-color: red;
}

/* and when debug is off: */
article when not (@debug = true) {
    background-color: green;
}
Run Code Online (Sandbox Code Playgroud)

......并且少于1.7; 编译为:

header {
    background-color: yellow;
}
header #title {
    background-color: orange;
}
article {
    background-color: red;
}
Run Code Online (Sandbox Code Playgroud)

  • 这是对原始问题的更接近答案.主题启动者没有要求混合. (6认同)
  • 我很确定这解决了OP正在寻找的问题和方法.谢谢你提供这个. (2认同)

fre*_*osh 50

LESS具有mixins的保护表达式,而不是单个属性.

所以你要创建一个这样的mixin:

.debug(@debug) when (@debug = true) {
    header {
      background-color: yellow;
      #title {
          background-color: orange;
      }
    }

    article {
      background-color: red;
    }
}
Run Code Online (Sandbox Code Playgroud)

通过拨打.debug(true);.debug(false)(或根本不打电话)打开或关闭它.


Pas*_*zyk 21

我偶然发现了同样的问题,我找到了解决方案.

首先确保至少升级到LESS 1.6.你可以npm用于那种情况.

现在您可以使用以下mixin:

.if (@condition, @property, @value) when (@condition = true){
     @{property}: @value;
 }
Run Code Online (Sandbox Code Playgroud)

从LESS 1.6开始,您也可以将PropertyNames传递给Mixins.例如,您可以使用:

.myHeadline {
   .if(@include-lineHeight,  line-height, '35px');
}
Run Code Online (Sandbox Code Playgroud)

如果@include-lineheight解析为true,则 LESS将打印出来,line-height: 35px如果@include-lineheight不为真,它将跳过mixin.


小智 8

我为一些语法糖写了一个mixin;)
也许有人喜欢这种写作方式if-then-else比使用guards更好

取决于少1.7.0

https://github.com/pixelass/more-or-less/blob/master/less/fn/_if.less

用法:

.if(isnumber(2), {
    .-then(){
        log {
            isnumber: true;
        }
    }
    .-else(){
        log {
            isnumber: false;
        }
    }
});

.if(lightness(#fff) gt (20% * 2), {
    .-then(){
        log {
            is-light: true;
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

使用上面的例子

.if(@debug, {
    .-then(){
        header {
            background-color: yellow;
            #title {
                background-color: orange;
            }
        }
        article {
            background-color: red;
        }
    }
});
Run Code Online (Sandbox Code Playgroud)