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

为什么styled-jsx中关键帧动画不生效?如何同时实现点击切换的动画和过渡?

问题根因

你当前的写法存在两个导致过渡失效的问题:

  • 直接在CSS模板字符串中注入clicked变量,状态切换时整个circle的样式规则会被重新生成,浏览器无法识别前后两个状态的r值差异,无法触发过渡。
  • animation和transition同时作用于r属性时animation优先级更高,状态切换瞬间animation被设为none,会直接重置r的属性值,没有给过渡留计算空间。

修复方案

通过属性选择器绑定状态,预定义所有样式规则即可解决:

import { useState } from "react";

export default function Home() {
  const [clicked, setClicked] = useState(false);

  return (
    <>
      <main>
        <svg onClick={() => setClicked((c) => !c)}>
            <circle 
              cx="50%" 
              cy="40%" 
              stroke="black" 
              strokeWidth={2} 
              fill="gray"
              data-clicked={clicked}
            />
        </svg>
      </main>

      <style jsx>{`
        svg {
          width: 100%;
          height: 100%;
        }

        circle {
          r: 5%;
          transition: r 0.8s ease-in-out;
        }

        circle[data-clicked="false"] {
          animation: bounce 2s infinite;
        }

        circle[data-clicked="true"] {
          r: 10%;
          animation: none;
        }

        @keyframes bounce {
          0% {
            r: 5%;
          }
          50% {
            r: 6%;
          }
          100% {
            r: 5%;
          }
        }
      `}</style>
    </>
  );
}

实现说明

  • 所有样式规则预先定义,切换data-clicked属性时浏览器可以正常识别状态差异,触发过渡效果。
  • 未点击时自动应用bounce呼吸动画,点击后动画停止,r属性会从当前值平滑过渡到10%,再次点击会恢复到未点击状态,继续播放动画。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:27:04