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

Material UI中CSS关键帧动画重置初始transform值的解决咨询

如何在不重置初始transform旋转值的前提下实现菱形缩放动画

这是因为CSS动画的transform属性会完全覆盖元素本身的transform设置——当你在@keyframes的0%阶段只写scale(1)时,相当于把之前的rotate(45deg)给覆盖掉了,所以动画启动前旋转会被重置。

有两种简单的解决方法,不用每次在动画里重复写rotate:


方法1:用CSS变量分离旋转与缩放

把缩放值抽成CSS变量,初始transform同时保留旋转和变量控制的缩放,动画只修改变量值:

<Box
  sx={{
    display: "flex",
    justifyContent: "center",
    alignItems: "center",
    width: "10vh",
    height: "10vh",
    border: "1px solid",
    borderColor: "tertiary.main",
    // 初始transform:固定旋转 + 变量控制缩放
    transform: "rotate(45deg) scale(var(--scale, 1))",
    animation: "expand 500ms linear forwards",
    animationDelay: "2s",
    "@keyframes expand": {
      "0%": {
        // 只修改缩放变量,不碰旋转
        "--scale": 1,
      },
      "100%": {
        "--scale": 12,
      },
    },
  }}
>
</Box>

这样元素的旋转状态会一直保留,动画只负责调整缩放比例,完全不用重复写rotate。


方法2:嵌套元素分离旋转与动画

外层元素负责固定旋转,内层元素单独做缩放动画,两者的transform互不干扰:

<Box
  sx={{
    display: "flex",
    justifyContent: "center",
    alignItems: "center",
    transform: "rotate(45deg)", // 外层固定旋转
  }}
>
  <Box
    sx={{
      width: "10vh",
      height: "10vh",
      border: "1px solid",
      borderColor: "tertiary.main",
      animation: "expand 500ms linear forwards",
      animationDelay: "2s",
      "@keyframes expand": {
        "0%": { transform: "scale(1)" },
        "100%": { transform: "scale(12)" },
      },
    }}
  >
  </Box>
</Box>

这种方式逻辑更清晰,外层管旋转,内层管缩放动画,完全避免了transform属性的覆盖冲突。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:04:58