mediaLoader / CLoading
ページ内の <img> / <video>(+任意の非同期処理)の読み込みを監視し、進捗(0〜100%)と完了フラグを提供する。
使い方は2通り。
関数版 mediaLoader() は進捗の受け取り方(onProgress/onComplete/promise)や対象スコープを細かく制御できる低レベルAPI。
コンポーネント版 <CLoading> はその mediaLoader をエンジンに、全画面ローディング(プリローダー)のマークアップ・初期化・フェードアウトまで内包した、ページ先頭に置くだけのドロップイン。
どちらも失敗を進捗に算入し必ず完了に到達し、tasks(canvas 初期化など)を同じ進捗に合流できる。
mediaLoader(関数)
低レベルAPI。「読み込みを開始」を押すと、キャッシュを回避して画像・動画を取得し直し、擬似 canvas 初期化(約1.2秒)も待機して、進捗バー・パーセンテージ・完了フラグの変化を確認できる。
進捗・パーセンテージ・完了フラグ(tasks 合流)
mediaLoader をギャラリー要素をスコープにして実行し、tasks に擬似 canvas 初期化を渡している。onProgress で進捗バーとパーセンテージ(total にタスク分が加算される)を、onComplete で完了フラグ(バッジ)を更新している。
コードを見る
import { mediaLoader } from 'form-snippets';
const loader = mediaLoader({
target: gallery,
timeout: 10000,
// canvas 初期化などの非同期処理も同じ進捗に合流させる
tasks: [() => new Promise((resolve) => setTimeout(resolve, 1200))],
onProgress: (percent, { loaded, total }) => {
bar.style.width = percent + '%';
label.textContent = percent + '% (' + loaded + '/' + total + ')';
},
onComplete: () => {
badge.textContent = '完了';
badge.classList.add('is-complete');
},
});
// await loader.promise; で完了を待つこともできる CLoading(コンポーネント)
mediaLoader を内包した全画面ローディング。「再生」を押すと、実際の <CLoading>(bare で枠内表示)がローディング表示 → 完了フェードアウトする流れを確認できる。
ページ先頭に置くだけ
本番はページ先頭に
コードを見る
---
import CLoading from 'form-snippets/CLoading.astro';
---
<CLoading min={800} /> canvas 初期化なども待たせる
CLoading より前に window.__C_LOADING_TASKS へ Promise / () => Promise を積むと、メディアと同じ進捗に合流し、それらの完了までローディングを継続する。
上のプレビューでも擬似 canvas 初期化タスク(約1.2秒)を積んでおり、画像・動画が出揃っても タスク完了までフェードアウトしない挙動を確認できる。
コードを見る
<script>
// CLoading は window.__C_LOADING_TASKS を読み、メディアと同じ進捗に合流させる
window.__C_LOADING_TASKS = [() => initCanvas()];
</script>
<CLoading min={800} timeout={10000} />