美文网首页
实现简易音乐播放器-PartTwo

实现简易音乐播放器-PartTwo

作者: Gettingjie | 来源:发表于2018-06-12 00:25 被阅读0次

实现进度条

  使用一个 <div> 设置样式来作为进度条的导轨;在其内部使用两个 <div> 分别设置样式来作为当前播放时间所占的进度条和其头部的拖拽点。
  通过音乐媒体文件的 currentTimeduration 来计算出当前时间占音乐总时间的百分比(currentTime / duration);结合导轨的宽度(Element.clientWidth)即可算出当前播放时间所占进度条的宽度(X轴)和其头部拖拽点的位置(X轴)。将上述操作设置在定时器中来定时执行以实现播放时进度条的增长。
  当有点击时间使播放进度发生改变时,通过点击事件中鼠标的与浏览器左边界的距离 e.clientX 和 进度条导轨与浏览器左边界的距离 Element.getBoundingClientRect().left 来计算出点击位置在进度条上的距离;根据此来设置当前播放时间、所占进度条的宽度(X轴)和其头部拖拽点的位置(X轴)。
  通过 mousedownmousemovemouseup 事件来响应鼠标按键点击,鼠标移动(拖拽),鼠标按键抬起的动作;在 mousemove 事件中通过移动事件中鼠标的与浏览器左边界的距离 e.clientX 和 进度条导轨与浏览器左边界的距离 Element.getBoundingClientRect().left 来计算出当前移动到的位置;根据位置比例计算出对应的播放时间,在 mouseup 事件中将该时间设置为音乐媒体文件的 currentTime 来实现播放进度的跳转。
  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>MusicControl</title>
    <style>
        html {
            box-sizing: border-box;
        }

        *,
        *::before,
        *::after {
            box-sizing: inherit;
        }


        .control-button {
            margin-top: 10px;
            margin-left: 20px;
        }

        .control-button::after {
            content: '';
            display: block;
            clear: both;
        }

        .play-control-button {
            width: 64px;
            height: 64px;
            background-image: url(icons.png);
            float: left;
            margin-right: 10px;
            cursor: pointer;
        }

        .prev {
            background-position: 0 0;
        }

        .next {
            background-position: 0 -64px;
        }

        .play {
            background-position: 0 -192px;
        }

        .pause {
            background-position: 0 -128px;
        }
        

        .control-bar {
            margin-top: 20px;
            margin-left: 20px;
        }

        .control-bar::after {
            content: '';
            display: block;
            clear: both;
        }

        .controlTime {
            float: left;
            color: #ccc;
        }

        .play-control-progress {
            position: relative;
            margin-left: 8px;
            margin-right: 8px;
            margin-top: 8px;
            float: left;
            display: block;
            width: 300px;
            height: 5px;
            background-color: #ccc;
        }

        .playing-progress {
            position: absolute;
            display: block;
            height: 100%;
            width: 0%;
            background-color: #2f9842;
        }

        .playing-bar {
            position: absolute;
            margin-top: -1.5px;
            margin-left: -4px;
            width: 8px;
            height: 8px;
            background-color: #2f9842;
            border: 0.5px solid #000;
            border-radius: 50%
        }

    </style>
