一尘不染

更少的js:Mixin属性作为另一个mixin的参数?

css

如何创建一个使用嵌套mixin属性作为参数的mixin?

我用下一个示例解释自己。

我有一个“过渡属性”混合:

.transition-property (@props){
  -webkit-transition-property: @props;
  -moz-transition-property: @props;
  -o-transition-property: @props;
  transition-property: @props;
}

从这个mixin我想使用一个’transform’mixin属性,所以我试图这样称呼:

 .transition-property(~"opacity, .transform");

‘.transform’mixin应该返回以下值之一:

 transform
 -ms-transform
 -webkit-transform

问题是我找不到将这些属性名称注入“过渡属性” mixin的方法,有人可以对此有所了解吗?

最终所需的CSS

element {
  -webkit-transition-property: opacity, -webkit-transform;
  -moz-transition-property: opacity, -moz-transform;
  -o-transition-property: opacity, -o-transform;
  transition-property: opacity, transform;
}

阅读 350

收藏
2020-05-16

共1个答案

一尘不染

好的,首先,有个一般性的评论:使用CSS预处理器(例如LESS,SASS或其他任何东西)生成供应商前缀实际上是当今滥用最大的方法之一(确实,不需要用前缀和浪费来充实您的代码)您需要花费时间编写此类mixin,因为出现了诸如Autoprefixer,-prefix-free之类的工具。

不管哪种方式,这都是(多种)通用解决方案(但考虑到代码量及其复杂性,我认为这实际上是一个矫kill过正的方法,在这里,我将使用LESS1.6.0示例,因为在早期版本中,它会变得更加冗长而笨拙):

// usage:

element1 {
    .vendorize(transition-property; opacity, transform);
}

element2 {
    .vendorize(transition-property; width, box-shadow, color);
}

element3 {
    .vendorize(transition-property; height);
}

// implementation:

// prefixes we want to be used:
@prefixes: -webkit-, -moz-, -o-, ~'';

// here we specialize what values are to be prefixed:
.vendorize-value(transform)  {.true}
.vendorize-value(box-shadow) {.true}
// etc.
.vendorize-value(...) when (default()) {.false} // to handle not prefixed values

// and now the mixin that can apply all of above specializations:
.vendorize(@property, @values) {

    .-1();
    .-1(@i: length(@prefixes)) when (@i > 0) {
        .-1((@i - 1));
        @prefix: extract(@prefixes, @i);
        .-2();
    }

    .-2(@j: length(@values)) when (@j > 0) {
        .-2((@j - 1));
        @value: extract(@values, @j);
        .vendorize-value(@value);
    }

    .false() {@{prefix}@{property}+: @value}
    .true()  {@{prefix}@{property}+: ~'@{prefix}@{value}'}
}

(当然,如果您 transform需要加上前缀,但看起来仍然太疯狂,则可以简化一下)。

upd:修复了一些错误。

2020-05-16