当前位置:   article > 正文

原生H5+JS+CSS实现音乐播放器(上下一首,随机单曲循环播放,进度条,播放列表)_css切换歌曲

css切换歌曲

学了前端小半个月了,今天自己动手写一个音乐播放器实现的功能有 播放列表 ,随机单曲循环播放,上下一首,暂停和开始,静音,音量增加减少,进度条(收藏功能暂未实现,为了排版好看添加的,后续补充收藏等功能)。

话不多说,下面进入到h5页面的代码

 h5页面:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <link rel="stylesheet" type="text/css" href="./css/audioCSS.css">
  7. </head>
  8. <body id="body" background="./img/bandaotiehe.jpg">
  9. <!--音乐播放图片-->
  10. <img id="musicImg" src="" title="" width="400px" height="400px">
  11. <!--音乐播放名字-->
  12. <div id="musicName" class="name" id="musicName"></div>
  13. <div class="item">
  14. <ul id="listALL">
  15. </ul>
  16. </div>
  17. <div class="main" id="main" >
  18. <audio id="audio" src=""></audio>
  19. <div id="collect" title="收藏"></div>
  20. <div id="list" title="列表"></div>
  21. <div id="selection" title="循环播放"></div>
  22. <div id="prev" title="上一首"></div>
  23. <div id="play" title="播放"></div>
  24. <div id="next" title="下一首"></div>
  25. <div id="slince" title="静音"></div>
  26. <div id="rise" title="加音量"></div>
  27. <div id="minus" title="减音量"></div>
  28. </div>
  29. <br>
  30. <div class="progress" id="progress">
  31. <span class="cTime time" id="cTime">00:00</span> <!-- 当前时间 -->
  32. <meter value="0" max="100" id="meter" ></meter><!-- 进度条 -->
  33. <span class="tTime time" id="tTime">00:00</span> <!-- 总的时间 -->
  34. </div>
  35. <script src="./js/audio01.js"></script>
  36. </body>
  37. </html>

 下面CSS的页面

2023.3.25更新 #listALL   .firstMusic 样式 

  1. {
  2. padding: 0;
  3. margin: 0;
  4. box-sizing: border-box;
  5. }
  6. html,body{
  7. height: 100%;
  8. background-size:cover;
  9. backdrop-filter: blur(100px);
  10. }
  11. @keyframes totate {
  12. 0% {
  13. transform: rotateZ(0);
  14. }
  15. 50% {
  16. transform: rotateZ(180deg);
  17. }
  18. 100% {
  19. transform: rotateZ(360deg);
  20. }
  21. }
  22. .main {
  23. justify-content: space-between;
  24. display: flex;
  25. overflow: hidden;
  26. }
  27. #musicImg {
  28. margin: 20px 650px;
  29. animation: totate 30s linear infinite;
  30. border-radius: 50%;
  31. background-image: url("../img/bandaotiehe.jpg");
  32. margin-bottom: 100px;
  33. animation-play-state: paused;
  34. }
  35. /*#musicImg:hover {
  36. animation-play-state: paused;
  37. }*/
  38. .item{
  39. }
  40. .firstMusic{
  41. color: red;
  42. }
  43. #listALL{
  44. position: absolute;
  45. width: 350px;
  46. display:none;
  47. background-color: #363636;
  48. top: 200px;
  49. opacity: 0.6;
  50. }
  51. .li{
  52. color: whitesmoke;
  53. height: 35px;
  54. font-size: 25px;
  55. }
  56. div {
  57. cursor: pointer;
  58. /* float: left; */
  59. margin: 10px auto;
  60. text-align: center;
  61. }
  62. #musicName{
  63. font-size: 40px;
  64. margin-bottom: 80px;
  65. }
  66. #collect{
  67. background: url("../img/icon_collect.png");
  68. width: 40px;
  69. height: 40px;
  70. background-size: 100% 100%;
  71. }
  72. #selection{
  73. background: url("../img/xunhuanbofang.png");
  74. width: 40px;
  75. height: 40px;
  76. background-size: 100% 100%;
  77. }
  78. #list{
  79. background: url("../img/24gl-playlistMusic.png");
  80. width: 40px;
  81. height: 40px;
  82. background-size: 100% 100%;
  83. }
  84. #play{
  85. background: url(../img/bofang.png);
  86. width: 40px;
  87. height: 40px;
  88. background-size: 100% 100%;
  89. }
  90. #prev{
  91. background: url("../img/shangyishoushangyige.png");
  92. width: 40px;
  93. height: 40px;
  94. background-size: 100% 100%;
  95. }
  96. #next{
  97. background: url("../img/xiayigexiayishou.png");
  98. width: 40px;
  99. height: 40px;
  100. background-size: 100% 100%;
  101. }
  102. #slince{
  103. background: url("../img/24gl-volumeMiddle.png");
  104. width: 40px;
  105. height: 40px;
  106. background-size: 100% 100%;
  107. }
  108. #rise{
  109. background: url("../img/24gl-volumeHigh.png");
  110. width: 40px;
  111. height: 40px;
  112. background-size: 100% 100%;
  113. }
  114. #minus{
  115. background: url("../img/24gl-volumeLow.png");
  116. width: 40px;
  117. height: 40px;
  118. background-size: 100% 100%;
  119. }
  120. #cTime {
  121. /*float: left;*/
  122. -webkit-touch-callout: none;
  123. -webkit-user-select: none;
  124. -khtml-user-select: none;
  125. -moz-user-select: none;
  126. -ms-user-select: none;
  127. user-select: none;
  128. font-size: 18px;
  129. width: 20px;
  130. }
  131. #tTime {
  132. /*float: right;*/
  133. -webkit-touch-callout: none;
  134. -webkit-user-select: none;
  135. -khtml-user-select: none;
  136. -moz-user-select: none;
  137. -ms-user-select: none;
  138. user-select: none;
  139. font-size: 18px;
  140. width:300px;
  141. }
  142. #progress {
  143. margin-left: 10px;
  144. margin-right: 10px;
  145. /*background-color: cyan;*/
  146. }
  147. #meter {
  148. width: 720px;
  149. height: 18px;
  150. /*background: azure;
  151. margin-bottom: ;*/
  152. }

JS的DOM创建

  1. var audioDOM = document.getElementById("audio");
  2. var collectDOM = document.getElementById("collect");
  3. var selectionDOM = document.getElementById("selection");
  4. var prevDOM = document.getElementById("prev");
  5. var playDOM = document.getElementById("play");
  6. var nextDOM = document.getElementById("next");
  7. var slinceDOM = document.getElementById("slince");
  8. var listDOM = document.getElementById("list");
  9. var listALLDOM = document.getElementById("listALL");
  10. var musicNameDOM = document.getElementById("musicName")
  11. var musicImgDOM = document.getElementById("musicImg")
  12. var tTimeDOM = document.getElementById("tTime")
  13. var cTimeDOM = document.getElementById("cTime")
  14. var meterDOM = document.getElementById("meter")
  15. var bodyDOM = document.getElementById("body")
  16. var riseDOM = document.getElementById("rise")
  17. var minusDOM = document.getElementById("minus")

音乐列表

  1. var songs = [
  2. {
  3. name: "周杰伦 - 半岛铁盒",
  4. photo: "../img/bandaotiehe.jpg"
  5. },
  6. {
  7. name: "周杰伦 - 外婆",
  8. photo: "../img/waipo.jpg"
  9. },
  10. {
  11. name: "周杰伦 - 完美主义",
  12. photo: "../img/wanmeizhuyi.jpg"
  13. },
  14. {
  15. name: "周杰伦 - 威廉古堡",
  16. photo: "../img/weiliangubao.jpg"
  17. },
  18. {
  19. name: "周杰伦 - 蜗牛",
  20. photo: "../img/woniu.jpg"
  21. },
  22. {
  23. name: "wake",
  24. photo: "../img/wake.jpg"
  25. },
  26. {
  27. name: "ceshi",
  28. photo: "../img/ceshi.png"
  29. }
  30. ]
  31. musicNameDOM.innerText = songs[0].name
  32. musicImgDOM.src = songs[0].photo

切换歌曲(上一首下一首)

首先创建两个变量记录当前歌曲的索引和歌曲的数量,给nextDOM创建事件监听,当点击触发 next(),因为我写了一个随机播放的功能,所以要考虑如果当前是随机播放的模式,,点击下一首也要随机播放,所以要给userChangeSong传一个随机数,用Math方法。

2023.3.25更新 添加每一次手动切换歌曲时重置进度条已加载的长度。

2023.3.28更新 将next方法里的给changeSong传值改为1.1 因为这样的话在点击列表播放里的索引位置为1的歌曲就不会冲突。

Math.floor(Math.random() * songs.length)
  1. var currentSongIndex = 0;
  2. var songsListLength = songs.length;
  3. audioDOM.src = './mp3/' + songs[currentSongIndex].name + '.mp3'
  4. nextDOM.addEventListener('click', next)
  5. function next() {
  6. meterDOM.setAttribute('value',0)
  7. if (selectionDOM.title == "随机播放") {
  8. changeSong(Math.floor(Math.random() * songs.length))
  9. } else {
  10. changeSong(1.1)
  11. }
  12. }
  13. prevDOM.addEventListener('click', prev)
  14. function prev() {
  15. meterDOM.setAttribute('value',0)
  16. if (selectionDOM.title == "随机播放") {
  17. changeSong(Math.floor(Math.random() * songs.length))
  18. } else {
  19. changeSong(-1.1)
  20. }
  21. }

方法userChangeSong的代码 2023.3.28废除 因为跟changeSong方法重复

  1. function userChangeSong(userNum) {
  2. currentSongIndex = userNum;
  3. audioDOM.src = './mp3/' + songs[currentSongIndex].name + '.mp3';
  4. audioDOM.play()
  5. for (let j = 0; j < selectDOM.children.length; j++) {
  6. selectDOM.children[j].classList.remove('firstMusic');
  7. }
  8. selectDOM.children[currentSongIndex].classList.add('firstMusic');
  9. playDOM.style.backgroundImage = 'url("./img/zanting.png")';
  10. musicNameDOM.innerText = songs[currentSongIndex].name;
  11. musicImgDOM.src = songs[currentSongIndex].photo;
  12. bodyDOM.background = ".img/" + songs[currentSongIndex].photo;
  13. musicImgDOM.style.animationPlayState = "running"
  14. }

changeSong的方法 

2023.3.28 更新现在全局使用changSong方法 上面的userChangeSong废弃。

将从next和prev得到1.1和-1.1转换为整数类型,以防出错。

  1. function changeSong(num) {
  2. if (num == 1.1 || num == -1.1){
  3. num = parseInt(num);
  4. currentSongIndex = (currentSongIndex + num + songsListLength) % songsListLength;
  5. }else {
  6. currentSongIndex = num;
  7. }
  8. audioDOM.src = './mp3/' + songs[currentSongIndex].name + '.mp3';
  9. for (let j = 0; j < selectDOM.children.length; j++) {
  10. selectDOM.children[j].classList.remove('nowMusic');
  11. }
  12. selectDOM.children[currentSongIndex].classList.add('nowMusic');
  13. audioDOM.play()
  14. playDOM.style.backgroundImage = 'url("./img/zanting.png")';
  15. musicNameDOM.innerText = songs[currentSongIndex].name;
  16. musicImgDOM.src = songs[currentSongIndex].photo;
  17. bodyDOM.background = ".img/" + songs[currentSongIndex].photo;
  18. musicImgDOM.style.animationPlayState = "running"
  19. }

切换播放方式(单曲循环随机播放),具体实现下文我会通过进度条的判断来实现音乐循环随机播放。

  1. selectionDOM.addEventListener('click', playModeSelection)
  2. function playModeSelection() {
  3. if (selectionDOM.title == "循环播放") {
  4. selectionDOM.style.backgroundImage = 'url("../img/danquxunhuan.png")'
  5. selectionDOM.title = "单曲播放"
  6. audioDOM.loop = true;
  7. } else if (selectionDOM.title == "单曲播放") {
  8. selectionDOM.style.backgroundImage = 'url("../img/suijibofang.png")'
  9. selectionDOM.title = "随机播放";
  10. audioDOM.loop = false;
  11. } else if (selectionDOM.title == "随机播放") {
  12. selectionDOM.style.backgroundImage = 'url("../img/xunhuanbofang.png")'
  13. selectionDOM.title = "循环播放";
  14. audioDOM.loop = false;
  15. }
  16. }

进度条的实现,点击进度条会跳转到指定的时间。给进度条一个计时器放到function play()里(在下文播放暂停的代码区),每隔一秒判断一次当前歌曲是否播放结束。

  1. meterDOM.onclick = setProgress;
  2. function setProgress(e) {
  3. var offsetLeft = (e.clientX - meterDOM.offsetLeft) / meterDOM.offsetWidth;
  4. audioDOM.currentTime = offsetLeft * audioDOM.duration;
  5. meterDOM.setAttribute('value', offsetLeft * 100)
  6. }
  7. function showProgress() {
  8. if (audioDOM.ended && selectionDOM.title == "随机播放") {
  9. console.log(Math.floor(Math.random() * songs.length))
  10. changeSong(Math.floor(Math.random() * songs.length))
  11. } else if (audioDOM.ended && selectionDOM.title == "循环播放") {
  12. changeSong(1)
  13. }
  14. meterDOM.setAttribute('value', audioDOM.currentTime / audioDOM.duration * 100);
  15. }

音乐的时间。

  1. /*歌曲时间
  2. loadedmetadata:
  3. 当指定的音频/视频的元数据已加载时,会发生 loadedmetadata 事件。
  4. 音频/视频的元数据包括:时长、尺寸(仅视频)以及文本轨道。
  5. timeupdate :
  6. 事件在音频/视频(audio/video)的播放位置发生改变时触发。
  7. duration:
  8. 属性以秒或毫秒为单位指定过渡动画所需的时间。默认值为 0s
  9. */
  10. audioDOM.addEventListener("loadedmetadata", function (event) {
  11. if (audioDOM.duration % 60 < 10) {
  12. tTimeDOM.innerHTML = parseInt(audioDOM.duration / 60) + ":0" + parseInt(audioDOM.duration % 60)
  13. } else {
  14. tTimeDOM.innerHTML = parseInt(audioDOM.duration / 60) + ":" + parseInt(audioDOM.duration % 60)
  15. }
  16. });
  17. audioDOM.addEventListener("timeupdate", function (event) {
  18. if (audioDOM.currentTime < 10) {
  19. cTimeDOM.innerHTML = "0:0" + Math.floor(audioDOM.currentTime);
  20. } else if (audioDOM.currentTime < 60) {
  21. cTimeDOM.innerHTML = "0:" + Math.floor(audioDOM.currentTime);
  22. } else {
  23. var minet = parseInt(audioDOM.currentTime / 60);
  24. var sec = audioDOM.currentTime - minet * 60;
  25. if (sec < 10) {
  26. cTimeDOM.innerHTML = "0" + minet + ":" + "0" + parseInt(sec);
  27. } else {
  28. cTimeDOM.innerHTML = "0" + minet + ":" + parseInt(sec);
  29. }
  30. }
  31. });

音乐暂停和播放,里面添加了一个计时器用来实现进度实时变化。

  1. /* 暂停 开始*/
  2. var timer = null;
  3. playDOM.addEventListener('click', play)
  4. function play() {
  5. if (audioDOM.paused) {
  6. audioDOM.play()
  7. timer = setInterval(showProgress, 1000);
  8. playDOM.style.backgroundImage = 'url("./img/zanting.png")'
  9. playDOM.setAttribute("title", "暂停")
  10. musicImgDOM.style.animationPlayState = "running"
  11. } else {
  12. audioDOM.pause()
  13. playDOM.title = "播放"
  14. playDOM.style.backgroundImage = 'url("./img/bofang.png")'
  15. musicImgDOM.style.animationPlayState = "paused"
  16. clearInterval(timer)
  17. }
  18. }

音乐音量的控制

  1. /* 控制音量大小 */
  2. slinceDOM.addEventListener("click", slince)
  3. function slince() {
  4. if (slinceDOM.title == "静音") {
  5. audioDOM.muted = true
  6. slinceDOM.title = "非静音"
  7. slinceDOM.style.backgroundImage = 'url("../img/24gl-volumeDisable.png")'
  8. } else {
  9. audioDOM.muted = false
  10. slinceDOM.title = '静音'
  11. slinceDOM.style.backgroundImage = 'url("../img/24gl-volumeMiddle.png")'
  12. }
  13. }
  14. /*每点击一下,增加10%,如果超过最大就为1,超过最小就为0*/
  15. riseDOM.addEventListener('click', function () {
  16. changeVol(0.1)
  17. })
  18. minusDOM.addEventListener('click', function () {
  19. changeVol(-0.1)
  20. })
  21. function changeVol(n) {
  22. if (audioDOM.volume + n < 0) {
  23. audioDOM.volume = 0;
  24. } else if (audioDOM.volume + n <= 1.0) {
  25. audioDOM.volume = audioDOM.volume + n;
  26. } else {
  27. audioDOM.volume = 1.0
  28. }
  29. }

播放列表的动态实现

2023.3.25更新 添加每一次手动点击列表切换歌曲时重置进度条已加载的长度,添加一些li的样式。

  1. /*播放列表*/
  2. listDOM.addEventListener('click', showList)
  3. function showList() {
  4. if (listDOM.title === "列表") {
  5. listALLDOM.style.display = "block";
  6. listDOM.title = "关闭播放列表";
  7. } else {
  8. listALLDOM.style.display = "none";
  9. listDOM.title = "列表";
  10. }
  11. }
  12. /*
  13. querySelector() 方法返回文档中与指定选择器或选择器组匹配的第一个 Element对象。如果找不到匹配项,则返回null。
  14. insertBefore() 方法在现有子节点之前插入子节点。
  15. */
  16. var selectDOM = document.querySelector('.item').querySelector('ul');
  17. for (var i = 0; i < songs.length; i++) {
  18. var li = document.createElement('li');
  19. li.innerHTML = songs[i].name;
  20. li.title = songs[i].name;
  21. li.style.height = "50px"
  22. li.style.fontSize = "32px"
  23. selectDOM.insertBefore(li, selectDOM.children[i]);
  24. }
  25. selectDOM.children[0].classList.add('firstMusic');
  26. for (var i = 0; i < selectDOM.children.length; i++) {
  27. selectDOM.children[i].index = i;
  28. selectDOM.children[i].addEventListener('click', function (e) {
  29. for (var j = 0; j < selectDOM.children.length; j++) {
  30. selectDOM.children[j].classList.remove('firstMusic');
  31. }
  32. this.classList.add('firstMusic');
  33. meterDOM.setAttribute('value',0)
  34. changeSong(e.target.index);
  35. })
  36. }

到这里就结束了,后续添加更多内容。

(第一次写博客,写的不好请谅解)。

完整JS代码

  1. var audioDOM = document.getElementById("audio");
  2. var collectDOM = document.getElementById("collect");
  3. var selectionDOM = document.getElementById("selection");
  4. var prevDOM = document.getElementById("prev");
  5. var playDOM = document.getElementById("play");
  6. var nextDOM = document.getElementById("next");
  7. var slinceDOM = document.getElementById("slince");
  8. var listDOM = document.getElementById("list");
  9. var listALLDOM = document.getElementById("listALL");
  10. var musicNameDOM = document.getElementById("musicName")
  11. var musicImgDOM = document.getElementById("musicImg")
  12. var tTimeDOM = document.getElementById("tTime")
  13. var cTimeDOM = document.getElementById("cTime")
  14. var meterDOM = document.getElementById("meter")
  15. var bodyDOM = document.getElementById("body")
  16. var riseDOM = document.getElementById("rise")
  17. var minusDOM = document.getElementById("minus")
  18. /*音乐*/
  19. var songs = [
  20. {
  21. name: "周杰伦 - 半岛铁盒",
  22. photo: "../img/bandaotiehe.jpg"
  23. },
  24. {
  25. name: "周杰伦 - 外婆",
  26. photo: "../img/waipo.jpg"
  27. },
  28. {
  29. name: "周杰伦 - 完美主义",
  30. photo: "../img/wanmeizhuyi.jpg"
  31. },
  32. {
  33. name: "周杰伦 - 威廉古堡",
  34. photo: "../img/weiliangubao.jpg"
  35. },
  36. {
  37. name: "周杰伦 - 蜗牛",
  38. photo: "../img/woniu.jpg"
  39. },
  40. {
  41. name: "wake",
  42. photo: "../img/wake.jpg"
  43. },
  44. {
  45. name: "ceshi",
  46. photo: "../img/ceshi.png"
  47. }
  48. ]
  49. musicNameDOM.innerText = songs[0].name
  50. musicImgDOM.src = songs[0].photo
  51. /*收藏*/
  52. collectDOM.addEventListener('click', changeCollect)
  53. function changeCollect() {
  54. if (collectDOM.title == "收藏") {
  55. collectDOM.style.backgroundImage = 'url("../img/shoucang.png")';
  56. collectDOM.setAttribute("title", "取消收藏");
  57. } else {
  58. collectDOM.style.backgroundImage = 'url("../img/icon_collect.png")';
  59. collectDOM.title = "收藏"
  60. }
  61. }
  62. /*播放方式*/
  63. selectionDOM.addEventListener('click', playModeSelection)
  64. function playModeSelection() {
  65. if (selectionDOM.title == "循环播放") {
  66. selectionDOM.style.backgroundImage = 'url("../img/danquxunhuan.png")'
  67. selectionDOM.title = "单曲播放"
  68. audioDOM.loop = true;
  69. } else if (selectionDOM.title == "单曲播放") {
  70. selectionDOM.style.backgroundImage = 'url("../img/suijibofang.png")'
  71. selectionDOM.title = "随机播放";
  72. audioDOM.loop = false;
  73. } else if (selectionDOM.title == "随机播放") {
  74. selectionDOM.style.backgroundImage = 'url("../img/xunhuanbofang.png")'
  75. selectionDOM.title = "循环播放";
  76. audioDOM.loop = false;
  77. }
  78. }
  79. /*播放 上一首播放 下一首播放*/
  80. var currentSongIndex = 0;
  81. var songsListLength = songs.length;
  82. audioDOM.src = './mp3/' + songs[currentSongIndex].name + '.mp3'
  83. nextDOM.addEventListener('click', next)
  84. function next() {
  85. meterDOM.setAttribute('value',0)
  86. if (selectionDOM.title == "随机播放") {
  87. changeSong(Math.floor(Math.random() * songs.length))
  88. } else {
  89. changeSong(1.1)
  90. }
  91. }
  92. prevDOM.addEventListener('click', prev)
  93. function prev() {
  94. meterDOM.setAttribute('value',0)
  95. if (selectionDOM.title == "随机播放") {
  96. changeSong(Math.floor(Math.random() * songs.length))
  97. } else {
  98. changeSong(-1.1)
  99. }
  100. }
  101. /* 暂停 开始*/
  102. var timer = null;
  103. playDOM.addEventListener('click', play)
  104. function play() {
  105. if (audioDOM.paused) {
  106. audioDOM.play()
  107. timer = setInterval(showProgress, 1000);
  108. playDOM.style.backgroundImage = 'url("./img/zanting.png")'
  109. playDOM.setAttribute("title", "暂停")
  110. musicImgDOM.style.animationPlayState = "running"
  111. } else {
  112. audioDOM.pause()
  113. playDOM.title = "播放"
  114. playDOM.style.backgroundImage = 'url("./img/bofang.png")'
  115. musicImgDOM.style.animationPlayState = "paused"
  116. clearInterval(timers)
  117. }
  118. }
  119. meterDOM.onclick = setProgress;
  120. function setProgress(e) {
  121. var offsetLeft = (e.clientX - meterDOM.offsetLeft) / meterDOM.offsetWidth;
  122. audioDOM.currentTime = offsetLeft * audioDOM.duration;
  123. meterDOM.setAttribute('value', offsetLeft * 100)
  124. }
  125. /*function changeModeMusic() {
  126. if (audioDOM.ended && selectionDOM.title == "随机播放") {
  127. console.log(Math.floor(Math.random() * songs.length))
  128. changeSong(Math.floor(Math.random() * songs.length))
  129. } else if (audioDOM.ended && selectionDOM.title == "循环播放") {
  130. changeSong(1)
  131. }
  132. }*/
  133. function showProgress() {
  134. if (audioDOM.ended && selectionDOM.title == "随机播放") {
  135. console.log(Math.floor(Math.random() * songs.length))
  136. changeSong(Math.floor(Math.random() * songs.length))
  137. } else if (audioDOM.ended && selectionDOM.title == "循环播放") {
  138. changeSong(1)
  139. }
  140. meterDOM.setAttribute('value', audioDOM.currentTime / audioDOM.duration * 100);
  141. }
  142. /*歌曲时间
  143. loadedmetadata:
  144. 当指定的音频/视频的元数据已加载时,会发生 loadedmetadata 事件。
  145. 音频/视频的元数据包括:时长、尺寸(仅视频)以及文本轨道。
  146. timeupdate :
  147. 事件在音频/视频(audio/video)的播放位置发生改变时触发。
  148. duration:
  149. 属性以秒或毫秒为单位指定过渡动画所需的时间。默认值为 0s
  150. */
  151. audioDOM.addEventListener("loadedmetadata", function (event) {
  152. if (audioDOM.duration % 60 < 10) {
  153. tTimeDOM.innerHTML = parseInt(audioDOM.duration / 60) + ":0" + parseInt(audioDOM.duration % 60)
  154. } else {
  155. tTimeDOM.innerHTML = parseInt(audioDOM.duration / 60) + ":" + parseInt(audioDOM.duration % 60)
  156. }
  157. });
  158. audioDOM.addEventListener("timeupdate", function (event) {
  159. if (audioDOM.currentTime < 10) {
  160. cTimeDOM.innerHTML = "0:0" + Math.floor(audioDOM.currentTime);
  161. } else if (audioDOM.currentTime < 60) {
  162. cTimeDOM.innerHTML = "0:" + Math.floor(audioDOM.currentTime);
  163. } else {
  164. var minet = parseInt(audioDOM.currentTime / 60);
  165. var sec = audioDOM.currentTime - minet * 60;
  166. if (sec < 10) {
  167. cTimeDOM.innerHTML = "0" + minet + ":" + "0" + parseInt(sec);
  168. } else {
  169. cTimeDOM.innerHTML = "0" + minet + ":" + parseInt(sec);
  170. }
  171. }
  172. });
  173. /*进度条*/
  174. /* 控制音量大小 */
  175. slinceDOM.addEventListener("click", slince)
  176. function slince() {
  177. if (slinceDOM.title == "静音") {
  178. audioDOM.muted = true
  179. slinceDOM.title = "非静音"
  180. slinceDOM.style.backgroundImage = 'url("../img/24gl-volumeDisable.png")'
  181. } else {
  182. audioDOM.muted = false
  183. slinceDOM.title = '静音'
  184. slinceDOM.style.backgroundImage = 'url("../img/24gl-volumeMiddle.png")'
  185. }
  186. }
  187. riseDOM.addEventListener('click', function () {
  188. changeVol(0.1)
  189. })
  190. minusDOM.addEventListener('click', function () {
  191. changeVol(-0.1)
  192. })
  193. function changeVol(n) {
  194. if (audioDOM.volume + n < 0) {
  195. audioDOM.volume = 0;
  196. } else if (audioDOM.volume + n <= 1.0) {
  197. audioDOM.volume = audioDOM.volume + n;
  198. } else {
  199. audioDOM.volume = 1.0
  200. }
  201. }
  202. /*播放列表*/
  203. listDOM.addEventListener('click', showList)
  204. function showList() {
  205. if (listDOM.title === "列表") {
  206. listALLDOM.style.display = "block";
  207. listDOM.title = "关闭播放列表";
  208. } else {
  209. listALLDOM.style.display = "none";
  210. listDOM.title = "列表";
  211. }
  212. }
  213. /*
  214. querySelector() 方法返回文档中与指定选择器或选择器组匹配的第一个 Element对象。如果找不到匹配项,则返回null。
  215. insertBefore() 方法在现有子节点之前插入子节点。
  216. */
  217. var selectDOM = document.querySelector('.item').querySelector('ul');
  218. var li1 = document.createElement('li');
  219. for (var i = 0; i < songs.length; i++) {
  220. var li = document.createElement('li');
  221. li.innerHTML = songs[i].name;
  222. li.title = songs[i].name;
  223. li.style.height = "50px"
  224. li.style.fontSize = "32px"
  225. selectDOM.insertBefore(li, selectDOM.children[i]);
  226. }
  227. selectDOM.children[0].classList.add('nowMusic');
  228. for (var i = 0; i < selectDOM.children.length; i++) {
  229. selectDOM.children[i].index = i;
  230. selectDOM.children[i].addEventListener('click', function (e) {
  231. /*可写可不写???*/
  232. /* for (var j = 0; j < selectDOM.children.length; j++) {
  233. selectDOM.children[j].classList.remove('nowMusic');
  234. }*/
  235. this.classList.add('nowMusic');
  236. meterDOM.setAttribute('value',0)
  237. console.log(e.target.index)
  238. changeSong(e.target.index);
  239. playDOM.title = "暂停";
  240. })
  241. }
  242. /*切换歌曲*/
  243. function changeSong(num) {
  244. if (num == 1.1 || num == -1.1){
  245. num = parseInt(num);
  246. currentSongIndex = (currentSongIndex + num + songsListLength) % songsListLength;
  247. }else {
  248. currentSongIndex = num;
  249. }
  250. audioDOM.src = './mp3/' + songs[currentSongIndex].name + '.mp3';
  251. for (let j = 0; j < selectDOM.children.length; j++) {
  252. selectDOM.children[j].classList.remove('nowMusic');
  253. }
  254. selectDOM.children[currentSongIndex].classList.add('nowMusic');
  255. audioDOM.play()
  256. playDOM.style.backgroundImage = 'url("./img/zanting.png")';
  257. musicNameDOM.innerText = songs[currentSongIndex].name;
  258. musicImgDOM.src = songs[currentSongIndex].photo;
  259. bodyDOM.background = ".img/" + songs[currentSongIndex].photo;
  260. musicImgDOM.style.animationPlayState = "running"
  261. }
  262. /*
  263. function changeSong(userNum) {
  264. if (userNum == 1.0 || userNum == -1.0){
  265. currentSongIndex = (currentSongIndex + num + songsListLength) % songsListLength;
  266. }else {
  267. currentSongIndex = userNum;
  268. }
  269. audioDOM.src = './mp3/' + songs[currentSongIndex].name + '.mp3';
  270. audioDOM.play()
  271. for (let j = 0; j < selectDOM.children.length; j++) {
  272. selectDOM.children[j].classList.remove('nowMusic');
  273. }
  274. selectDOM.children[currentSongIndex].classList.add('nowMusic');
  275. playDOM.style.backgroundImage = 'url("./img/zanting.png")';
  276. musicNameDOM.innerText = songs[currentSongIndex].name;
  277. musicImgDOM.src = songs[currentSongIndex].photo;
  278. bodyDOM.background = ".img/" + songs[currentSongIndex].photo;
  279. musicImgDOM.style.animationPlayState = "running"
  280. }*/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/247553
推荐阅读
相关标签
  

闽ICP备14008679号