如何创建一个使用嵌套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; }
好的,首先,有个一般性的评论:使用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需要加上前缀,但看起来仍然太疯狂,则可以简化一下)。
transform
upd:修复了一些错误。