Reel Player

@reelkit/react-reel-player を使った、Instagram Reels/TikTok 風のフルスクリーン動画プレイヤーのコンポーネントです。

ライブデモを見る →

機能

縦方向のスワイプ
タッチ、ドラッグ、キーボード、ホイール
動画の自動再生
表示されたら再生
サウンド切り替え
iOS でも途切れない
複数メディア
横方向にネストしたカルーセル
位置の記憶
止めたところから再開
フレームキャプチャー
ポスターから動画へのクロスフェード
仮想化
DOM にはスライド 3 枚だけ
アスペクト比
デスクトップは 9:16、モバイルは全画面
デスクトップの操作
矢印ボタン
ジェネリック型
独自のコンテンツのデータモデル
カスタマイズ可能
あらゆる部分にレンダープロップ
スライドのオーバーレイ
作者、いいね、説明
URL の状態
共有もブックマークもできるリンク

インストール

bash

スタイルのインポートを忘れないでください:

typescript
アイコン

デフォルトのコントロールはアイコンに lucide-react を使います。別のアイコンライブラリを使いたい場合は、renderControlsrenderNavigation で独自のものを渡してください。

クイックスタート

ReelPlayerOverlay コンポーネントはフルスクリーンのプレイヤーを描画します。ContentItem オブジェクトの配列を渡し、isOpen で表示を制御します。

tsx

ライブデモ

ReelPlayerPage.tsx

サムネイルをクリックするとフルスクリーンのプレイヤーが開きます。Escape か閉じるボタンで戻ります。

カスタマイズ

ジェネリックなコンテンツ型

BaseContentItem を拡張して、独自のデータ型を使います:

tsx

独自のスライドオーバーレイ

組み込みのスライドオーバーレイを、スライドごとの独自の内容に置き換えます:

tsx

メディア以外のスライド

renderSlide で独自の内容(たとえば CTA カード)を差し込みます。デフォルトに戻すには null を返します:

tsx

独自のコントロール

再利用できるサブコンポーネントに、自分の追加要素を組み合わせます:

tsx

独自のタイムライン

renderTimeline で、組み込みの再生バーを独自のシーク UI に置き換えます。コールバックが呼ばれるのは、オーバーレイの表示条件がデフォルトのバーを描画する場合(同じ timeline モードと timelineMinDurationSeconds の判定)だけなので、それを実装し直す必要はありません。ルート要素で .rk-reel-timeline クラスを使えば、下端に沿った配置、セーフエリアの余白、タッチ端末でのスライドオーバーレイとの間隔を引き継げます。

tsx

独自のナビゲーション

tsx

独自のネストしたナビゲーション

複数メディアのスライド(横方向のカルーセル)の中にある左右の矢印を、独自のナビゲーションに置き換えます:

tsx

独自のネストしたスライド

renderNestedSlide で、複数メディアのカルーセル内の個々のスライドをカスタマイズします。props.defaultContent でデフォルトの ImageSlide/VideoSlide を包むか、完全に置き換えます:

tsx

URL の状態

ライブデモを見る →

ReelPlayerUrlOverlay は、開閉状態をアドレスバーに持つ別のコンポーネントです。@reelkit/reactuseOverlayUrlState でコントローラーを作り、controller として渡します。パラメーターがスライドを指すとプレイヤーは自分で開き、パラメーターがなくなると閉じます。リンクは共有でき、戻るボタンはページを離れる代わりにプレイヤーを閉じます。

組み込みのキー

スライドは組み込みのキーで指せます。urlIndexKey(位置で指す)か urlStableIdKey(安定した id で指す)をコントローラーに展開してください。どちらも @reelkit/react から再エクスポートされています。URL の状態のガイドCore API を参照してください。

tsx

