Bạn có thể bind thuộc tính của phần tử <audio> và <video>, giúp bạn dễ dàng xây dựng giao diện trình phát tùy chỉnh, chẳng hạn như AudioPlayer.svelte.
Đầu tiên, thêm phần tử <audio> cùng với các phép bind của nó (chúng ta sẽ sử dụng dạng viết tắt cho src, duration và paused):
AudioPlayer.svelte
<div class="player" class:paused>
<audio
{src}
bind:currentTime={time}
bind:duration
bind:paused
></audio>
<button
class="play"
aria-label={paused ? 'play' : 'pause'}
></button>Tiếp theo, thêm một trình xử lý sự kiện cho
AudioPlayer.svelte
<button
class="play"
aria-label={paused ? 'play' : 'pause'}
on:click={() => paused = !paused}
></button>Bây giờ, trình phát audio của chúng ta đã có chức năng cơ bản. Hãy thêm khả năng tua đến một phần cụ thể của bản nhạc bằng cách kéo thanh trượt. Bên trong trình xử lý pointerdown của thanh trượt có một hàm seek, nơi chúng ta có thể cập nhật time:
AudioPlayer.svelte
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;
}Khi bản nhạc kết thúc, hãy lịch sự - tua lại:
AudioPlayer.svelte
<audio
{src}
bind:currentTime={time}
bind:duration
bind:paused
on:ended={() => {
time = 0;
}}
></audio>Tổng số phép bind đầy đủ cho
duration(chỉ đọc) — tổng thời tính bằng giâybuffered(chỉ đọc) — một mảng các đối tượng{start, end}seekable(chỉ đọc) — như trênplayed(chỉ đọc) — như trênseeking(chỉ đọc) — booleanended(chỉ đọc) — booleanreadyState(chỉ đọc) — số giữa (và bao gồm) 0 và 4
...và năm phép bind hai chiều:
currentTime— điểm đang phát hiện tại của video, tính bằng giâyplaybackRate— phát nhanh hơn hoặc chậm lại (1là 'bình thường')paused— dừngvolume— một giá trị giữa 0 và 1muted— một giá trị boolean, trong đó true là tắt tiếng
Video còn có các phép bind chỉ đọc với videoWidth và 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>