讲师中心 微信公众号

工具推荐

视频效率加速
Laper
Laper

剧本策划到成片协作

AniShort
AniShort

AI短剧协同制作平台

Seko
Seko

AI短剧一键生成成片

剧云
剧云

中文短剧剧本制作平台

实现 React 中卡片容器的自动水平滚动动画(CSS 驱动方案)

酷敏君_5156

酷敏君_5156

发布时间:2026-02-22 13:27:12

|

831人浏览过

|

来源于php中文网

原创

实现 React 中卡片容器的自动水平滚动动画(CSS 驱动方案)

本文介绍一种基于 CSS @keyframes 与 transform: translateX() 的纯声明式自动水平滚动方案,无需手动管理帧循环或状态,兼容性好、性能高,适用于国家卡片等横向流式布局场景。

本文介绍一种基于 css `@keyframes` 与 `transform: translatex()` 的纯声明式自动水平滚动方案,无需手动管理帧循环或状态,兼容性好、性能高,适用于国家卡片等横向流式布局场景。

在 React 应用中实现无交互、自动持续的水平滚动效果(如轮播国家卡片),最健壮且可维护的方式并非依赖 requestAnimationFrame 手动更新 transform 值,而是交由浏览器原生 CSS 动画引擎处理——它天然支持硬件加速、时间线精确控制,并避免了 JS 状态同步带来的抖动与边界误差问题。

以下是一个完整、生产就绪的实现方案,核心思路是:
✅ 将卡片容器设为 display: flex 并允许其自然撑宽(scrollWidth);
✅ 用 ref 动态获取容器总宽度,并通过内联样式注入到 @keyframes 的终点位移中;
✅ 利用 calc(100vw) 起始位置 + calc(-100%) 终点位置,实现从视口右侧平滑滑入、完全滑出左侧的无缝循环动画;
✅ 通过 animation-play-state 控制启停,便于后续扩展暂停/重播逻辑。

✅ 完整代码实现

App.js(主容器组件)

import { useRef, useEffect, useState } from "react";
import Card from "./Card";
import "./styles.css";

const data = [
  { Name: "China" },
  { Name: "Japan" },
  { Name: "Germany" },
  { Name: "Brazil" },
  { Name: "Canada" },
  { Name: "Australia" },
  { Name: "Nigeria" },
  { Name: "Mexico" }
];

export default function App() {
  const containerRef = useRef(null);
  const [containerWidth, setContainerWidth] = useState("100%");
  const [playState, setPlayState] = useState("paused");

  // 动态计算容器总宽度(含所有卡片及 margin),并启动动画
  useEffect(() => {
    if (containerRef.current) {
      const width = containerRef.current.scrollWidth;
      setContainerWidth(`${width}px`);
      setPlayState("running");
    }
  }, []);

  return (
    <div className="App">
      <div
        ref={containerRef}
        className="card-container"
        style={{
          width: containerWidth,
          animationPlayState: playState
        }}
      >
        {data.map((item, idx) => (
          <Card key={idx} cardName={item.Name} />
        ))}
      </div>
    </div>
  );
}

Card.js(卡片子组件,保持轻量无状态)

shopify-app-react-router
shopify-app-react-router

构建 Shopify 嵌入式应用(Embedded App)的开发技能:基于 @shopify/shopify-app-react-router + React Router v7 + Admin API 2026-04。覆盖 shopifyApp 配置、authenticate.admin 的 GraphQL/REST 调用、Webhook 校验、Session 存储、订阅计费、App Bridge 导航、部署,并新增:适用场景判断、安全最佳实践、错误处理与容错、最佳实践、常见问题 FAQ、高级场景。G

下载
export default function Card({ cardName }) {
  return (
    <div className="bubble">
      <div className="card m-2 pt-2">
        <div className="py-1">
          <div className="fs-5 mt-2">{cardName}</div>
        </div>
      </div>
    </div>
  );
}

styles.css(关键动画样式)

立即学习“前端免费学习笔记(深入)”;

.App {
  overflow: hidden; /* 隐藏超出视口的内容,形成“窗口”效果 */
  padding: 20px 0;
}

.card {
  width: 200px !important;
  height: 200px;
  background: #ffffff;
  box-shadow: 0px 1px 4px 1px rgba(158, 151, 151, 0.25);
  border-radius: 15px;
  margin: 12px;
  padding: 12px;
}

/* 滚动容器:flex 布局 + 自定义动画 */
.card-container {
  display: flex;
  transform: translateX(calc(100vw)); /* 起始位置:完全在视口右侧 */
  animation: scrollHorizontal 12s linear infinite;
  animation-play-state: paused; /* 初始暂停,由 JS 启动 */
}

@keyframes scrollHorizontal {
  from {
    transform: translateX(calc(100vw));
  }
  to {
    transform: translateX(calc(-100%)); /* 终点:向左移动自身总宽度 */
  }
}

/* 可选:鼠标悬停暂停动画(提升用户体验) */
.card-container:hover {
  animation-play-state: paused;
}

⚠️ 注意事项与优化建议

  • 宽度动态性:scrollWidth 在首次渲染后才可读取,因此必须用 useEffect + ref 获取;若卡片内容异步加载(如图片),需监听 resize 或使用 ResizeObserver 进行二次校准。
  • 无缝循环:当前方案依赖 to: translateX(-100%) —— 即容器自身宽度。确保 .card-container 的 width 样式与 scrollWidth 严格一致,否则会出现“卡顿”或“跳帧”。本例中通过内联 style.width 强制同步。
  • 性能保障:transform 和 opacity 是仅有的两个能触发 GPU 加速的 CSS 属性,本方案全程只操作 transform,无布局重排(reflow),60fps 稳定。
  • 可扩展性:如需支持双向滚动、变速、或点击暂停/播放,只需扩展 playState 状态及对应事件处理器,CSS 动画本身无需修改。
  • 响应式适配:若需适配移动端,建议将 100vw 替换为 100dvw(动态视口单位),并在小屏下降低 animation-duration 或禁用动画。

该方案已验证于 Chrome/Firefox/Safari,无 polyfill 依赖,代码简洁、逻辑清晰、易于测试与维护,是 React 水平自动滚动场景的推荐实践。

相关文章

驱动精灵
驱动精灵

驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

2946

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

6099

2023.11.06

Chrome开启无痕模式
Chrome开启无痕模式

本专题整合了Chrome无痕模式开启相关内容,阅读专题下面的文章了解更多详细教程。

4367

2026.03.24

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

4896

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1435

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1898

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

10443

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

1040

2023.09.01

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

60

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn