我有一个属性@keyframes
,我使用autoprefixer编译来添加所需的前缀。
我想做的是在动画名称中添加一个参数(或者在任何可能的地方),将属性值更改为关键帧键。
这就是我现在所拥有的:
@keyframes loader {
0% { transform: translate(0, -50%) rotate(0deg); }
100% { tranform: translate(0, -50%) rotate(360deg); }
}
基本上我想做的事情:
@keyframes loader(@transform) {
0% { transform: @transform rotate(0deg); }
100% { tranform: @transform rotate(360deg); }
答案 0 :(得分:6)
将参数传递给@keyframes
不能直接在Less中完成。然而,我们可以将整个@keyframes
规则包装在父mixin中,将参数传递给mixin并在框架内使用它。
.loader(@transform){ /* wrapper mixin which accepts input parameter */
@keyframes loader {
0% { transform: @transform rotate(0deg); }
100% { transform: @transform rotate(360deg); }
}
}
.loader(translate(0, -50%)); /* mixin call */
( Curt最初提供了一个答案,但因为我不知道的原因删除了它。)
如果您感兴趣,通用关键帧mixin也可以用下面给出的Less编写。
示例1:
.generickeyframe(@name; @from; @to){ /* takes name, from frame rules, to frame rules */
@keyframes @name{
0% { @from();}
100% { @to();}
}
}
.generickeyframe(loader; {transform: translate(0,-50%) rotate(0deg)};
{transform: translate(0,-50%) rotate(360deg)});
示例2:
.keyframefromto(@name; @from; @to){
@keyframes @name{
0% { transform: @from;}
100% { transform: @to;}
}
}
.keyframefromto(loader; translate(0,-50%) rotate(0deg); translate(0,-50%) rotate(360deg));
如果@keyframes
规则中需要存在多个帧,我们可以使用数组列表和循环,如下面的代码段所示。这个mixin将动画的名称,帧的列表(它们的百分比数字)和每个帧的属性(以规则集的形式)作为参数。
.generickeyframe(@name; @framelist; @frameprops){
@keyframes @name{
.loop-framelist(@index) when (@index <= length(@framelist)){
@framepos: extract(@framelist, @index) * 1%;
@{framepos}{
@props: extract(@frameprops, @index);
@props();
}
.loop-framelist(@index + 1);
}
.loop-framelist(1);
}
}
.generickeyframe(loader;
0,25,50,75,100;
{transform: translateX(10px);},
{transform: translateX(20px);},
{transform: translateX(50px);},
{transform: translateX(20px);},
{transform: translateX(10px);}
);
已编译的CSS:
@keyframes loader {
0% {transform: translateX(10px);}
25% {transform: translateX(20px);}
50% {transform: translateX(50px);}
75% {transform: translateX(20px);}
100% {transform: translateX(10px);}
}