• H5音乐播放器


    前段时间无聊用JavaScript基于H5的audio写一个音乐播放器。误喷,技术有限,文笔不好之处希望各位大神海涵。

    1、HTML代码:

    <div id="music" class="music">
        <div id="lyric_div">
            <div id="lyric_tit"></div>
            <div id="lyric_con">
                <div id="lyric_txt">
                    <p>演唱者:xxx</p>
                    <p>编辑:果果</p>
                    <p>qq:123456789</p>
                </div>
            </div>
        </div>
        <div id="progress">
            <div id="time_update">
                <time>00:00</time>
            </div>
            <div id="progress_bar">
                <div id="progress_cube"></div>
            </div>
            <div id="time_all">
                <time>00:00</time>
            </div>
        </div>
        <div id="bt_div">
            <input type="button" value="上一首" id="up_song">
            <input type="button" value="播放" id="play_stop">
            <input type="button" value="下一首" id="next_song">
            <audio id="audio" src="song/赵照-你就是我最想要的丫头.mp3"></audio>
        </div>
    </div>
    <p id="p"></p>

    2、JavaScprit代码     附上 带时间轴的歌曲的歌词的查找地址   http://www.cnlyric.com ,至于音频去QQ音乐下载就好了!!

    //http://www.cnlyric.com  带时间轴的歌曲的歌词的查找地址
    var lyric = [{'name':'你就是我最想要的丫头','img':'','audio_src':'song/赵照-你就是我最想要的丫头.mp3','content':'[00:00.00] 你就是我最想要的丫头[00:04.00] 演唱:赵照[00:08.00] 歌词编辑:果果[00:12.00] QQ:190567797[00:16.00] zhangxiang[00:22.38] 微风轻轻吹着你散开的发[00:26.55] 忍不住想对你说心里的话[00:30.81] 多少次鼓起勇气话又难开口[00:35.38] 想想你的温柔总是低着头[00:39.72] 多希望天边晚霞一直燃烧[00:44.33] 永远灿烂别落下[00:48.50] 你浅笑的脸微闭的双眼[00:53.18] 我陷入了深深的迷恋[00:59.82] 有没有最纯真的童[01:04.17] 你就是我快乐的源头[01:08.81] 为你伤心 为你忧愁[01:13.26] 你就是我最想要的丫头[01:17.51] 有没有最幸福的生活[01:21.87] 你就是我甜蜜的拥有[01:26.59] 为你祈祷 为你逗留[01:30.95] 你就是我最想要的丫头[01:53.69] 微风轻轻吹着你散开的发[01:57.78] 忍不住想对你说心里的话[02:01.96] 多少次鼓起勇气话又难开口[02:06.59] 想想你的温柔总是低着头[02:10.93] 多希望天边晚霞一直燃烧[02:15.51] 永远灿烂别落下[02:19.80] 你浅笑的脸微闭的双眼[02:24.49] 我陷入了深深的迷恋[02:31.06] 有没有最纯真的童话[02:35.33] 你就是我快乐的源头[02:39.88] 为你伤心 为你忧愁[02:44.58] 你就是我最想要的丫头[02:48.62] 有没有最幸福的生活[02:53.22] 你就是我甜蜜的拥有[02:57.86] 为你祈祷 为你逗留[03:02.34] 你就是我最想要的丫头[03:06.88] 有没有最美丽的图画[03:11.06] 你站在夕阳下面挥着手[03:15.68] 为你伤心 为你忧愁[03:19.90] 你就是我最想要的丫头[03:24.12] 有没有最美好的生活[03:28.65] 我愿这样陪你到永久[03:33.42] 你的善良 你的温柔[03:37.74] 你就是我最想要的丫头[03:42.78] 你就是我最想要的丫头[03:46.84] 你就是我最想要的丫头'}
    ,{'name':"笑忘书",'img':'img/photo1.jpg','audio_src':'song/王菲-笑忘书.mp3','content':'[00:00.00][00:01.00]笑忘书(国)[00:03.00]王菲[00:05.00][00:12.00]没 没有蜡烛 就不用勉强庆祝[00:17.00]没 没想到答案 就不用寻找题目[00:23.00]没 没有退路 问我也不要思路[00:29.00]没 没人去仰慕 那我就继续忙碌[00:34.00]lalala 思前想后[00:37.00]差一点忘记了怎么投诉[00:40.00]lalala 从此以后 不要犯同一个错误[00:46.00]将这样的感触 写一封情书送给我自己[00:51.00]感动得要哭 很久没哭[00:54.00]不失为天大的幸福 将这一份礼物[00:59.00]这一封情书 给自己祝福[01:02.00]可以不在乎 才能对别人在乎[01:20.00]有 一点帮助 就可以对谁倾诉[01:26.00]有 一个人保护 就不用自我保护[01:32.00]有 一点满足 就准备如何结束[01:37.00]有 一点点领悟 就可以往后回顾01:43.00]lalala 思前想后[01:46.00]差一点忘记了怎么投诉[01:49.00]lalala 从此以后 不要犯同一个错误[01:54.00]将这样的感触 写一封情书送给我自己[01:59.00]感动得要哭 很久没哭[02:03.00]不失为天大的幸福 将这一份礼物[02:08.00]这一封情书 给自己祝福[02:11.00]可以不在乎 才能对别人在乎[02:43.00]Lalalala....... Lalalala.......[02:55.00]从开始哭着忌妒 变成了笑着羡慕[03:00.00]时间是怎么样把握了我皮肤[03:03.00]只有我自己最清楚[03:06.00]将这样的感触 写一封情书送给我自己[03:11.00]感动得要哭 很久没哭[03:15.00]不失为天大的幸福 将这一份礼物[03:19.00]这一封情书 给自己祝福[03:22.00]可以不在乎 才能对别人在乎[03:28.00]让我亲手 将这样的感触[03:31.00]写一封情书送给我自己[03:34.00]感动得要哭 很久没哭[03:37.00]不失为天大的幸福[03:39.00]就好好将这一份礼物[03:42.00]这一封情书 给自己祝福[03:45.00]可以不在乎 才能对别人在乎'}];
    function $(id){
        return document.getElementById(id);
    }
    
    function init(){
        //歌曲名
        lyric_tit = $('lyric_tit');
        //歌词外围div
        lyric_con = $('lyric_con');
        //包裹歌词的div
        lyric_txt = $('lyric_txt');
        //放置实时获取播放时间的容器
        time_update = $('time_update').getElementsByTagName('time')[0];
        //放置歌曲总时间/剩余多少时间的容器
        time_all = $('time_all').getElementsByTagName('time')[0];
        //进度条 白色
        progress_bar = $('progress_bar');
        //实时变化的进度条 红色
        progress_cube = $('progress_cube');
        //上一首
        up_song = $('up_song');
        //播放、暂停
        play_stop = $('play_stop');
        //下一首
        next_song = $('next_song');
        //音频
        audio = $('audio');
        //测试的p节点
        p = $('p');
        //初始化   取数组第一个
        audioIndex = 0;
        //音频初始化
        audioInit();
        //歌词初始化
        lyric_str();
        //播放 暂停
        play_stop.addEventListener('click',play_stop_lick,false);
        //上一首
        up_song.addEventListener('click',up_song_lick,false);
        //下一首
        next_song.addEventListener('click',next_song_lick,false)
        //歌曲时间每变化就触发
        audio.addEventListener('timeupdate',audio_timeupdate,false);
        //进度条单击事件   根据点击进度条的位置设置歌曲的播放时间,同时改变歌词。
        progress_bar.addEventListener('click',progress_bar_click,false);
        
    }
    
    /*
    * 点击进度条某一位置触发事件,并根据进度条的位置改变歌曲的播放时间 和 歌词的样式变化
    */
    function progress_bar_click(e){
        var e = e ? e : event;
        //获取坐标
        var pageX = e.pageX;
        //获取白色进度条的left值 
        var progress_bar_Left = progress_bar.offsetLeft;
        //计算进度条的百分比
        var n = (pageX - progress_bar_Left)/progress_bar.offsetWidth;
        //获取歌曲的总时间
        var audio_duration = audio.duration;
        /*
        *根据进度条的百分比改变音频的播放时间  
        *公式 = 鼠标点击的位置到div最左边的位置宽度/div的总宽度*音频的总时间
        */
        audio.currentTime = n*audio_duration;
        
        //获取音频播放的时间
        var audio_currentTime = audio.currentTime
        //获取到音频播放的秒数
        var num = parseInt(audio_currentTime);
        
        //获取到当前的 歌词节点
        var objElem_p = elem_p(num)
        
        //歌词的切换 样式调整
        lyric_txt_p(objElem_p);
    }
    
    /*
    * 点击进度条时寻找指定的歌曲词的节点。
    * 递归去找直到找到为止。
    */
    function elem_p(num){
        var boj_p = $('lyric'+num);
        if(!boj_p){
            return elem_p(num-1);
        }else{
            return boj_p;
        }
        return '';
    }
    
    /**
    *根据音频播放时间实时的改变进度条
    */
    function audio_timeupdate(){
        //获取音频的总时间 以秒为单位
        var audio_duration = audio.duration;
        //获取音频的播放时间 以秒为单位
        var audio_currentTime = audio.currentTime
        //歌曲自动播放完就切换下一首
        if(audio_duration == audio_currentTime){
            next_song_lick();
        }
        
        //计算视频播放的百分比
        var n = audio_currentTime/audio_duration;
        //根据视频播放的百分比改变进度条  公式 = 播放时间/总时间*进度条的宽度
        progress_cube.style.width = n*progress_bar.offsetWidth + 'px';
    
        //获取到音频播放的秒数
        var num = parseInt(audio_currentTime);
        //将播放的事件显示到页面  format()转换为分秒格式
        time_update.innerHTML = format(num);
    
        //剩余多少事件 并且显示到页面
        var sum_num = parseInt(audio_duration)-parseInt(audio_currentTime);
        if(!isNaN(sum_num)){
            time_all.innerHTML = format(sum_num);
        }else{
            time_all.innerHTML = '00:00';
        }
        
        //获取到当前唱到的这一句歌词
        var boj_p = $('lyric'+num);
        //改变样式
        lyric_txt_p(boj_p);
    }
    
    /**
    *歌词的切换 样式调整
    */
    function lyric_txt_p(obj){
        //获取所有的歌词节点
        var lyric_p = lyric_txt.getElementsByTagName('p');
        //循环所有的节点并且为节点index赋值   注意不给index赋值的情况下index为undefined;
        for(var i = 0; i < lyric_p.length;i++){
            lyric_p[i].index = i;
        }
        
        //当前节点不为空的情况下,就改变样式
        if(obj){
            //给当前节点之前已经唱过的歌词赋值样式。 
            for(var j = 0;j < obj.index; j++){
                lyric_p[j].className = 'played';
            }
            //防止进度条往回点  所以index大于当前歌词节点的节点样式全部赋值为空
            for(var j = obj.index;j < lyric_p.length; j++){
                lyric_p[j].className = '';
            }
            
            //给当前歌词赋值样式
            obj.className = 'played2'
            //改变歌词的样式   歌词外围div的宽度/2-当前歌词节点的top值
            lyric_txt.style.top =  lyric_con.offsetWidth/2 - obj.offsetTop +'px';
            
        }
    }
    
    //上一首 
    function up_song_lick(){
        //audioIndex 默认为0  
        audioIndex --;
        //当歌曲已经是第一条的时候  把歌曲切换到最后一条
        if(audioIndex < 0){
            audioIndex = lyric.length-1;
        }
        //初始化音频
        audioInit();
        //播放 暂停
        play_stop_lick();
    }
    
    // 下一首
    function next_song_lick(){
        audioIndex ++;
        //当歌曲已经是最后一条的时候  切换到第一条歌曲
        if(audioIndex > lyric.length-1){
            audioIndex = 0;
        }
        audioInit();
        play_stop_lick();
    }
    
    //播放
    function  play_stop_lick(){
        //audio.paused 暂停时就为true
        if(audio.paused){
            //播放
            audio.play();
            play_stop.value = '暂停';
        }else{
            //暂停
            audio.pause();
            play_stop.value = '播放';
        }
    }
    
    //解析歌词
    function lyric_str(){
        //获取当前歌曲的歌词
        var str =  lyric[audioIndex].content;
        //alert(str);
        var html = '';
        var arr = str.split('[');
        for(var i = 0 ; i < arr.length; i++ ){
            var arr2 = arr[i].split(']');
            //歌词
            var text = arr2[1];
            //歌词对应的时间
            var time = arr2[0].split('.');
            //毫秒
            var ms = time[1];
            //获取分 秒
            var time2 = time[0].split(':');
            //
            var m = time2[0];
            //
            var s = time2[1];
            var num_s = (parseInt(m)*60)+parseInt(s);
            //拼接歌词
            if(text){
                html += '<p id="lyric'+ num_s +'">'+ text +'</p>'
            }
            
        }
        lyric_txt.innerHTML = html;
        
    }
    
    //初始化
    function audioInit(){
        //将进度条的宽度初始化为0 红色的
        progress_cube.style.width = 0 + 'px';
        //获取歌曲的一个总时间
        if(!isNaN(audio.duration)){
            time_all.innerHTML = format(audio.duration);
        }else{
            time_all.innerHTML = '00:00'
        }
        //获取当前歌曲的名称
        lyric_tit.innerHTML = lyric[audioIndex].name;
        //获取当前歌曲的路径
        audio.src = lyric[audioIndex].audio_src;
        //歌词解析
        lyric_str();
    }
    
    function format(num){
        var num = parseInt(num);
        //得到的是分钟
        var m = parseInt(num/60); 
        //得到的是秒
        var s = parseInt(num%60);
        //返回拼接的时间
        return format_s(m)+':'+ format_s(s)
    }
    
    //修改歌曲时间格式
    function format_s(num){
        if(num < 10){
            return '0'+num;
        }
        return num;
    }
    window.addEventListener('load',init,false);

    3、CSS代码:

    #music{
        width:400px;
        height:600px;
        margin:auto;
        text-align:center;
        background-color:#999;
    }
    #lyric_div{
        width:400px;
        height:500px;
    }
    
    #lyric_tit{
        color:#F00;
        font:bold;
        height:30px;
        line-height:30px;
    }
    
    #lyric_con{
        overflow:hidden;
        height:470px;
        position:relative;
    }
    
    #lyric_txt{
        position:absolute;
        width:400px;
        top:0px;
        left:0px;
    }
    
    #bt_div{
        width:400px;
        height:50px;
        line-height:50px;
    }
    #progress{
        width:400px;
        height:50px;
        line-height:50px;
    }
    
    #time_update{
        float:left;
    }
    
    #time_all{
        float:left;
    }
    
    #time_update,#time_all{
        width:54px;
    }
    #progress_bar{
        float:left;
        width:290px;
        height:3px;
        background-color:#FFF;
        margin-top:24px;
        cursor:pointer;
    }
    #progress_cube{
        height:3px;
        background-color:#F00;
    }
    
    #lyric_txt p.played{
        color:#FF0;
    }
    
    #lyric_txt p.played2{
        color:#FF0;
        font-weight:700;
        font-size:20px;
    }

    至此   以上是完整的代码,由于MP3文件没有办法上传,所以请自己到QQ音乐下载。

  • 相关阅读:
    软件开发流程实例之四 :编码和测试
    软件开发流程实例之三 :系统设计
    jQuery入门[4]-链式代码
    jQuery入门[1]-构造函数
    jQuery入门[2]-选择器
    自编类库,添加引用,编译运行时显示“未能找到”
    SelectByShape 工具的实现
    TOC控件不显示内容列表
    鹰眼功能的实现(步骤,无代码)
    INumericFormat 接口
  • 原文地址:https://www.cnblogs.com/Faith-zhang/p/7517468.html
Copyright © 2020-2023  润新知