Imageplayer 图片序列播放器

GB.Imageplayer 将一组连续图片作为帧序列播放,适合产品 360° 展示、逐帧演示和图片动画。它支持正向或反向播放、暂停、停止、倍速、拖动切帧、进度与时间显示,并会预解码图片以减少首次显示闪烁。

安装与引入

浏览器直接引入

<script src="https://cloud.m775.net/js/imageplayer.js"></script>

npm 项目

npm i @gentbo/imageplayer

import '@gentbo/imageplayer';

快速开始

播放容器的每个直接子元素代表一帧,每帧中放置一张图片。完成配置后直接调用 start() 即可启动播放器。

<div id="productFrames">
  <figure><img src="frame-01.jpg" alt=""></figure>
  <figure><img src="frame-02.jpg" alt=""></figure>
  <figure><img src="frame-03.jpg" alt=""></figure>
</div>

<script>
GB.Imageplayer('#productFrames')
  .speed(100)
  .start(true, true);
// true, true:立即自动播放,并在结束后循环
</script>

组织播放器结构

GB.Imageplayer(target)通过 CSS 选择器或 HTMLElement 创建实例;目标不存在时抛出初始化错误。
.content(selector)指定目标容器内部的帧列表;未设置时,主容器的直接子元素就是帧列表。
.loading(selector)指定初始化和预加载期间显示的元素。
.complete(selector)指定非循环播放完成后显示的元素。
.hidden(className)指定统一的隐藏类名;未设置时通过元素的 display 样式控制显隐。

帧列表不能为空,每个帧元素中应包含一个 img。同一个主容器只能初始化一次。

播放参数

.speed(msPerFrame)设置基础帧间隔,单位为毫秒,默认 100ms/帧;只接受正数。
.scale(pixelsPerFrame)设置横向拖动多少像素切换一帧,默认 10px/帧。
.cache(maxSeconds, startSeconds)设置最大预解码时长和播放前预热时长,默认分别为 5 秒和 2 秒。
.reverse()将初始播放方向改为反向,从最后一帧开始。

预解码数量会根据缓存秒数和基础帧间隔自动换算。倍速只影响实际播放间隔,不改变显示的基础总时长。

启动与控制对象

start(auto = false, loop = true) 是链式配置的收尾方法,用于初始化并启动播放器,可以直接调用,不需要使用 await。默认只显示第一帧,不会自动播放;传入 true 可在初始化后自动播放。

只有需要在业务代码中取得播放控制对象时,才需要等待 start() 完成。控制对象提供以下方法:

controls.play()按当前方向继续播放。
controls.right()切换为正向播放。
controls.left()切换为反向播放。
controls.pause()暂停并保留当前帧。
controls.stop()停止播放,并回到当前方向的起始帧。
controls.times(value)设置播放倍速,例如 0.5、1、2;0 不会生效。
const player = GB.Imageplayer('#viewer')
  .content('.frames');

const controls = await player.start(false, false);

controls.right();
controls.times(2);
controls.pause();

run() 是无参数兼容入口,等价于使用默认参数调用 start(),也可以直接调用。需要取得控制对象时,再处理它的异步返回值。

配置控制条

先用 control() 指定控制条,再配置控制条内部的按钮选择器。按钮可逐项设置,也可以通过 button() 批量设置。

GB.Imageplayer('#viewer')
  .content('.frames')
  .control('.controls', 3000)
  .button({
    play: '.play',
    pause: '.pause',
    left: '.reverse',
    right: '.forward',
    stop: '.stop',
    stopped: '.stopped'
  })
  .start();
.control(selector, timeout = 0)设置控制条;timeout 单位为毫秒,非正数表示常显。
.playButton / pauseButton分别设置播放和暂停按钮。
.rightButton / leftButton分别设置正向和反向播放按钮。
.stopButton / stoppedButton设置停止按钮和用于表示已停止状态的元素。
.showControlButton / hideControlButton设置控制条外部的显示和隐藏按钮。

进度与时间

.progress(selector)设置进度条。容器有一个子元素时取第一个,有两个时取第二个作为实际进度层。
.time(total, current, format?)设置总时间、当前时间元素和格式,默认格式为 h:i:s。
GB.Imageplayer('#viewer')
  .progress('.progress')
  .time('.duration', '.current', 'i:s')
  .start();

时间是按“帧数 × 基础帧间隔”换算的播放时间,不是图片文件自身携带的媒体时长。

状态通知与自定义按钮

.notice(callback)状态变化时调用 callback(nextState, previousState)。
.click(selector, callback)为播放器容器内的自定义按钮添加点击处理。

状态包括 ready、left、right、pause、stop 和 complete。

GB.Imageplayer('#viewer')
  .notice((state, previous) => {
    console.log(`${previous} -> ${state}`);
  })
  .click('.help', () => openHelp())
  .start(true, false);

拖动切帧与使用边界

初始化后可在内容区域横向拖动切换帧。拖动开始时自动暂停计时器,结束后根据原播放状态决定是否恢复。该能力依赖 Pointer Events,并会为内容区域设置 touch-action: none。

start() 只执行一次初始化,之后再次调用会返回同一个控制对象,不会重新读取 DOM 或配置。请在首次启动前完成所有链式设置,并确保图片列表已经写入页面。