Player.Container
预计阅读时间: 4 分钟
Player.Container 是播放器的物理表面。它定义了视觉边界、附加媒体元素,并检测用户交互(如活动和手势、键盘输入)。它位于 Player.Provider 内部。
<Player.Provider>
<Player.Container>
<video src="video.mp4" />
<Controls />
</Player.Container>
</Player.Provider>
如何创建
Player.Container 来自创建 Player.Provider 的同一个 createPlayer() 调用。它们是配对的,连接到同一组功能特性。
import { createPlayer } from '@videojs/react';
import { videoFeatures } from '@videojs/react/video';
const Player = createPlayer({ features: videoFeatures });
功能
布局和全屏
容器是媒体和控件周围的视觉盒子。尺寸、宽高比和视觉边界都放在这里 — 放在容器上,而不是 Provider 上。
<Player.Container style={{ width: 640, aspectRatio: '16/9' }}>
<video src="video.mp4" />
<Controls />
</Player.Container>
当用户进入全屏时,容器进入全屏 — 而不是视频元素。这使得控件和其他 UI 在视频上方保持可见,因为它们是容器的子元素。
媒体附加
媒体发现由 Provider 处理,而不是容器。当媒体组件(如 <Video>)通过 context 注册自己时,Provider 将其连接到存储和播放器的所有功能特性。
交互表面
容器是用户意图进入播放器的地方。它监听其表面上的物理交互并将其转化为播放器行为:
- 用户活动 — 容器内的鼠标移动、触摸和键盘活动驱动空闲检测。这是控件知道何时显示和隐藏的方式。
- 手势 — 点击播放、双击全屏、滑动跳转以及其他触摸/鼠标手势。通过
Gesture 组件配置。
- 键盘控件 — 空格键播放/暂停、方向键跳转以及其他限定在容器范围内的键盘快捷键。通过
Hotkey 组件配置。
与皮肤的关系
皮肤是容器加上 UI 控件。当你使用打包的皮肤时,容器是内置的 — 你不需要自己添加。
{/* 打包的皮肤 — 容器在 VideoSkin 内部 */}
<Player.Provider>
<VideoSkin>
<Video src="video.mp4" />
</VideoSkin>
</Player.Provider>
{/* 自定义 UI — 你直接使用 Player.Container */}
<Player.Provider>
<Player.Container>
<video src="video.mp4" />
<PlayButton />
</Player.Container>
</Player.Provider>
容器内外
Provider 为组件提供状态和操作的访问权限。容器在此基础上增加了物理行为 — 全屏、活动检测、手势处理。组件在两个位置都可以工作;容器只是添加了这些额外功能。
<Player.Provider>
<Player.Container>
<video src="video.mp4" />
<Controls /> {/* 全屏、活动检测、手势 */}
</Player.Container>
<Transcript /> {/* 状态和操作,但没有容器行为 */}
<PlaylistSidebar /> {/* 状态和操作,但没有容器行为 */}
</Player.Provider>
容器外部的播放按钮仍然可以读取播放状态并切换播放/暂停 — 它只是不会随播放器全屏或响应容器的空闲状态。
参见