はじめに
reelkit は 一度に 1 つのアイテムだけを表示するスライダー です。TikTok、Instagram Reels、Stories のように、画面には常に 1 つのアイテムが表示されます。縦型の動画フィード、フルスクリーンのギャラリー、スワイプで切り替えるコンテンツに最適です。
ReelKit を気に入っていただけましたか?
ReelKit が役に立ったら、GitHub でスターを付けていただけるとうれしいです。ほかの開発者がプロジェクトを見つけやすくなり、開発を続ける力になります。応援していただき、心から感謝しています!
0.x.x — Unstable API
ReelKit は活発に開発中です。バージョンが 0.x.x のあいだは、非推奨期間を設けずにマイナーバージョン間で API が変わることがあります。予期しない破損を避けるため、バージョンを固定してください。
フレームワークを選ぶ
オンラインで試す
インストール不要で、ブラウザーからそのまま試せます:
クイックスタート
React で作る最小限の縦型スライダー:
tsx
import { Reel, ReelIndicator } from '@reelkit/react';
const items = [
{ id: 1, title: 'Slide 1', color: '#6366f1' },
{ id: 2, title: 'Slide 2', color: '#8b5cf6' },
{ id: 3, title: 'Slide 3', color: '#ec4899' },
];
function App() {
return (
<Reel
count={items.length}
size={[400, 600]}
direction="vertical"
enableWheel
itemBuilder={(index) => (
<div
style={{
width: '100%',
height: '100%',
background: items[index].color,
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
fontSize: '2rem',
color: 'white',
}}
>
{items[index].title}
</div>
)}
>
<ReelIndicator />
</Reel>
);
}クイックスタート
Angular で作る最小限の縦型スライダー:
typescript
import { Component } from '@angular/core';
import {
ReelComponent,
ReelIndicatorComponent,
RkReelItemDirective,
} from '@reelkit/angular';
const items = [
{ id: 1, title: 'Slide 1', color: '#6366f1' },
{ id: 2, title: 'Slide 2', color: '#8b5cf6' },
{ id: 3, title: 'Slide 3', color: '#ec4899' },
];
@Component({
standalone: true,
imports: [ReelComponent, ReelIndicatorComponent, RkReelItemDirective],
template: `
<rk-reel [count]="items.length" [size]="[400, 600]"
direction="vertical" [enableWheel]="true">
<ng-template rkReelItem let-i let-size="size">
<div [style.width.px]="size[0]" [style.height.px]="size[1]"
[style.background]="items[i].color"
style="display:flex;align-items:center;justify-content:center;
font-size:2rem;color:#fff">
{{ items[i].title }}
</div>
</ng-template>
<rk-reel-indicator />
</rk-reel>
`,
})
export class AppComponent {
readonly items = items;
}クイックスタート
Vue で作る最小限の縦型スライダー:
vue
<script setup lang="ts">
import { Reel, ReelIndicator } from '@reelkit/vue';
const items = [
{ id: 1, title: 'Slide 1', color: '#6366f1' },
{ id: 2, title: 'Slide 2', color: '#8b5cf6' },
{ id: 3, title: 'Slide 3', color: '#ec4899' },
];
</script>
<template>
<Reel
:count="items.length"
:size="[400, 600]"
direction="vertical"
enable-wheel
>
<template #item="{ index, size }">
<div
:style="{
width: size[0] + 'px',
height: size[1] + 'px',
background: items[index].color,
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
fontSize: '2rem',
color: '#fff',
}"
>
{{ items[index].title }}
</div>
</template>
<ReelIndicator />
</Reel>
</template>主な概念
Reel
Reel コンポーネントはメインのコンテナーです。スライダーの状態を管理し、タッチジェスチャー、キーボード操作、アニメーションを処理します。スライドの描画には itemBuilder によるレンダープロップパターンを使います。
itemBuilder
itemBuilder プロップは、インデックスを受け取って各スライドの内容を返す関数です。このパターンによって仮想化が可能になり、表示中のアイテムだけが描画されます。
ReelIndicator
スライダー内の現在位置を示す、Instagram 風の進捗インジケーターを表示する任意のコンポーネントです。
tsx
import { Reel, ReelIndicator } from '@reelkit/react';
function App() {
return (
<Reel
count={items.length}
size={[400, 600]}
itemBuilder={(index) => <Slide data={items[index]} />}
>
<ReelIndicator />
</Reel>
);
}html
<rk-reel [count]="items.length" [size]="[400, 600]">
<ng-template rkReelItem let-index>
<app-slide [data]="items[index]" />
</ng-template>
<rk-reel-indicator />
</rk-reel>vue-html
<Reel :count="items.length" :size="[400, 600]">
<template #item="{ index }">
<Slide :data="items[index]" />
</template>
<ReelIndicator />
</Reel>ナビゲーション
組み込みの操作方法:
- タッチ/スワイプ: ドラッグで移動し、慣性とスナップが効きます
- キーボード: 矢印キー(オーバーレイ系のコンポーネントは Escape でも閉じます)
- マウスホイール:
enableWheelプロップで有効にします - プログラムから:
apiRefでnext()、prev()、goTo()を呼びます
tsx
import { useRef } from 'react';
import { Reel, type ReelApi } from '@reelkit/react';
function App() {
const apiRef = useRef<ReelApi>(null);
return (
<>
<Reel
count={10}
size={[400, 600]}
apiRef={apiRef}
itemBuilder={(index) => <Slide index={index} />}
/>
<button onClick={() => apiRef.current?.prev()}>Prev</button>
<button onClick={() => apiRef.current?.next()}>Next</button>
<button onClick={() => apiRef.current?.goTo(5)}>Go to 5</button>
</>
);
}html
<rk-reel
[count]="10"
[size]="[400, 600]"
(apiReady)="reelApi = $event"
>
<ng-template rkReelItem let-index>
<app-slide [index]="index" />
</ng-template>
</rk-reel>
<button (click)="reelApi?.prev()">Prev</button>
<button (click)="reelApi?.next()">Next</button>
<button (click)="reelApi?.goTo(5)">Go to 5</button>vue
<script setup lang="ts">
import { ref } from 'vue';
import { Reel, type ReelExpose } from '@reelkit/vue';
const reelRef = ref<InstanceType<typeof Reel> & ReelExpose>();
</script>
<template>
<Reel ref="reelRef" :count="10" :size="[400, 600]">
<template #item="{ index }">
<Slide :index="index" />
</template>
</Reel>
<button @click="reelRef?.prev()">Prev</button>
<button @click="reelRef?.next()">Next</button>
<button @click="reelRef?.goTo(5)">Go to 5</button>
</template>次のステップ
- インストール - すべてのパッケージとセットアップ方法
- Core ガイド - フレームワークに依存しないエンジン
- フレームワークガイド - コンポーネント、デモ、組み込み方フレーム ワークガイド - コンポーネント、デモ、組み込み方フレームワークガイド - コンポーネント、デモ、組み込み方
- Reel Player - TikTok/Reels 風の動画プレイヤーReel Player - TikTok/Reels 風の動画プレイヤーReel Player - TikTok/Reels 風の動画プレイヤー
- Lightbox - 画像と動画のギャラリーLightbox - 画像と動画のギャラリーLightbox - 画像と動画のギャラリー
- Stories Player - Instagram 風のストーリービューアーStories Player - Instagram 風のストーリービューアーStories Player - Instagram 風のストーリービューアー