useOverlayUrlState のすべてのオプション(paramadaptercodeclocator)は React API リファレンス にあります。手順は React ガイド にあります。

  • 開くと履歴エントリーを 1 つ 積みます。フィードをスワイプするとそれを 置き換え るので、N 回スワイプしてもエントリーは増えず、1 回戻れば必ずプレイヤーから出られます。戻るとプレイヤーが閉じ、スライドは戻りません。
  • 戻るで閉じるのは、アプリ内から開いた場合だけです(リンクがエントリーを積んだ場合)。新しいタブで直接開いた共有リンクには前の履歴がないので、ブラウザーの戻るではサイトを離れます。✕ ボタンか Escape なら、その場でパラメーターを取り除いてページにとどまります。
  • ディープリンク ?reel=3 は、読み込み時にそのスライドでプレイヤーを開きます。
  • どのスライドも指さないパラメーター(古いブックマークや手で書き換えた値)は、開けないスライドをアドレスバーが指したままにならないよう、URL から取り除かれます。
  • デフォルトでは、パラメーターが指すのは 縦方向 の投稿だけです(?reel=3)。複数メディアのカルーセルの内側のメディアのインデックスも運ぶには、二軸のキーを選んでください。詳しくは下記を参照してください。

キーは 1 つか 2 つか — URL の深さを選ぶ

同じ ReelPlayerUrlOverlay がどちらの形も扱います。実行時にコントローラーの位置から判別するので、モードを指定するプロップはありません。コントローラーを作るときにキーを選んでください:

キー通信形式運ぶもの
urlIndexKey(…)?reel=3縦方向の投稿だけ。
urlIndexTwoAxisKey(…)?reel=3.2投稿 カルーセルの内側のメディアのインデックス。

2 つの通信形式は意図的に区別されています。二軸のキーは厳密にドットで区切る(3.0 で、3 だけにはしない)ので、一軸のリンクが二軸として読まれることはありません。そのため、アプリでキーを切り替えると、それまでに共有されたリンクは無効になります。形を 1 つ選んで使い続けてください。

tsx

ルーターを使うアプリでは、アダプターを渡します。 ルーターの裏で history.pushState を書くと、その位置情報が古くなり、次のナビゲーションでパラメーターが消えます:

tsx

安定したリンク。 インデックスは位置なので、ブックマークした ?reel=3 はフィードが並べ替えられると別の投稿を開きます。フィードではそれが例外ではなく普通のことです。urlStableIdKey は各投稿の安定した id で指し、現在のフィードを走査します。よくあるケースは 1 回の呼び出しで済みます。

tsx

hashCodec: base64UrlCodec を渡すと、URL の id を base64url でエンコードします。元に戻せる難読化で、暗号学的ハッシュではありません。

別のフィールド(slug)で指したい場合や、locateAsync で無限フィードをページングしたい場合は、codeclocator を自分で作ります。2 つは別の役割です。codec は識別子を URL に書き、locator はその識別子がどこにあるかを探します。

tsx

無限フィード。 locate は同期なので、読み込み済みの投稿にしか答えられません。20 件を読み込んだフィードの 400 番目の投稿への共有リンクは見つかりません。locateAsync はフォールバックで、locate が見つけられなかったときだけ呼ばれます。

近道

アイテムの id で指すなら、codec と locator を手書きする必要はありません。locateAsync をそのまま urlStableIdKey({ items, locateAsync }) に渡してください(見つからなければ取得してからインデックスを返します)。下のより完全な例は、別のフィールドで指す場合や、すべてを自分で制御したい場合のものです。

tsx
  • locateAsync が保留中のあいだ、プレイヤーは閉じたままで、パラメーターはそのまま残るので、ディープリンクは取得のあいだも失われません。null か reject でパラメーターは取り除かれます。
  • URL が変わったあと、閉じたあと、アンマウントしたあとに届いた答えは破棄されます。遅い取得が、誰も求めていないスライドを開くことはありません。
  • 保留中は何も描画されません。その読み込み状態はすでにページが持っているので、独自のスケルトンを描画してください。
  • タイムアウトはありません。プレイヤーにはフィードの長さがわからないからです。ページングが尽きたら null で決着をつけてください。そうしないとオーバーレイは閉じたままになります。

API リファレンス

ReelPlayerOverlayProps の Props

ReelPlayerOverlayProps<T>

