繁体   English   中英

动态LESS mixin

[英]Dynamic LESS mixin

我正在尝试使用LESS编写动态mixin,以根据ID自动生成CSS。 LESS可以吗?

// Variables
@body-margin: 50px;
@body-margin-tablet: 30px;
@body-margin-mobile: 20px;

@body-padding: 150px;
@body-padding-tablet: 130px;

// Mixin
#spacing(@id) {
    & when ( @{id}-margin ) {
        margin: @{id}-margin;
    }

    & when ( @{id}-padding ) {
        padding: @{id}-padding;
    }

    @media (max-width: 900px) {
        & when ( @{id}-margin-tablet ) {
            margin: @{id}-margin-tablet;
        } 

        & when ( @{id}-padding-tablet ) {
            padding: @{id}-padding-tablet;
        } 
    }

    @media (max-width: 500px) {
        & when ( @{id}-margin-mobile ) {
            margin: @{id}-margin-mobile;
        } 

        & when ( @{id}-padding-mobile ) {
            padding: @{id}-padding-mobile;
        } 
    }
}

body {
    #spacing('body');
}

预期结果:

body {
    margin: 50px;
    padding: 150px

    @media (max-width: 900px) {
        margin: 30px;
        padding: 130px;
    }

    @media (max-width: 500px) {
        margin: 20px;
    }
}

所以这个问题基本上有两个部分。 第一个是如何在mixin中动态插值变量名,第二个是如何确定插入的变量是否存在。

第一部分可以像这样完成:

@body-margin: 50px;

.spacing(@id) {
  margin: ~"@{@{id}-margin}";
}

如果你这样做,那么使用

body {
  .spacing('body);
}

会给你预期的CSS输出

body {
  margin: 50px;
}

在此处阅读更多相关内容: 使用LESS CSS定义变量变量

第二部分,确定插值变量是否存在,我认为你不能做到这一点。 您将不得不提前定义所有可能的变量,但这并不意味着您无法明确定义这些变量的方式。

假设您不想为@body-padding-mobile定义变量。 在这种情况下,您可以执行以下两种操作之一,无论您认为哪种方式对您更有帮助。

第一个是你可以设置变量值等于CSS中的默认值( 0 ,在padding的情况下),或者只是initial

或者,如果您担心这意味着您最终会覆盖您不想覆盖的样式,那么更糟糕的解决方案就是使变量等于无效值,因此浏览器永远不会应用该样式。 例如: @body-padding-mobile: fishsticks


假设你已经声明了mixin所需的所有变量,你可以使用这个mixin来获得你想要的:

.spacing(@id) {
  margin: ~"@{@{id}-margin}";
  padding: ~"@{@{id}-padding}";
  @media (max-width: 900px) {
    margin: ~"@{@{id}-margin-tablet}";
    padding: ~"@{@{id}-padding-tablet}";
  }
  @media (max-width: 500px) {
    margin: ~"@{@{id}-margin-mobile}";
    padding:~"@{@{id}-padding-mobile}";
  }
}

所以,如果我们从这开始:

@body-margin: 50px;
@body-margin-tablet: 30px;
@body-margin-mobile: 20px;

@body-padding: 150px;
@body-padding-tablet: 130px;
@body-padding-mobile: 0;

body {
  .spacing('body');
}

我们会得到这个:

body {
  margin: 50px;
  padding: 150px;
}
@media (max-width: 900px) {
  body {
    margin: 30px;
    padding: 130px;
  }
}
@media (max-width: 500px) {
  body {
    margin: 20px;
    padding: 0;
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM