最终呈现结果

传入的prop   musicInfoList  数据

[{"id": "001","musicName": "永远都会在","musicArt": "旅行团乐队","musicSrc": "/src/assets/music/永远都会在-旅行团乐队.flac","musicLyricsSrc": "/src/assets/music/永远都会在-旅行团乐队.text"},{"id": "002","musicName": "日落大道","musicArt": " 梁博","musicSrc": "/src/assets/music/梁博-日落大道.flac","musicLyricsSrc": "/src/assets/music/梁博-日落大道.text"}
]

react 音乐播放器实现逻辑源码

import React, { useEffect, useRef, useState } from 'react'
import { Image, Slider } from 'antd'
import {CustomerServiceOutlined,AudioOutlined,DoubleLeftOutlined,BackwardOutlined,PlayCircleFilled,PauseCircleFilled,ForwardOutlined,FunnelPlotFilled,
} from '@ant-design/icons'
import './index.less'
import musicUrl from '@/assets/image/img.jpg'export default function MusicBox({ musicInfoList }) {//  音乐播放器对象const musicRef = useRef()//   音乐信息const [musicInfo, setMusicInfo] = useState([])//   音乐信息索引const [musicIndex, setMusicIndex] = useState(0)//   音乐地址const [musicSrc, setMusicSrc] = useState('')//   音乐名称const [musicName, setMusicName] = useState('')//   音乐创作者const [musicArt, setMusicArt] = useState('')//   音乐当前时间const [currentTime, setCurrentTime] = useState(0)//   音乐时长const [maxTime, setMaxTime] = useState('')//   播放器音量const [musicVolume, setMusicVolume] = useState('')//   音乐定时器const [musicTimer, setMusicTimer] = useState('')//   音乐是否在播放const [musicPlay, setMusicPlay] = useState(false)// 监听音乐列表是否加载完毕useEffect(() => {if (musicInfo.length === 0) return setMusicInfo([...musicInfoList])setMusicName(musicInfo[musicIndex].musicName)setMusicArt(musicInfo[musicIndex].musicArt)setMusicSrc(musicInfo[musicIndex].musicSrc)}, [musicInfo])// 监听播放的音乐索引useEffect(() => {if (musicInfo.length == 0) returnconst { musicName, musicArt, musicSrc } = musicInfo[musicIndex]setMusicName(musicName)setMusicArt(musicArt)setMusicSrc(musicSrc)setTimeout(playMusic, 500)}, [musicIndex])// 歌曲时间格式化const songTimeFilter = (val) => {const dt = new Date(val * 1000)// 分秒const mm = (dt.getMinutes() + '').padStart(2, '0')const ss = (dt.getSeconds() + '').padStart(2, '0')return `${mm}:${ss}`}// 控制音乐播放const playMusic = () => {if (musicRef.current.paused) {if (!musicVolume) {musicRef.current.volume = 0.1setMusicVolume(0.1)}musicRef.current.play()watchMusicInfo()setMusicPlay(true)} else {musicRef.current.pause()setMusicPlay(false)clearInterval(musicTimer)}}// 监听音乐播放信息const watchMusicInfo = () => {clearInterval(musicTimer)setMaxTime(musicRef.current.duration)// 设置定时器,每 0.5s 更新一下歌曲进度const theTimer = setInterval(() => {setMusicTimer(theTimer)//   如果音乐暂停了,结束定时器if (musicRef.current.paused) {clearInterval(musicTimer)setMusicPlay(false)}//   如果音乐播放结束了,结束定时器if (musicRef.current.ended) {clearInterval(musicTimer)setMusicPlay(false)changePlayMusic(1)}setCurrentTime(musicRef.current.currentTime)}, 500)}// 通过进度条更改歌曲播放进度const changeMusicTime = (value) => {clearInterval(musicTimer)musicRef.current.currentTime = valueif (musicRef.current.paused) musicRef.current.play()setMusicPlay(true)watchMusicInfo()}// 设置音乐播放器音量const setVolume = (val) => {if (!musicVolume) {musicRef.current.volume = 0.1setMusicVolume(0.1)return}if (!val) returnmusicRef.current.volume = val}// 调整音量const changePlayerVolume = (value) => {if (value == 0) return (musicRef.current.volume = 0)setMusicVolume(value / 10)setVolume(value / 10)}// 格式化 Tooltip 的内容const formatter = (value) => songTimeFilter(value)// 切换歌曲的播放const changePlayMusic = (num) => {const index = musicIndex + numif (index < 0) return setMusicIndex(musicInfo.length - 1)if (index >= musicInfo.length) return setMusicIndex(0)setMusicIndex(index)}return (<div className="musicBox">{/* 音乐播放器   */}<audio ref={musicRef} type="audio/flac" src={musicSrc}></audio>{/* 左侧歌曲图片 */}<div className="musicImage"><Image width={120} src={musicUrl} /></div>{/* 中部歌曲信息 */}<div className="musicInfo"><div className="musicDesc"><CustomerServiceOutlinedstyle={{ color: '#ac8edc', paddingRight: '10px' }}/>{musicName}</div><div className="musicDesc"><AudioOutlined style={{ color: '#ac8edc', paddingRight: '10px' }} />{musicArt}</div>{/* 歌曲进度条 */}<div className="progressBar"><Slidertooltip={{ formatter }}value={currentTime}max={maxTime}onChange={(value) => setCurrentTime(value)}onAfterChange={changeMusicTime}/><div className="musicTime">{songTimeFilter(currentTime)} / {songTimeFilter(maxTime)}</div></div>{/* 操作按钮 */}<div className="operationBar"><BackwardOutlinedstyle={{ fontSize: '28px' }}onClick={() => changePlayMusic(-1)}/>{musicPlay ? (<PauseCircleFilledstyle={{ fontSize: '22px' }}onClick={playMusic}/>) : (<PlayCircleFilledstyle={{ fontSize: '22px' }}onClick={playMusic}/>)}<ForwardOutlinedstyle={{ fontSize: '28px' }}onClick={() => changePlayMusic(1)}/><FunnelPlotFilled style={{ fontSize: '22px' }} rotate={90} /><div className="volume"><Slider defaultValue={1} max={10} onChange={changePlayerVolume} /></div></div></div>{/* 右侧箭头按钮 */}<div><DoubleLeftOutlined /></div></div>)
}