Propデフォルト説明
apiRefMutableRefObject<ReelApi>-Reel の API にアクセスするための ref
ariaLabelstring'Video player'ダイアログ領域のアクセシブルなラベル。オーバーレイが開くとスクリーンリーダーが読み上げます
aspectRationumber9/16 (0.5625)デスクトップでのプレイヤーのコンテナーの幅と高さの比。モバイルでは常に全画面を使います。
contentT[]必須コンテンツアイテムの配列(ジェネリックで、デフォルトは ContentItem)
initialIndexnumber0開始時のスライドのインデックス
initialInnerIndexnumber0最初に表示する投稿でだけ使う、内側のメディアのインデックス。二軸の URL で、複数メディアの投稿の特定の画像へ直接リンクできます。プレイヤーが開いてユーザーが移動したあとは無視されます。
isOpenboolean必須オーバーレイの表示を制御します。URL で開閉を決めたい場合は、別のコンポーネントの ReelPlayerUrlOverlay を使ってください(下の URL の状態を参照)。
timeline'auto' | 'always' | 'never''auto'組み込みの再生タイムラインバーの表示条件。'auto' は timelineMinDurationSeconds より長い動画でだけ表示し、'always' はアクティブなスライドに動画があれば常に表示し、'never' は組み込みのバーを無効にします(完全に置き換えるには renderTimeline を使います)。
timelineMinDurationSecondsnumber30timeline='auto' で組み込みのバーを表示する動画の最小の長さ(秒)。これより短いループ動画では表示されません。
renderControls(props: ControlsRenderProps) => ReactNode-独自のコントロール。デフォルトの閉じるボタンとサウンドボタンを置き換えます
renderError(props: { item: T; activeIndex: number }) => ReactNode-独自のエラー表示。デフォルトのエラーアイコンを置き換えます
renderLoading(props: { item: T; activeIndex: number }) => ReactNode-独自の読み込み表示。デフォルトの波のローダーを置き換えます
renderNavigation(props: NavigationRenderProps) => ReactNode-独自のナビゲーション。デフォルトの縦方向の矢印を置き換えます
renderNestedNavigation(props: NavigationRenderProps) => ReactNode-ネストした横方向のスライダー(複数メディアの投稿)用の独自のナビゲーション。デフォルトの左右の矢印を置き換えます
renderNestedSlide(props: NestedSlideRenderProps) => ReactNode-ネストした横方向のスライダーのアイテム用の独自のスライドレンダラー。props.defaultContent でデフォルトの ImageSlide/VideoSlide を包むか埋め込みます。renderSlide と違い、null はデフォルトへのフォールバックとして扱われません。
renderSlide(props: SlideRenderProps) => ReactNode | null-独自のスライド描画。デフォルトに戻すには null を返します。props.defaultContent でデフォルトのスライドを包むか埋め込みます。
renderSlideOverlay(item, index, isActive) => ReactNode-スライドごとの独自のオーバーレイ。デフォルトの SlideOverlay を置き換えます。非表示にするには null を返します。
renderTimeline(props: TimelineRenderProps) => ReactNode-独自の再生タイムラインバー。表示条件がデフォルトのバーを描画する場合(同じ auto/always/never と timelineMinDurationSeconds の判定)だけ呼ばれます。props.defaultContent で組み込みの <TimelineBar /> を包み、非表示にするには null を返します。

ReelPlayerUrlOverlay の Props

ReelPlayerUrlOverlayProps<T>

上の見た目と挙動の props をすべて受け取りますが、isOpen の代わりに controller を使います。initialIndex は無視されます。スライドはコントローラーの位置で決まるので、一緒に渡した値は開くたびに上書きされます。

Propデフォルト説明
controllerUrlStateController必須useOverlayUrlState のコントローラー。その位置で、オーバーレイが開いているかどうかと、どのスライドを表示するかが決まります。オーバーレイはスライドの切り替え時と閉じるときに、これを通じて書き戻します。

コールバック

Prop説明
onClose() => voidプレイヤーが閉じたときに呼ばれます。ReelPlayerOverlay では必須です(開閉状態を持つのはあなたなので、閉じる処理も必要です)。ReelPlayerUrlOverlay では任意で、閉じるのは URL が行うので、閉じたあとに反応したいときだけ渡します。
onSlideChange(index: number) => voidスライドが切り替わったあとに呼ばれます
onInnerSlideChange(outerIndex: number, innerIndex: number) => voidアクティブな投稿の内側のメディアのインデックスが変わったときに呼ばれます。複数メディアの投稿内で移動したときと、外側でアクティブになったときで、後者はアクティブになった投稿の現在の内側のインデックス(単一メディアの投稿なら 0)を報告します。

Reel の Props(引き継ぎ)

これらの props は、内部の Reel コンポーネントに渡されます。

