How to pass a property name as an argument to a mixin in less

前端 未结 4 1295
说谎
说谎 2020-12-06 21:11

I want to make a function/mixin that will make a color darker if it is already dark but lighter when it is light (normalize/extremeize?)

Is it possible to do this by

相关标签:
4条回答
  • 2020-12-06 21:26

    This is currently a feature request on less.js github. So look out for it in less.js 1.4.. until then you can hack it like so...

    .mixin(@prop, @value) {
        Ignore: ~"a;@{prop}:@{value}";
    }
    

    Not very nice and you get an extra property but its the only way at the moment.

    0 讨论(0)
  • 2020-12-06 21:36

    Guarded Mixins should be what you are looking for, however you can not use variables to define properties, only their values. So you can do it like this:

    .normalize(@color, @amount) when (lightness(@color) >= 50%)
    {
        color:lighten(@color, @amount);
    }
    
    .normalize(@color, @amount) when (lightness(@color) < 50%)
    {
       color:darken(@color, @amount);
    }
    

    So this:

    .class1 {
        .normalize(#ffffd, 10%);
    }
    

    Will output this:

    .class1 {
      color: #f7f7f7;
    }
    

    But you can not actually pass a property name as a variable. This is a limitation of LESS unfortunately, and while I've seen ways around it for things like margin direction, there is not a way to just pass any ol' property using a variable.

    0 讨论(0)
  • 2020-12-06 21:45

    This feature was added since v1.6.0:

    @property: color;
    
    .widget {
      @{property}: #0ee;
      background-@{property}: #999;
    }
    

    Compiles to:

    .widget {
      color: #0ee;
      background-color: #999;
    }
    

    See http://lesscss.org/features/#variables-feature-properties

    0 讨论(0)
  • 2020-12-06 21:50

    In the corresponding issue on Less' GitHub there is a workaround suggested by cloudhaed:

    .blah ()      { color: black }                 // All blahs
    .blah(right)  { padding-right: 20px }          // Right blahs
    .blah(left)   { padding-left: 20px }           // Left blahs
    
    @side: left;
    .class { .blah(@side) }
    

    Output

    .class { color: black; padding-left: 20px;}
    

    Maybe this will do?

    0 讨论(0)
提交回复
热议问题