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

Styled Components keyframes动画三次刷新后停止、部署不启动问题

问题根因
  • 核心错误:styled组件与keyframes的定义放在了函数组件的渲染逻辑内部,完全违反styled-components的使用规则。React每次重渲染、页面刷新触发组件重新执行时,循环内会反复生成全新的keyframes规则、styled组件实例,直接导致styled-components样式表内存泄漏、类名哈希冲突:本地环境多次刷新后样式表堆积到临界值,动画样式规则被覆盖失效,和你描述的刷新三次后动画停止的现象完全吻合;Netlify部署为生产构建模式,styled-components的服务端渲染hydration校验会直接拦截不匹配的动态样式,客户端生成的动画规则根本无法注入,所以动画完全不启动。
  • 次要问题:代码中使用的iconDivs是组件外的全局可变数组,组件每次渲染都会重复向数组内push新生成的冗余styled组件,渲染次数越多冗余样式越多,进一步加剧类名冲突、样式覆盖问题。
  • 隐性问题:循环渲染的所有元素都使用了同一个id值skillIcon,违反HTML id全局唯一的规范,会导致后续DOM操作、事件绑定出现非预期行为。
修复方案

将keyframes、styled组件的定义全部移到组件作用域外,只初始化一次,动画延迟这类动态值通过组件props传入,不要在渲染循环中批量生成重复的styled组件。
修复后的可运行代码:

import { createElement } from 'react';
import skills from '../js/skills.jsx';
import styled, { keyframes } from 'styled-components';

// keyframes全局只定义一次
const moveLeftFirst = keyframes`
  0% {
    left: 110%;
  }
  100% {
    left: -10%;
  }
`;

// 通用滚动图标组件全局只定义一次,动态延迟通过props传入
const IconDiv = styled.div`
  animation: ${moveLeftFirst} 8s infinite linear;
  animation-delay: ${(props) => props.delay}s;
`;

export default function Test() {
  // 动画暂停逻辑建议优先通过props控制animation-play-state实现,减少直接DOM操作
  const stopAnimation = (isPaused) => {
    document.querySelectorAll('.skillIcon').forEach((el) => {
      el.style.animationPlayState = isPaused ? 'paused' : 'running';
    });
  };

  return (
    <>
      {skills.map((skill, index) => (
        <IconDiv
          key={skill.title}
          delay={index * 0.8}
          data-tip
          data-for={skill.title}
          className="skillIcon mx-3 justify-center absolute hover:text-white ease-in transition duration-300 left-[110%]"
          onMouseOver={() => stopAnimation(true)}
          onMouseOut={() => stopAnimation(false)}
        >
          {createElement(skill.icon.type, { className: 'w-20 h-20' })}
        </IconDiv>
      ))}
    </>
  );
}
Remix 部署 Netlify 额外注意项
  • 开启SSR的Remix项目需要在root.tsx中配置styled-components的ServerStyleSheet,在服务端渲染阶段收集所有页面用到的样式,注入到返回的HTML头部,避免生产环境hydration时样式丢失、类名不匹配问题。
  • 确认Netlify的构建配置正确:构建命令使用npx remix build,发布目录匹配你使用的Remix Netlify适配器要求的输出路径,不要把本地开发的缓存目录作为发布内容上传。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 22:48:22