メインコンテンツにスキップ

<audio><video>要素のプロパティにバインドすることで、例えば、AudioPlayer.svelteのようにカスタムプレイヤーUIを簡単に構築できます。

まず、<audio>要素とそのバインディングを追加します(srcdurationpausedには短縮形を使用します)。

AudioPlayer
<div class="player" class:paused>
	<audio
		{src}
		bind:currentTime={time}
		bind:duration
		bind:paused
	></audio>

	<button
		class="play"
		aria-label={paused ? 'play' : 'pause'}
	></button>

次に、pausedを切り替える<button>にイベントハンドラーを追加します。

AudioPlayer
<button
	class="play"
	aria-label={paused ? 'play' : 'pause'}
	onclick={() => paused = !paused}
></button>

これで、オーディオプレイヤーは基本的な機能を持つようになりました。スライダーをドラッグしてトラックの特定の部分にシークする機能を追加しましょう。スライダーのpointerdownハンドラー内にseek関数があり、そこでtimeを更新できます。

AudioPlayer
function seek(e) {
	const { left, width } = div.getBoundingClientRect();

	let p = (e.clientX - left) / width;
	if (p < 0) p = 0;
	if (p > 1) p = 1;

	time = p * duration;
}

トラックが終わったら、優しく巻き戻しましょう

AudioPlayer
<audio
	{src}
	bind:currentTime={time}
	bind:duration
	bind:paused
	onended={() => {
		time = 0;
	}}
></audio>

<audio><video>の完全なバインディングセットは次のとおりです。7つの読み取り専用バインディング...

  • duration — 合計時間(秒単位)
  • buffered{start, end}オブジェクトの配列
  • seekable — 同上
  • played — 同上
  • seeking — ブール値
  • ended — ブール値
  • readyState — 0から4までの数値(両端含む)

...と、5つの双方向バインディング

  • currentTime — 再生ヘッドの現在の位置(秒単位)
  • playbackRate — 再生速度の調整(1が「通常」)
  • paused — これは自明でしょう
  • volume — 0から1までの値
  • muted — trueの場合ミュートされるブール値

さらに、ビデオには読み取り専用のvideoWidthvideoHeightのバインディングがあります。

GitHubでこのページを編集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<script>
	import AudioPlayer from './AudioPlayer.svelte';
	import { tracks } from './tracks.js';
</script>
 
<div class="centered">
	{#each tracks as track}
		<AudioPlayer {...track} />
	{/each}
</div>
 
<style>
	.centered {
		display: flex;
		flex-direction: column;
		height: 100%;
		justify-content: center;
		gap: 0.5em;
		max-width: 40em;
		margin: 0 auto;
	}
</style>