You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何组合多个使用transform的CSS动画与属性?

如何组合多个使用transform的CSS动画?

我有两个CSS动画,分别是旋转动画和倾斜动画:

旋转动画代码:

@keyframes spinning {
  0% {
    transform: rotate(0deg);
  }
  100% {
    transform: rotate(360deg);
  }
}

使用方式:

.spinning {
  animation: spinning 1s infinite;
}

倾斜动画代码:

@keyframes skewing {
  0% {
    transform: skew(0deg);
  }
  25% {
    transform: skew(40deg);
  }
  50% {
    transform: skew(0deg);
  }
  75% {
    transform: skew(-40deg);
  }
  100% {
    transform: skew(0deg);
  }
}

当尝试把两个动画同时应用到同一个元素,或者添加静态transform属性时,会出现覆盖问题,只能生效其中一个:

.fun {  // 无法生效——只能三选一 :(
  animation: spinning 1s infinite;
  animation: skewing 1s infinite;
  &:hover {
    transform: scale(2.0)
  }
}

手动合并所有transform到一个keyframes会失去动画的可复用性,有没有办法实现动画的组合?


解决方案

方法1:使用CSS变量拆分变换属性

通过CSS变量将不同的变换(旋转、倾斜、缩放)拆分,每个动画仅修改对应的变量,元素的transform属性组合所有变量值,避免互相覆盖。

示例代码:

/* 定义全局变换变量 */
:root {
  --rotate: 0deg;
  --skew: 0deg;
  --scale: 1;
}

/* 修改旋转动画,仅更新rotate变量 */
@keyframes spinning {
  100% {
    --rotate: 360deg;
  }
}

/* 修改倾斜动画,仅更新skew变量 */
@keyframes skewing {
  25% {
    --skew: 40deg;
  }
  50% {
    --skew: 0deg;
  }
  75% {
    --skew: -40deg;
  }
  100% {
    --skew: 0deg;
  }
}

.fun {
  /* 组合所有变换变量 */
  transform: rotate(var(--rotate)) skew(var(--skew)) scale(var(--scale));
  /* 同时应用两个动画 */
  animation: spinning 1s infinite, skewing 1s infinite;
  /* 添加hover过渡效果 */
  transition: transform 0.3s;
}

.fun:hover {
  /* 修改scale变量实现缩放 */
  --scale: 2;
}

这种方法无需额外DOM元素,保持动画的可复用性,同时支持静态变换的叠加。

方法2:使用嵌套元素分离动画

将不同的动画应用到嵌套的父子元素上,每个元素的transform独立生效,不会互相干扰。

示例代码:

<div class="spinning">
  <div class="skewing fun">内容</div>
</div>
@keyframes spinning {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

@keyframes skewing {
  0% { transform: skew(0deg); }
  25% { transform: skew(40deg); }
  50% { transform: skew(0deg); }
  75% { transform: skew(-40deg); }
  100% { transform: skew(0deg); }
}

.spinning {
  animation: spinning 1s infinite;
}

.skewing {
  animation: skewing 1s infinite;
}

.fun:hover {
  transform: scale(2.0);
}

这种方法无需修改原有动画代码,实现简单,但会增加DOM层级。


内容的提问来源于stack exchange,提问作者Sasgorilla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:36:16