</head>
<body>
    <audio id="music" src="demo.mp3"></audio>
    <div class="control-button">
        <div class="play-control-button prev" id="controlOne"></div>
        <div class="play-control-button play" id="controlTwo"></div>
        <div class="play-control-button next" id="controlThree"></div>
    </div>
    <div class="control-bar">
        <span class="controlTime" id="nowTime">00:00</span>
        <div class="play-control-progress" id="controlProgress">
            <div class="playing-progress" id="playingProgress"></div>
            <div class="playing-bar" id="playingBar"></div>
        </div>
        <span class="controlTime" id="endTime">00:00</span>
    </div>
    
    <script>
        window.onload = function() {
            let music = document.getElementById('music');
            
            let controlOne = document.getElementById('controlOne');
            let controlTwo = document.getElementById('controlTwo');
            let controlThree = document.getElementById('controlThree');
            
            let controlProgress = document.getElementById('controlProgress');
            let playingProgress = document.getElementById('playingProgress');
            let playingBar = document.getElementById('playingBar');
            
            let nowTime = document.getElementById('nowTime');
            let endTime = document.getElementById('endTime');

            let drag = 0;
            let flag = 0;

            nowTime.innerText = "00:00";

            function getMin(min) {
                let res = parseInt(min / 60);
                if(res < 10) {
                    return '0' + res;
                } else {
                    return res + '';
                }
            }

            function getSec(min) {
                let res = parseInt(min % 60);
                if(res < 10) {
                    return '0' + res;
                } else {
                    return res + '';
                }
            }

            endTime.innerText = getMin(music.duration) + ":" + getSec(music.duration);

            let timer = '';
            let stop = '';

            controlTwo.addEventListener('click', () => {
                console.log("Click");
                if(controlTwo.className == "play-control-button play") {
                    controlTwo.className = "play-control-button pause"
                    music.play();
                    timer = setInterval(() => {
                        let progressLen = music.currentTime / music.duration * controlProgress.clientWidth;
                        nowTime.innerText = getMin(music.currentTime) + ":" + getSec(music.currentTime);
                        playingProgress.style.width = progressLen + 'px';
                        playingBar.style.marginLeft = progressLen - 4 + 'px';
                    },1000);
                } else if (controlTwo.className == "play-control-button pause") {
                    controlTwo.className = "play-control-button play";
                    music.pause();
                    clearInterval(timer);
                }
            })

            controlProgress.addEventListener('click', (e) => {
                let rate = ((e.clientX - controlProgress.getBoundingClientRect().left) / controlProgress.clientWidth);
                let progressLen = e.clientX - controlProgress.getBoundingClientRect().left;
                playingProgress.style.width = progressLen + 'px';
                playingBar.style.marginLeft = progressLen - 4 + 'px';
                let theTime = parseInt(rate * (music.duration))
                music.currentTime = theTime;
                nowTime.innerText = getMin(theTime) + ":" + getSec(theTime);
            })
            
            let dragTime = 0;

            playingBar.addEventListener('mousedown', () => {
                console.log('mousedown');
                drag = 1;
                flag = 1;
                clearInterval(timer);
            });

            document.addEventListener('mouseup', () => {
                console.log('mouseup');
                drag = 0;
                if(flag == 1) {
                    music.currentTime = dragTime;
                    timer = setInterval(() => {
                        let progressLen = music.currentTime / music.duration * controlProgress.clientWidth;
                        nowTime.innerText = getMin(music.currentTime) + ":" + getSec(music.currentTime);
                        playingProgress.style.width = progressLen + 'px';
                        playingBar.style.marginLeft = progressLen - 4 + 'px';
                    },1000);
                }
                flag = 0;
            });

            controlProgress.addEventListener('mousemove', (e) => {
                if(drag == 1) {
                    console.log('mousemove');
                    let progressLen = e.clientX - controlProgress.getBoundingClientRect().left;
                    let rate = (progressLen / controlProgress.clientWidth);
                    playingProgress.style.width = progressLen + 'px';
                    playingBar.style.marginLeft = progressLen - 4 + 'px';
                    let theTime = parseInt(rate * (music.duration));
                    nowTime.innerText = getMin(theTime) + ":" + getSec(theTime);
                    dragTime = theTime;
                }
            })

        }
    </script>
</body>
</html>

  对样式进行细微的调整,如对 playingBarmargin-left 设置少4个像素(其宽度的一半)使其中心对应鼠标点击或拖拽时的目标点。

相关文章

  • 实现简易音乐播放器-PartTwo

    实现进度条   使用一个 设置样式来作为进度条的导轨;在其内部使用两个 分别设置样式来作为当前播放时间所占...

  • 实现简易音乐播放器-PartThree

    音乐结束响应   控制单元在音乐媒体文件媒体文件结束播放后并未响应其播放结束事件而在继续的执行之前的行为(作为参数...

  • 实现简易音乐播放器-PartOne

    基础   HTML5 提供了 标签来实现了前端对音乐媒体的原生支持,并且也提供了支持 JavaScript 操...

  • 实现简易音乐播放器-PartFour

    实现上一曲、下一曲   现在,为音乐列表设置切换到上一曲和切换到下一曲的功能;在页面中会用到该功能的部分为上一曲按...

  • 微信小程序音频播放

    使用微信小程序实现一个简易的音乐播放器. 虽然界面很简单,但是一个音频播放器该有的功能大部分都有了(没有歌词显示功...

  • Android音乐播放器开发小记——项目简介

    Android音乐播放器开发小记——项目简介 Android音乐播放器开发小记——功能实现1 Android音乐播...

  • 简易音乐播放器

    一 功能实现: 1,播放服务器端音频文件 2,实现play,pause,next,previous,stop功能 ...

  • iOS15实现音乐播放器

    iOS15实现音乐播放器

  • 音乐播放

    rxswiftPlayer 这是一个音乐播放器,基于swift与rxswift双向绑定架构编写,git地址 简易播...

  • iOS-QQ音乐播放器的简单实现

    一. QQ音乐播放器的简单实现 每个音乐播放器的实现都大致相同,个人认为难点在于歌曲播放与Slider的同步,歌词...

网友评论

      本文标题:实现简易音乐播放器-PartTwo

      本文链接:https://www.haomeiwen.com/subject/ripkeftx.html