亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

原生JS實(shí)現(xiàn)音樂播放器的示例代碼

瀏覽:80日期:2024-04-04 17:10:48

本文主要介紹了原生JS實(shí)現(xiàn)音樂播放器的示例代碼,分享給大家,具體如下:

效果圖

原生JS實(shí)現(xiàn)音樂播放器的示例代碼

音樂播放器 播放控制 播放進(jìn)度條控制 歌詞顯示及高亮 播放模式設(shè)置播放器屬性歸類

按照播放器的功能劃分,對播放器的屬性和DOM元素歸類,實(shí)現(xiàn)同一功能的元素和屬性保存在同一對象中,便于管理和操作

const control = { //存放播放器控制 play: document.querySelector(’#myplay’), ... index: 2,//當(dāng)前播放歌曲序號 ...}const audioFile = { //存放歌曲文件及相關(guān)信息 file: document.getElementsByTagName(’audio’)[0], currentTime: 0, duration: 0,}const lyric = { // 歌詞顯示欄配置 ele: null, totalLyricRows: 0, currentRows: 0, rowsHeight: 0,}const modeControl = { //播放模式 mode: [’順序’, ’隨機(jī)’, ’單曲’], index: 0}const songInfo = { // 存放歌曲信息的DOM容器 name: document.querySelector(’.song-name’), ...}播放控制

功能:控制音樂的播放和暫停,上一首,下一首,播放完成及相應(yīng)圖標(biāo)修改audio所用API:audio.play() 和 audio.pause()和audio ended事件

// 音樂的播放和暫停,上一首,下一首控制control.play.addEventListener(’click’,()=>{ control.isPlay = !control.isPlay; playerHandle();} );control.prev.addEventListener(’click’, prevHandle);control.next.addEventListener(’click’, nextHandle);audioFile.file.addEventListener(’ended’, nextHandle);function playerHandle() { const play = control.play; control.isPlay ? audioFile.file.play() : audioFile.file.pause(); if (control.isPlay) { //音樂播放,更改圖標(biāo)及開啟播放動畫 play.classList.remove(’songStop’); play.classList.add(’songStart’); control.albumCover.classList.add(’albumRotate’); control.albumCover.style.animationPlayState = ’running’; } else { //音樂暫停,更改圖標(biāo)及暫停播放動畫 ... }}function prevHandle() { // 根據(jù)播放模式重新加載歌曲 const modeIndex = modeControl.index; const songListLens = songList.length; if (modeIndex == 0) {//順序播放 let index = --control.index; index == -1 ? (index = songListLens - 1) : index; control.index = index % songListLens; } else if (modeIndex == 1) {//隨機(jī)播放 const randomNum = Math.random() * (songListLens - 1); control.index = Math.round(randomNum); } else if (modeIndex == 2) {//單曲 } reload(songList);}function nextHandle() { const modeIndex = modeControl.index; const songListLens = songList.length; if (modeIndex == 0) {//順序播放 control.index = ++control.index % songListLens; } else if (modeIndex == 1) {//隨機(jī)播放 const randomNum = Math.random() * (songListLens - 1); control.index = Math.round(randomNum); } else if (modeIndex == 2) {//單曲 } reload(songList);}播放進(jìn)度條控制

功能:實(shí)時更新播放進(jìn)度,點(diǎn)擊進(jìn)度條調(diào)整歌曲播放進(jìn)度audio所用API:audio timeupdate事件,audio.currentTime

// 播放進(jìn)度實(shí)時更新audioFile.file.addEventListener(’timeupdate’, lyricAndProgressMove);// 通過拖拽調(diào)整進(jìn)度control.progressDot.addEventListener(’click’, adjustProgressByDrag);// 通過點(diǎn)擊調(diào)整進(jìn)度control.progressWrap.addEventListener(’click’, adjustProgressByClick);

播放進(jìn)度實(shí)時更新:通過修改相應(yīng)DOM元素的位置或者寬度進(jìn)行修改

function lyricAndProgressMove() { const audio = audioFile.file; const controlIndex = control.index; // 歌曲信息初始化 const songLyricItem = document.getElementsByClassName(’song-lyric-item’); if (songLyricItem.length == 0) return; let currentTime = audioFile.currentTime = Math.round(audio.currentTime); let duration = audioFile.duration = Math.round(audio.duration); //進(jìn)度條移動 const progressWrapWidth = control.progressWrap.offsetWidth; const currentBarPOS = currentTime / duration * 100; control.progressBar.style.width = `${currentBarPOS.toFixed(2)}%`; const currentDotPOS = Math.round(currentTime / duration * progressWrapWidth); control.progressDot.style.left = `${currentDotPOS}px`; songInfo.currentTimeSpan.innerText = formatTime(currentTime);}

拖拽調(diào)整進(jìn)度:通過拖拽移動進(jìn)度條,并且同步更新歌曲播放進(jìn)度

function adjustProgressByDrag() { const fragBox = control.progressDot; const progressWrap = control.progressWrap drag(fragBox, progressWrap)}function drag(fragBox, wrap) { const wrapWidth = wrap.offsetWidth; const wrapLeft = getOffsetLeft(wrap); function dragMove(e) { let disX = e.pageX - wrapLeft; changeProgressBarPos(disX, wrapWidth) } fragBox.addEventListener(’mousedown’, () => { //拖拽操作 //點(diǎn)擊放大方便操作 fragBox.style.width = `14px`;fragBox.style.height = `14px`;fragBox.style.top = `-7px`; document.addEventListener(’mousemove’, dragMove); document.addEventListener(’mouseup’, () => { document.removeEventListener(’mousemove’, dragMove); fragBox.style.width = `10px`;fragBox.style.height = `10px`;fragBox.style.top = `-4px`; }) });}function changeProgressBarPos(disX, wrapWidth) { //進(jìn)度條狀態(tài)更新 const audio = audioFile.file const duration = audioFile.duration let dotPos let barPos if (disX < 0) { dotPos = -4 barPos = 0 audio.currentTime = 0 } else if (disX > 0 && disX < wrapWidth) { dotPos = disX barPos = 100 * (disX / wrapWidth) audio.currentTime = duration * (disX / wrapWidth) } else { dotPos = wrapWidth - 4 barPos = 100 audio.currentTime = duration } control.progressDot.style.left = `${dotPos}px` control.progressBar.style.width = `${barPos}%`}

點(diǎn)擊進(jìn)度條調(diào)整:通過點(diǎn)擊進(jìn)度條,并且同步更新歌曲播放進(jìn)度

function adjustProgressByClick(e) { const wrap = control.progressWrap; const wrapWidth = wrap.offsetWidth; const wrapLeft = getOffsetLeft(wrap); const disX = e.pageX - wrapLeft; changeProgressBarPos(disX, wrapWidth)}歌詞顯示及高亮

功能:根據(jù)播放進(jìn)度,實(shí)時更新歌詞顯示,并高亮當(dāng)前歌詞(通過添加樣式)audio所用API:audio timeupdate事件,audio.currentTime

// 歌詞顯示實(shí)時更新audioFile.file.addEventListener(’timeupdate’, lyricAndProgressMove);function lyricAndProgressMove() { const audio = audioFile.file; const controlIndex = control.index; const songLyricItem = document.getElementsByClassName(’song-lyric-item’); if (songLyricItem.length == 0) return; let currentTime = audioFile.currentTime = Math.round(audio.currentTime); let duration = audioFile.duration = Math.round(audio.duration); let totalLyricRows = lyric.totalLyricRows = songLyricItem.length; let LyricEle = lyric.ele = songLyricItem[0]; let rowsHeight = lyric.rowsHeight = LyricEle && LyricEle.offsetHeight; //歌詞移動 lrcs[controlIndex].lyric.forEach((item, index) => { if (currentTime === item.time) { lyric.currentRows = index; songLyricItem[index].classList.add(’song-lyric-item-active’); index > 0 && songLyricItem[index - 1].classList.remove(’song-lyric-item-active’); if (index > 5 && index < totalLyricRows - 5) {songInfo.lyricWrap.scrollTo(0, `${rowsHeight * (index - 5)}`) } } })}播放模式設(shè)置

功能:點(diǎn)擊跳轉(zhuǎn)播放模式,并修改相應(yīng)圖標(biāo)audio所用API:無

// 播放模式設(shè)置control.mode.addEventListener(’click’, changePlayMode);function changePlayMode() { modeControl.index = ++modeControl.index % 3; const mode = control.mode; modeControl.index === 0 ? mode.setAttribute('class', 'playerIcon songCycleOrder') : modeControl.index === 1 ? mode.setAttribute('class', 'playerIcon songCycleRandom ') : mode.setAttribute('class', 'playerIcon songCycleOnly')}

項(xiàng)目預(yù)覽

代碼地址:https://github.com/hcm083214/audio-player

到此這篇關(guān)于原生JS實(shí)現(xiàn)音樂播放器的示例代碼的文章就介紹到這了,更多相關(guān)JS 音樂播放器內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 亚洲最大黄色网址 | 久久91精品国产91久久跳舞 | 18hd xxxx国产在线| 成年男女免费大片在线观看 | 日韩在线视屏 | 中日欧洲精品视频在线 | 久热香蕉在线视频 | 美女扒开胸罩露出奶了无遮挡免费 | 亚洲综合精品成人 | 成年人污视频 | 国产二级毛片 | 曰本又色又爽又黄三级视频 | 欧洲成人免费高清视频 | 能看av的网址 | 最近最新中文字幕免费的一页 | 欧美色影院 | 国产看片一区二区三区 | 高清在线精品一区二区 | 久草免费色站 | 亚洲精品视频在线播放 | 久久99精品久久久久久青青91 | 亚洲国产成人久久三区 | 欧美成年黄网站色高清视频 | 国产精品线在线精品 | 97se狠狠狠狠狼亚洲综合网 | 在线免费一区二区 | 亚洲天堂啪啪 | 伊人影院在线观看 | 色花堂国产精品第二页 | 黄色毛片网| 三上悠亚先锋影音xfplay | 国产精品美女网站在线看 | 黄色自拍网站 | 日本人一级毛片视频 | 国产日韩精品一区二区在线观看 | 国产v亚洲v欧美v专区 | www.妞干网 | 欧美日韩国产不卡在线观看 | 成人精品国产 | 国产一级生活片 | 国产免费又色又爽又黄的网站 |