由于 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) 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 } }
|