<audio>
と<video>
要素のプロパティにバインドすることで、例えば、AudioPlayer.svelte
のようにカスタムプレイヤーUIを簡単に構築できます。
まず、<audio>
要素とそのバインディングを追加します(src
、duration
、paused
には短縮形を使用します)。
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の場合ミュートされるブール値
さらに、ビデオには読み取り専用のvideoWidth
とvideoHeight
のバインディングがあります。
前へ 次へ
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>