UNPKG

@fxshelf/card-orbit

Version:

Path-constrained 3D card orbit carousel for React and Vue — rise, arc, exit. No Framer Motion / GSAP. Copy-as-source friendly.

110 lines (76 loc) • 3.42 kB
# 动效说明(大白话版) > 专业版见 [动效说明-专业.md](./动效说明-专业.md) 这页用尽量直白的话讲清楚:卡片为什么会「贴着弯道飞」,拖的时候又为什么拖不飞出去。 代码在:`src/react/CardOrbit.tsx`(路径数学见 `src/core/path.ts`,动画驱动见 `src/core/createOrbit.ts`) --- ## 一句话先记住 你以为在拖卡片,其实是在拧一条**共用的进度条**。轨道是画死的,卡片只能顺着轨道走。 ```mermaid flowchart LR A["自动播放"] --> P["进度条"] B["手指拖动"] --> P P --> C["算出每张卡在哪"] C --> D["贴到弯道上显示"] ``` --- ## 1. 进度条怎么转 ```mermaid sequenceDiagram participant 自动 as 自动播放 participant 手 as 手指 participant 进度 as 进度条 自动->>进度: 没人碰时自己慢慢往前走 手->>进度: 一按住就改成「你滑多少、走多少」 Note over 进度: 按住期间自动停 ``` - 没碰屏幕:像传送带,匀速往前转。 - 手按住:传送带停,改成跟你的滑动走。 - 主要看**上下滑**,左右滑也算一点。 - 松手:传送带继续转。 所以拖动不会把卡拽到轨道外面——你改的只是「动画播到哪一帧」。 --- ## 2. 七张卡怎么接力 七张卡共用同一圈赛道,但起步点错开: ```text 卡0 ── 卡1 ── 卡2 ── 卡3 ── 卡4 ── 卡5 ── 卡6 (大家隔开 1/7 圈,像接力) ``` - 只有跑进「前大约 72%」那一段的才看得见。 - 跑到后面那截就隐身,等下一圈再出来。 - 所以你会感觉卡一张接一张冒出来,而不是七张挤在同一点。 --- ## 3. 轨道长什么样 像滑滑梯拐弯再冲出去: **交互演示:** - 静态页:[轨道演示.html](./轨道演示.html) - 在线 3D(R3F + KaTeX):Demo 站点 `#/path`(例如本地 `http://localhost:5173/#/path`) ```text ① 上升 ② 拐弯 ③ 退出 │ ╭──╮ ──→ │ ╭──╯ │ ▼ │ │ ●───────────────────●─────●───────────────────● 从底下冒上来 甩个弯 往右滑走消失 ``` ```mermaid flowchart LR R["① 竖直爬上来"] --> A["② 拐四分之一圆"] A --> X["③ 平着往右滑走"] ``` | 段 | 人眼看到的 | |----|------------| | 上升 | 从下面竖直冒出来 | | 圆弧 | 拐个弯(就是用 cos/sin 画出来的那段) | | 退出 | 弯完后平着往右滑走、变淡 | --- ## 4. 为什么有的大有的小 卡在轨道**中间**时:又大又清楚,叠在最上面。 刚出来或快走时:又小又淡。 外层加了一点「摄像机透视」,整组再稍微歪一点,看起来更立体——但本质还是 2D 网页上的 CSS 变换,不是真 3D 引擎。 --- ## 容易误会的点 | 以为是 | 其实是 | |--------|--------| | 用动画库把卡「吸」在路径上拖 | 自己写循环拧进度,再按公式算位置 | | 每张卡可以被随便拽来拽去 | 只有一条进度条;卡的位置永远是「进度 → 轨道上的点」 | **再记一遍:** 轨道固定,拧的是时间轴,不是随便拽卡片。