将参数添加到@keyframes属性Less

时间:2015-10-09 08:32:45

标签: css css3 arguments less less-mixins

我有一个属性@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); }

1 个答案:

答案 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);}
}