zoukankan      html  css  js  c++  java
  • 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音乐下载。

  • 相关阅读:
    .NET Interop 工具集
    关于正弦波的算法
    Windows Phone 系列 本地数据存储
    Xaml cannot create an instance of “X”
    Windows Phone 系列 使用 MVVM绑定时无法获取当前值
    Windows Phone 系列 应用程序图标无法显示
    Windows Phone 系列 WPConnect无法上网的问题
    Windows Phone 系列 使用 Windows Phone 保存铃声任务
    WP7.5提交应用
    Windows Phone 系列 动态删除ObservableCollection
  • 原文地址:https://www.cnblogs.com/Faith-zhang/p/7517468.html
Copyright © 2011-2022 走看看