样式部分

.musicBox {display: flex;align-items: center;width: 360px;height: 130px;background-color: #fcf1f0;border-radius: 80px;
}.musicImage {width: 120px;height: 120px;border-radius: 50%;display: flex;align-items: center;justify-content: center;overflow: hidden;margin-top: 10px;margin-bottom: 10px;margin-left: 10px;animation: fadenum 60s infinite;@keyframes fadenum {100% {transform: rotate(360deg);}}
}.musicInfo {width: 195px;margin-right: 10px;.musicDesc {margin-top: 5px;margin-bottom: 5px;color: #65567e;font-size: 14px;font-weight: bold;}.progressBar {width: 193px;margin-top: 10px;.ant-slider {margin: 0;margin-left: 10px;}.musicTime {font-size: 13px;display: flex;justify-content: flex-end;padding-top: 4px;}}.operationBar {display: flex;justify-content: space-between;align-items: center;.volume {width: 80px;}}
}

react + antd 实现一个音乐播放器相关推荐

  1. 用React做一个音乐播放器

    介绍 任何正在学习 React 并想使用 React 构建项目的人.有各种博客和文章可以为开发人员指导此类项目.我确实浏览过这些文章,但其中总是缺少一种项目.缺少的项目是音乐播放器和视频播放器.这两个 ...

  2. 基于React开发一个音乐播放器

    同时支持 Mac 与 Windows 系统. 下载地址 掘金链接 项目使用 electron 作为外壳,webpack 作为打包工具,核心技术包括 React + Redux + React-rout ...

  3. 听音乐不过瘾?自制一个音乐播放器!| 原力计划

    作者 | 灰小猿 责编 | 夕颜 出品 | CSDN博客 最近在学习C#的GUI编程时想着自制一个播放器,说干就干. 其实C#除了在游戏开发上具有显著优势以外,在winform交互页面设计和web网站 ...

  4. 用vue简单写一个音乐播放器

    简单地写一个功能比较全的音乐播放器 前言 因为音乐播放器是一个很可能在项目遇到的东西,早写总比晚写好.趁没事先写个. 思路 一个音乐播放器该有的东西: 封面,歌名,专辑,作者 控制器(上一首,下一首, ...

  5. 如何使用uni-app做一个音乐播放器

    如何使用uni-app做一个音乐播放器 uni-app提供给我们非常棒的API,可以做出很好看的自定义样式的音乐播放器 好的编译器可以让我们的项目事半功倍,HBuilderX可以很方便的创建uni-a ...

  6. 写一个音乐播放器的微信小程序

    要创建一个音乐播放器的微信小程序,您需要熟悉微信小程序的开发环境和语言(如 JavaScript 和 WXML/WXSS). 具体来说,您需要做以下几件事: 设计音乐播放器的用户界面,并使用 WXML ...

  7. html5开发一个音乐播放器,HTML5开发学习(1):使用aduio标签打造音乐播放器

    关于html5的炒作已经有一段时间了,小弟亦是个跟风之人,对该新鲜事物也充满好奇和期待.本文为该系列(html5尝鲜)第一节,先以一个简单的demo开胃,希望能勾起各位同学对html5的兴趣和关注. ...

  8. 教你用树莓派Python打造一个音乐播放器

    买了个树莓派3B+,装好系统后灰落了好厚一层都不知道要干嘛...最近突发奇想:用树莓派做一个音乐播放器,每天6:30-7:20自动播放英语听力,强迫自己练习英语,也治治自己的懒床习惯,平时也可以用来听 ...

  9. 使用小程序制作一个音乐播放器

    此文主要通过小程序制作一个音乐播放器,实现轮播.搜索.播放.快进.暂停.上一曲.下一曲等功能. 一.创建小程序 二.设计页面 三.接口渲染 一.创建小程序 访问微信公众平台,点击账号注册. 选择小程序 ...

最新文章

  1. 身为 Java 程序员必须掌握的 10 款开源工具!
  2. 数据中心供电有多重要,看看这件事就知道了
  3. [CLPR] 定位算法探幽 - 边缘和形态学
  4. 一个略显复杂的transformation算子_distinct
  5. CRM Fiori Launchpad初次登陆后返回的service metadata信息
  6. C++之类模板最简单的使用
  7. 北京soul_Soul高智商情侣,机器人博士邂逅科技记者,跨越1200公里来相爱
  8. python入职要求_Python入职面试,可能会被企业HR问到的问题,你准备好了吗
  9. WEB的发展历程、Tomcat服务器、与HTTP协议
  10. Struts2之OGNL类型转换
  11. 01-bilibilidemo配置
  12. koa学习笔记(一)环境安装及文件目录
  13. BP神经网络预测模型+粒子群算法优化的BP神经网络(PSO-BP)预测模型,基于Matlab
  14. 如何自动生成测试用例方案
  15. Java如何使用IP代理
  16. html中的空格怎么输入法,输入法空格怎么打
  17. python输出边长为n的正方形_将一个正方形分成N个较小的正方形并求N个较小正方形的中心坐标...
  18. windows10 LTSC版本 安装应用商店及聚焦屏保
  19. 一个关于微信微信免费自动投票软件与专门投票的微信群的教程介绍
  20. 代理IP 有效性检测

热门文章

  1. AP2403 DC-DC 降压恒流12-80V 四线高低亮爆闪 外置驱动方案
  2. ScrollView制作屏幕滚动效果
  3. java web 图片显示_JavaWeb将图片显示在浏览器中
  4. BM13 判断一个链表是否为回文结构
  5. k8s pod has unbound immediate PersistentVolumeClaims
  6. java-php-python-ssm思政课程在线考试系统计算机毕业设计
  7. 无盘系统及服务器,无盘系统服务器
  8. 为什么服务器一定放去机房托管?
  9. 解决 Heroku CLI 登录问题
  10. 天津大学计算机控制技术实验,薛婷-电气自动化与信息工程学院官网