Propデフォルト説明
enableNavKeysbooleantrueキーボード操作を有効にします
enableWheelbooleantrueマウスホイールでの操作を有効にします
loopbooleanfalse無限ループを有効にします
swipeDistanceFactornumber0.12スワイプのしきい値(0-1)
transitionDurationnumber300トランジションのアニメーションの長さ(ms)
wheelDebounceMsnumber200ホイールのデバウンス時間(ms)

BaseContentItem

ジェネリックの制約となる型です。これを拡張すると、ReelPlayerOverlay で独自のデータ型を使えます。

typescript

ContentItem

typescript

MediaItem

typescript

MediaType

typescript

ControlsRenderProps<T>

typescript
typescript

SlideRenderProps<T>

typescript

NestedSlideRenderProps

typescript

SlideOverlayProps

typescript

ImageSlideProps

typescript

VideoSlideProps

typescript

CloseButtonProps

typescript

SoundButtonProps

typescript

TimelineBarProps

typescript

TimelineRenderProps<T>

typescript

サブコンポーネント

独自のレンダープロップで組み合わせるために公開されている、再利用できる部品です:

CloseButton

デフォルトのプレイヤーのスタイルを持つ、単独の閉じるボタンです。renderControls の中で使います。

tsx

SoundButton

単独のサウンド切り替えボタンです。SoundProvider の中に置く必要があります(ReelPlayerOverlay が自動で用意します)。

tsx

TimelineBar

デフォルトの再生シークバーです。いちばん近い TimelineProviderReelPlayerOverlay の中に自動でマウントされます)から読み取り、トラック、バッファー済みの範囲、進捗の塗り、シーク用のつまみを描画します。--rk-reel-timeline-* のカスタムプロパティでテーマを変えるか、renderTimeline で置き換えます。

tsx

SlideOverlay

作者、説明、いいねを表示するデフォルトのグラデーションのオーバーレイです。コンテンツに必要なフィールドがあれば自動で描画されます。置き換えるか非表示にするには renderSlideOverlay を使います。

tsx

ImageSlide

遅延読み込みとデフォルトの object-fit: cover を備えた画像スライドです。renderSlide の中で使い、独自のスタイルの画像スライドを組み立てます。

tsx

VideoSlide

iOS で音声を途切れさせないための共有 <video> 要素、ポスターのフレーム、位置の記憶、読み込み表示を備えた動画スライドです。SoundProvider の中に置く必要があります(ReelPlayerOverlay が自動で用意します)。

tsx
独自のスライドを組み立てる

renderSlideImageSlideVideoSlide を組み合わせれば、組み込みの挙動(自動再生、ポスターのキャプチャー、サウンドの同期)をすべて保ったまま、メディアの描画をカスタマイズできます。

tsx

コンテンツの読み込みとエラー処理

プレイヤーはスライドごとの読み込み中とエラーの状態を追跡します。読み込み中は波のローダーを、壊れたメディアにはエラーアイコンを表示します。エラーになった URL はキャッシュされるので、再訪すると再試行せずにすぐエラーを表示します。

ライフサイクルのコールバック

renderSlide を使う場合は、これらのコールバックを呼んで読み込み表示を制御します:

コールバック呼ぶタイミング
onReady画像が読み込まれたか、動画の再生が始まったとき。読み込み中とエラーの状態をクリアします。
onWaiting再生の途中で動画がバッファリングしているとき。読み込み表示を出します。
onErrorコンテンツの読み込みに失敗したとき。エラーのオーバーレイを出し、その URL を壊れたものとしてキャッシュします。
tsx

独自の読み込みとエラーの UI

デフォルトの波のローダーとエラーアイコンを、独自のコンポーネントに置き換えます:

tsx

タイムライン

オーバーレイは、アクティブな動画の上に組み込みの再生タイムラインバーを描画します。timeline プロップで表示条件を決めます:

  • 'auto'(デフォルト):アクティブなメディアが timelineMinDurationSeconds(デフォルト 30)より長い動画のときに表示します。単一動画のスライドにも複数メディアのカルーセルにも使え、バーはアクティブなネストしたアイテムに追従し、画像では非表示になります。
  • 'always':アクティブなスライドに動画があれば常に表示します。
  • 'never':表示しません。renderTimeline で独自のバーを作ってください。
tsx

