【问题标题】:Is it possible to have multiple independent transform animations?是否可以有多个独立的变换动画?
【发布时间】:2019-06-17 08:03:05
【问题描述】:

我想在同一个元素上运行两个单独的关键帧变换动画,但它似乎只运行最后一个动画。有没有办法做到这一点?

我已经尝试过下面代码中的示例 (codepen),我也尝试过在元素上使用绝对位置并为 topleft 值设置动画。它给出了我正在寻找的效果,但它似乎不像使用translate 那样流畅。

@keyframes animate-x {
  from { transform: translateX(0); } to { transform: translateX(100%); }
}

@keyframes animate-y {
  from { transform: translateY(0); } to { transform: translateY(100%); }
}

.element {
  width: 200px;
  height: 200px;
  background-color: blue;
  transform-origin: center;
  animation:
    animate-x 20s linear infinite alternate,
    animate-y 15s linear infinite alternate;
}

我希望以不同的速度同时运行 translateX 和 translateY 动画。

【问题讨论】:

  • 您可以添加一个额外的容器来应用其中一个动画

标签: html css sass


【解决方案1】:

不,但您可以将多个转换指令组合到一个属性中:

@keyframes animate-y {
  from { 
    transform: translateY(0) translateX(0); 
  } 
  to { 
    transform: translateY(100%) translateX(100%); 
  }
}

.element {
  width: 200px;
  height: 200px;
  background-color: blue;
  transform-origin: center;
  animation:
    /*animate-x 2s linear infinite alternate,*/
       animate-y 2s linear infinite alternate;
}
<div class="element"></div>

此外,您可以通过在关键帧中使用百分比而不是 from 和 to 来分解动画:

@keyframes animate-y {
  0% { 
    transform: translateY(0); 
  } 
  25% { 
    transform: translateY(100%) translateX(0); 
  }
  
  50%{
    transform: translateY(100%) translateX(100%);
  }
  
  75% {
    transform: translateY(0%) translateX(100%);
  }
}

.element {
  width: 200px;
  height: 200px;
  background-color: blue;
  transform-origin: center;
  animation:
    /*animate-x 2s linear infinite alternate,*/
       animate-y 2s linear infinite alternate;
}
<div class="element"></div>

编辑:以不同的速度移动两个方向:

@keyframes animate-y {
  0% { 
    transform: translateY(0) translateX(0%); 
  } 
  25% { 
    transform: translateY(100%) translateX(50%); 
  }
  
  50%{
    transform: translateY(0%) translateX(100%);
  }
  
  75% {
    transform: translateY(100%) translateX(50%);
  }
}

.element {
  width: 200px;
  height: 200px;
  background-color: blue;
  transform-origin: center;
  animation:
    /*animate-x 2s linear infinite alternate,*/
       animate-y 2s linear infinite alternate;
}
<div class="element"></div>

【讨论】:

  • 我猜你错过了这个:我希望以不同的速度同时运行 translateX 和 translateY 动画。
  • @TemaniAfif 查看我的编辑。我不认为你可以按照你想要的方式做到这一点,但你可以使用基于百分比的关键帧,如果你在一个方向上比另一个方向更缓慢地移动。
  • 感谢您的建议,@symlink!我最终在单独的动画中为顶部和左侧的值设置了动画
猜你喜欢
  • 2014-02-16
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
相关资源
最近更新 更多