Stories Core

驱动 @reelkit/react-stories-player的引擎。纯 TypeScript,不依赖任何框架。可以用它为 Angular、Vue 或原生 JS 构建 Stories Player。

与框架无关
纯 TypeScript,不依赖任何 DOM 框架
两级导航
分组,以及每个分组内部的 story
RAF 计时器
基于 requestAnimationFrame 的自动播放,支持暂停 / 恢复
Canvas 进度条
适配 Retina 的分段进度条,带滑动窗口
点击区域
可配置的左右点击检测
响应式信号
构建在 @reelkit/core 的信号原语之上

安装

bash

Stories 控制器

createStoriesController(config, events?) 负责在分组和 story 之间导航。它跟踪暂停 / 恢复状态,记住每个分组最后看到的 story,并在每次切换时触发回调。

配置(StoriesControllerConfig)

属性类型默认值说明
groupCountnumber必填story 分组总数
storyCountsnumber[]必填每个分组内的 story 数量
initialGroupIndexnumber0初始分组索引
initialStoryIndexnumber0分组内的初始 story 索引
defaultImageDurationnumber5000图片类 story 的默认自动播放时长(毫秒)

事件(StoriesControllerEvents)

事件类型说明
onStoryChange(groupIndex, storyIndex) => void当前 story 变化时触发
onGroupChange(groupIndex) => void当前分组变化时触发
onStoryViewed(groupIndex, storyIndex) => void某个 story 变为可见时触发
onStoryComplete(groupIndex, storyIndex) => voidFired when a story's timer completes (before advancing)
onComplete() => void最后一个分组的最后一个 story 播完时触发
onClose() => void浮层应当关闭时触发

状态(响应式信号)

Signal类型说明
state.activeGroupIndexSignal<number>当前分组索引
state.activeStoryIndexSignal<number>分组内当前 story 的索引
state.isPausedSignal<boolean>自动播放是否已暂停

方法

方法类型说明
nextStory()() => void在分组内前进;越过边界时进入下一个分组
prevStory()() => void在分组内后退;越过边界时回到上一个分组
nextGroup()() => void切到下一个分组,并从上次看到的 story 继续
prevGroup()() => void切到上一个分组,并从上次看到的 story 继续
goToGroup(index)(number) => void按索引跳到指定分组
pause()() => void暂停自动播放
resume()() => void恢复自动播放
onStoryTimerComplete()() => void计时结束时调用;先触发 onStoryComplete 再前进
getLastStoryIndex(groupIndex)(number) => number某分组最后看到的 story 索引(从未访问过则为 0)

示例

typescript

计时控制器

createTimerController(config) requestAnimationFrame 循环驱动自动播放。进度信号(0 到 1)供给进度条。暂停和恢复会精确保留位置。

配置(TimerControllerConfig)

属性类型默认值说明
durationnumber必填默认时长(毫秒)
onComplete() => voidundefined计时到达 100% 时调用

状态

Signal类型说明
progressSignal<number>进度信号(0 到 1)
isRunningSignal<boolean>计时器当前是否在运行

方法

方法类型说明
start(duration?)(number?) => void启动(或重启)计时器,可选地覆盖时长
pause()() => void把进度冻结在当前位置
resume()() => void从冻结的位置继续
reset()() => void把进度重置为 0 并停止
dispose()() => void清理资源

示例

typescript

Canvas 进度渲染器

createCanvasProgressRenderer(config?) 在 canvas 上绘制分段进度条。它会针对 Retina 屏缩放,通过 ResizeObserver 测量容器,并在分段放不下时启用滑动窗口。

配置(CanvasProgressRendererConfig)

属性类型默认值说明
gapnumber2分段之间的间距(像素)
barHeightnumber2进度条高度(像素)
minSegmentWidthnumber8触发滑动窗口之前的最小分段宽度
bgColorstring'rgba(255,255,255,0.3)'未填充分段的背景色
fillColorstring'#ffffff'已完成 / 当前分段的填充色

方法

成员类型说明
attach(canvas)(HTMLCanvasElement) => void挂到 canvas 元素上;并在父级启动 ResizeObserver
draw(totalStories, activeIndex, progress)(number, number, number) => void按给定状态绘制进度条
widthnumber (readonly)当前测得的宽度(CSS 像素)
dispose()() => void清理 ResizeObserver 和内部状态

示例

typescript

工具函数

用于点击区域检测和进度条计算的纯函数。

函数类型说明
getTapAction(tapX, containerWidth, splitRatio?)(number, number, number?) => 'prev' | 'next'Determines whether a tap triggers 'prev' or 'next' based on position. Default splitRatio is 0.3.
getSegments(totalStories, activeIndex, progress)(number, number, number) => SegmentState[]计算进度条中每个分段的状态和填充比例
getVisibleWindow(totalStories, activeIndex, progress, containerWidth, minSegmentWidth?, gap?)(number, number, number, number, number?, number?) => VisibleWindow当分段总数超出容器容量时,计算可见的滑动窗口

类型

全部类型定义均导出自 @reelkit/stories-core.

typescript