--rk-reel-timeline-* の CSS カスタムプロパティ(高さ、色、カーソルの大きさ)でテーマを変えます。完全に独自のシークバー、タイムコード、進捗表示を作るには renderTimeline を使います。コールバックは、内部の TimelineController に支えられた timelineState を受け取ります。

サウンドコンテキスト

独自の実装では、サウンドの状態にアクセスできます:

tsx

CSS クラス

CSS クラスはすべて通常のクラス(CSS Modules ではありません)なので、@reelkit/react-reel-player/styles.css のあとに読み込むスタイルシートで、詳細度の高いセレクターを使って指定できます。色、サイズ、z-index を変えるなら、下の テーマ設定 で説明している CSS カスタムプロパティを使ってください。まさにそのためのものです。

クラスコンポーネント説明
.rk-reel-overlayOverlay固定配置のフルスクリーンの背景(背景色、z-index)
.rk-reel-containerOverlayプレイヤーのコンテナー(配置、はみ出し)
.rk-reel-loaderOverlay波の読み込みアニメーションのオーバーレイ
.rk-reel-media-errorOverlayエラー状態のオーバーレイ(中央のアイコンとテキスト)
.rk-reel-media-error-textOverlayエラーメッセージのテキスト
.rk-reel-buttonControls共通の円形アイコンボタン(閉じる、サウンド、ナビゲーションの矢印)
.rk-reel-close-btnControls閉じるボタン
.rk-reel-sound-btnControlsサウンド切り替えボタン
.rk-reel-nav-arrowsNavigationデスクトップ専用の矢印のコンテナー(768px 未満では非表示)
.rk-reel-nav-buttonNavigation個々の前後のナビゲーション矢印
.rk-reel-slide-wrapperSlideメディアとオーバーレイを包むラッパー
.rk-reel-slide-overlaySlideOverlayグラデーションのオーバーレイのコンテナー
.rk-reel-slide-overlay-authorSlideOverlay作者の行(アバターと名前)
.rk-reel-slide-overlay-avatarSlideOverlay作者のアバター画像
.rk-reel-slide-overlay-nameSlideOverlay作者の名前のテキスト
.rk-reel-slide-overlay-descriptionSlideOverlay説明のテキスト
.rk-reel-slide-overlay-likesSlideOverlayいいねの行(ハートと件数)
.rk-reel-video-containerVideoSlide動画のラッパー(背景色、はみ出し)
.rk-reel-video-elementVideoSlide<video> 要素
.rk-reel-video-posterVideoSlideポスター画像(再生でフェードアウト)
.rk-reel-video-poster.rk-visibleVideoSlide動画が一時停止中か読み込み中のあいだ、ポスターに付く状態のモディファイア
.rk-reel-nested-indicatorNestedSlider複数メディアのスライドの下のドットのページネーション(デスクトップとタッチで位置が変わります)
.rk-reel-nested-navNestedSlider横方向のカルーセルの矢印(768px 未満では非表示)
.rk-reel-nested-nav-nextNestedSliderネストした「次へ」の矢印の位置
.rk-reel-nested-nav-prevNestedSliderネストした「前へ」の矢印の位置
.rk-reel-timelineTimelineBarシークバーのラッパー。独自の `renderTimeline` のルートで使えば、下端に沿った配置、セーフエリアの余白、タッチ端末でのスライドオーバーレイとの間隔を引き継げます。
.rk-reel-timeline-trackTimelineBarトラック(未再生の範囲)
.rk-reel-timeline-bufferedTimelineBarバッファー済みの区間のレイヤー
.rk-reel-timeline-fillTimelineBar再生済みの進捗の塗り
.rk-reel-timeline-cursorTimelineBarシーク用のつまみ(トラックの上に浮かびます)

テーマ設定

色、サイズ、z-index、トランジションはすべて CSS カスタムプロパティにあります。:root(またはオーバーレイの任意の祖先)で 1 つでも複数でも上書きすれば、コンポーネントのソースに触れずにテーマを変えられます。

