首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减:合并多个CSS3动画

减:合并多个CSS3动画
EN

Stack Overflow用户
提问于 2015-04-09 13:24:57
回答 2查看 689关注 0票数 1

我有两个CSS动画定义在较少:

代码语言:javascript
复制
.color_animation (@color, @time:1s)
{
  @stop-1:~"@{color}_SOPRA";
  @stop-2:~"@{color}_SOTTO";

  @name: ~"blink-@{color}";
  animation:@name @time ease-in-out infinite alternate;

  .steps()
  {
      0% { color:@@stop-1; }
     50% { color:@@stop-2; }
    100% { color:@@stop-1; }
  }

  @keyframes @name { .steps(); }
}


.zoom_animation (@ratio, @time:1s)
{  
  @zoom-ratio:round(@ratio*100);
  @name: ~"zoom-@{zoom-ratio}";

  animation:@name @time ease-in-out infinite alternate;

  .steps()
  {
      0% { .scale(1.0); }
     50% { .scale(@ratio); }
    100% { .scale(1.0); }
  }

  @keyframes @name { .steps(); }
}

每个类都由不同的CSS类调用:

代码语言:javascript
复制
.blink
{
  .color_animation(red);
}

.animated-zoom
{
  .zoom_animation(1.05);
}

我希望能够同时执行其中一个或两者,将一个或两个css类添加到DOM元素中,例如:

代码语言:javascript
复制
<p class='blink'>Loading...</p>
<p class='animated-zoom'>Highlight</p>
<p class='blink animated-zoom'>Data not Saved!!!</p>

但是在最后一个例子中,第二个动画覆盖了第一个动画。

在添加两个类的特殊情况下,如何将它们组合起来?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-10 08:54:46

由于@seven-phases-max's的建议,我阐述了一种可能的解决方案,在多个CSS类被分配到一个元素的情况下,流水线化动画。

这里是我的原始代码(现在稍微修改了一下),在其中,我在专用共用混合器中移动公共部分:

代码语言:javascript
复制
.color_animation (@color, @time:1s)
{
  @stop-1:~"@{color}_SOPRA";
  @stop-2:~"@{color}_SOTTO";

  @name: ~"blink-@{color}";

  .steps()
  {
      0% { color:@@stop-1; }
    100% { color:@@stop-2; }
  }

  @value:@name @time ease-in-out infinite alternate;

  .INITIALIZE_keyframes();
  .CALL_animation();
}


.zoom_animation (@ratio, @time:1s)
{  
  @zoom-ratio:round(@ratio*100);
  @name: ~"zoom-@{zoom-ratio}";

  .steps()
  {
      0% { .scale(1.0); }
    100% { .scale(@ratio); }
  }

  @value:@name @time ease-in-out infinite alternate;

  .INITIALIZE_keyframes();
  .CALL_animation();
}

在这里,COMMONS声明(我缺少浏览器的前缀,只是简单起见,但是可以在这里添加它们):

代码语言:javascript
复制
.INITIALIZE_keyframes()
{
  @keyframes @name { .steps(); }
}

.CALL_animation()
{
  animation+:@value;
}

请注意+声明中的‘animation +’符号,它是我的解决方案的秘密,再加上以下CSS类声明:

代码语言:javascript
复制
.blink
{
  .color_animation(red);
}

.animated-zoom
{
  .zoom_animation(1.05);
}

.blink
{
  &.animated-zoom
  {  
    .color_animation(red);
    .animated-zoom;
  }
}
票数 1
EN

Stack Overflow用户

发布于 2017-12-13 12:15:19

贴出的答案很棒,帮助我找到了解决问题的办法。我使用一个通用的关键帧和动画混合器来创建这样的动画:

代码语言:javascript
复制
// Generic keyframe class
.keyframes(@name; @arguments) {
    @-moz-keyframes @name { @arguments(); }
    @-webkit-keyframes @name { @arguments(); }
  @-ms-keyframes @name { @arguments(); }
  @-o-keyframes @name { @arguments(); }
    @keyframes @name { @arguments(); }
}

// Generic animation class
.animation(@arguments) {
    -webkit-animation+: @arguments;
    -moz-animation+: @arguments;
  -ms-animation+: @arguments;
  -o-animation+: @arguments;
    animation+: @arguments;
}

注意+类中的.animation。然后我就可以像这样快速地构建动画:

代码语言:javascript
复制
// Fade in animation
.fadeIn() {
  .keyframes(fade-in; {
    from { opacity: 0; }
    to   { opacity: 1; }
  });

  .animation(fade-in 1.5s);
}

// Pan animation
.pan() {
  .keyframes(pan; {
    from { transform: translateX(-2%); }
    to { transform: translateX(2%); }
  });

  .animation(pan 5s infinite alternate ease-in-out);
}

现在,如果我想在一起使用动画,我可以简单地将它们添加到现有的类、元素等中:

代码语言:javascript
复制
.multipleAnimations {
   .fadeIn();
   .pan();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29539791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档