时光的涂鸦墙

code is poetry

基于react的audio组件

由于 mac 和 window 的样式不一致导致~~

1
// 组件调用 <audio src="{src地址}" id="{srcID}" />

audio 属性

  • src 歌曲的路径
  • preload 是否在页面加载后立即加载(设置 autoplay 后无效)
  • controls 显示 audio 自带的播放控件
  • loop 音频循环
  • autoplay 音频加载后自动播放
  • currentTime 音频当前播放时间
  • duration 音频总长度
  • ended 音频是否结束
  • muted 音频静音为 true
  • volume 当前音频音量
  • readyState 音频当前的就绪状态

audio 事件

  • abort 当音频/视频的加载已放弃时
  • canplay 当浏览器可以播放音频/视频时
  • canplaythrough 当浏览器可在不因缓冲而停顿的情况下进行播放时
  • durationchange 当音频/视频的时长已更改时
  • emptied 当目前的播放列表为空时
  • ended 当目前的播放列表已结束时
  • error 当在音频/视频加载期间发生错误时
  • loadeddata 当浏览器已加载音频/视频的当前帧时
  • loadedmetadata 当浏览器已加载音频/视频的元数据时
  • loadstart 当浏览器开始查找音频/视频时
  • pause 当音频/视频已暂停时
  • play 当音频/视频已开始或不再暂停时
  • playing 当音频/视频在已因缓冲而暂停或停止后已就绪时
  • progress 当浏览器正在下载音频/视频时
  • ratechange 当音频/视频的播放速度已更改时
  • seeked 当用户已移动/跳跃到音频/视频中的新位置时
  • seeking 当用户开始移动/跳跃到音频/视频中的新位置时
  • stalled 当浏览器尝试获取媒体数据,但数据不可用时
  • suspend 当浏览器刻意不获取媒体数据时
  • timeupdate 当目前的播放位置已更改时
  • volumechange 当音量已更改时
  • waiting 当视频由于需要缓冲下一帧而停止

组件结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 <div className="audioBox">
<audio
id={`audio${id}`}
src={src}
preload={true}
onCanPlay={() => this.controlAudio('allTime')}
onTimeUpdate={(e) => this.controlAudio('getCurrentTime')}
>
您的浏览器不支持 audio 标签。
</audio>
<i
className={isPlay ? 'pause' : 'play'}
onClick={() => this.controlAudio(isPlay ? 'pause' : 'play')}
/>
<span className="current">
{this.millisecondToDate(currentTime)+'/'+this.millisecondToDate(allTime)}
</span>
<input
type="range"
className="time"
step="0.01"
max={allTime}
value={currentTime}
onChange={(value) => this.controlAudio('changeCurrentTime',value)}
/>
<i
className={isMuted ? 'mute' : 'nomute'}
onClick={() => this.controlAudio('muted')}
/>
<input
type="range"
className="volume"
onChange={(value) => this.controlAudio('changeVolume',value)}
value={isMuted ? 0 : volume}
/>
</div>

组件 javascript

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
constructor(props) {
super(props)
this.state = {
isPlay: false,
isMuted: false,
volume: 100,
allTime: 0,
currentTime: 0
}
}

millisecondToDate(time) {
const second = Math.floor(time % 60)
let minite = Math.floor(time / 60)
// let hour
// if(minite > 60) {
// hour = minite / 60
// minite = minite % 60
// return `${Math.floor(hour)}:${Math.floor(minite)}:${Math.floor(second)}`
// }
return `${minite}:${second >= 10 ? second : `0${second}`}`
}

controlAudio(type,value) {
const { id,src } = this.props
const audio = document.getElementById(`audio${id}`)
switch(type) {
case 'allTime':
this.setState({
allTime: audio.duration
})
break
case 'play':
audio.play()
this.setState({
isPlay: true
})
break
case 'pause':
audio.pause()
this.setState({
isPlay: false
})
break
case 'muted':
this.setState({
isMuted: !audio.muted
})
audio.muted = !audio.muted
break
case 'changeCurrentTime':
this.setState({
currentTime: value
})
audio.currentTime = value
if(value == audio.duration) {
this.setState({
isPlay: false
})
}
break
case 'getCurrentTime':
this.setState({
currentTime: audio.currentTime
})
if(audio.currentTime == audio.duration) {
this.setState({
isPlay: false
})
}
break
case 'changeVolume':
audio.volume = value / 100
this.setState({
volume: value,
isMuted: !value
})
break
}
}

© 2019 elaine