トークンデフォルト制御するもの
--rk-reel-overlay-bg#000フルスクリーンの背景色
--rk-reel-overlay-z1000オーバーレイの z-index
--rk-reel-button-bgrgba(0, 0, 0, 0.5)円形ボタンのデフォルトの背景
--rk-reel-button-bg-hoverrgba(255, 255, 255, 0.1)ナビゲーション矢印の背景(とホバーの基本状態)
--rk-reel-button-bg-hover-strongrgba(255, 255, 255, 0.2)ナビゲーション矢印のホバー時の背景
--rk-reel-button-fg#fffボタンのアイコンの色
--rk-reel-button-size44pxボタンの幅と高さ
--rk-reel-button-radius50%ボタンの角丸
--rk-reel-ui-z10閉じる、サウンド、ナビゲーションの z-index
--rk-reel-edge-padding16px閉じる、サウンド、ナビゲーション矢印の端からの距離
--rk-reel-nav-gap8px縦に並んだナビゲーション矢印の間隔
--rk-reel-transition0.2sホバーのトランジションの長さ
--rk-reel-loader-colorrgba(255, 255, 255, 0.12)波のローダーのグラデーションの色
--rk-reel-loader-duration1.8s波のローダーのアニメーションの長さ
--rk-reel-error-fgrgba(255, 255, 255, 0.4)エラーアイコンとテキストの色
--rk-reel-error-text-size13pxエラーメッセージの文字サイズ
--rk-reel-slide-overlay-bglinear-gradient(transparent, rgba(0, 0, 0, 0.7))キャプションの背景のグラデーション
--rk-reel-slide-overlay-padding48px 16px 16pxキャプションの内側の余白
--rk-reel-slide-overlay-name-color#fff作者の名前の色
--rk-reel-slide-overlay-description-colorrgba(255, 255, 255, 0.9)説明のテキストの色
--rk-reel-slide-overlay-likes-colorrgba(255, 255, 255, 0.8)いいねの行のテキストの色
--rk-reel-video-bg#000<video> の後ろのレターボックスの背景
--rk-reel-nested-button-bgrgba(0, 0, 0, 0.5)ネストした矢印の背景
--rk-reel-nested-button-bg-hoverrgba(255, 255, 255, 0.2)ネストした矢印のホバー時の背景
--rk-reel-nested-button-size36pxネストした矢印の大きさ
--rk-reel-nested-edge-padding12pxネストした矢印の端からの距離
--rk-reel-timeline-trackrgba(255, 255, 255, 0.22)トラックの背景(未再生の範囲)
--rk-reel-timeline-bufferedrgba(255, 255, 255, 0.4)バッファー済みの区間の色
--rk-reel-timeline-fill#fff再生済みの進捗の塗りの色
--rk-reel-timeline-cursor#fffシーク用のつまみの色
--rk-reel-timeline-height3px通常時のトラックの高さ
--rk-reel-timeline-height-active6pxホバー、フォーカス、シーク中のトラックの高さ
--rk-reel-timeline-cursor-width10px通常時のつまみの幅
--rk-reel-timeline-cursor-width-active14pxシーク中のつまみの幅
--rk-reel-timeline-cursor-height24px通常時のつまみの高さ
--rk-reel-timeline-cursor-height-active32pxシーク中のつまみの高さ
--rk-reel-timeline-hitbox16pxトラックの上に追加されるポインターの当たり判定
--rk-reel-timeline-transition0.15s ease-outトラックとつまみが伸び縮みするアニメーション
--rk-reel-timeline-z11タイムラインの z-index(デフォルトの UI レイヤーより上)

下のスニペットを、@reelkit/react-reel-player/styles.css のあとに読み込むスタイルシートに入れてください。

css

アクセシビリティ

オーバーレイのルートはモーダルダイアログ(role="dialog"aria-modal="true")です。ariaLabel を指定すると、スクリーンリーダーの読み上げが変わります。デフォルトは「Video player」です。各スライドは role="group"aria-roledescription="slide"aria-label="Slide N of M" を持つので、スワイプすると並びの中の位置が読み上げられます。

オーバーレイは開くとフォーカスを取り込み、閉じるとトリガーに戻します。Tab と Shift+Tab は中のフォーカス可能な要素を循環し、外へ出たフォーカス(外側のクリック、プログラムからのフォーカス)は引き戻されます。@reelkit/corecaptureFocusForReturncreateFocusTrap で実装されています。

キーボードショートカット

キー動作
ArrowUp前のスライド
ArrowDown次のスライド
ArrowLeft前のメディア(ネストしたスライダー内)
ArrowRight次のメディア(ネストしたスライダー内)
Escapeプレイヤーを閉じる