jQueryはQQ版の音楽プレーヤーを模倣することを開発しました。


本論文はHtml+CSS+jQueryを通じてQQ版の音楽プレーヤーを模倣することを開発しました。先端技術の総合的な応用です。使った素材はネットから来ています。
知識に触れる
この例で使用した知識点は以下の通りで、jQueryとCSSによって区別されます。
jQueryはJavaScriptライブラリで、JavaScriptプログラミングを大幅に簡略化しました。一般的な知識点は以下の通りです。
  • タグからjQueryオブジェクトを取得します。
  • 選択符でjQueryオブジェクトを取得し、テキストの内容を設定する。プログレス.time").text(timeStr);
  • は、選択符により、ラベル名からオブジェクトを取得し、i番目のサブ要素を取得する。リリックul li").eq(index);
  • は、ajaxを通じて非同期でデータを取得し、ページを更新する。
  • .クラス選択子を介して要素を取得し、非表示または表示を行う:$menu").stop().fadeIn(100);
  • .動的設定を依頼することにより、イベントをクリックし、主に動的発生要素に対して:$list").delegate(..list_check","click",function(){}
  • はaddClassを通じてクラスを追加し、removeClassはクラスを削除し、toggaleClassはクラスを切り替えます。hasClassはクラス
  • を含んでいますか?
  • は、対象と同級の兄弟ノードを取得する。
  • トリガ関連イベント:$next").trigger("click")
  • CSSを使うことによって、ホームページの開発の仕事効率を大幅に向上させます。この例の使用知識点は以下の通りである。
  • 左からの距離を設定します。magin-left:20 pxです。右からの距離を設定します。magin-right:20 px;
  • 透明度設定:opacity:0.6;値[0,1]透明から全不透明まで
  • 設定背景画像:background:url(./img/player_)logo.png)no-repeat 0;背景の色と透明度を設定します。バックグランド:rgba(255,255,255,0.5)
  • 設定liのスタイル:list-style:none;
  • 表示スタイルはラインブロックに設定します。display:inline-block。
  • 円角を設定します。border-radius:5 px。
  • 相対位置を設定する:position:relative;
  • 背景画像の開始座標:background-position:0-75 px;
  • 例の効果図と構造区分
    本例の効果図および構造区分を以下に示す。

    Htmlコアコード
    Headerの部分コード:主にロゴとログイン表示を表示するために使用されます。以下の通りです。
    
    <div class="header">
     <h1 class="logo">
     <a href="#" rel="external nofollow" ></a> --by Alan.hsiang
     </h1>
     <ul class="register">
     <li>  </li>
     <li>  </li>
     </ul>
    </div>
    中間部分:主に座辺のリストと右側の曲が関連しています。以下の通りです。
    
     <div class="content">
     <div class="content_in">
      <div class="content_left">
      <div class="content_toolbar">
       <span><i></i>  </span>
       <span><i></i>   </span>
       <span><i></i>  </span>
       <span><i></i>  </span>
       <span><i></i>    </span>
      </div>
      <div class="content_list">
       <ul>
       <li class="list_title">
        <div class="list_check"><i></i></div>
        <div class="list_number"></div>
        <div class="list_name">  </div>
        <div class="list_singer">  </div>
        <div class="list_time">  </div>
       </li>
       </ul>
      </div>
      </div>
      <div class="content_right">
      <div class="song_info">
       <a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="song_info_pic">
       <img src="" alt="" />
       </a>
       <div class="song_info_name">    :<a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class=""></a></div>
       <div class="song_info_singer">   :<a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class=""></a></div>
       <div class="song_info_album">    :<a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class=""></a></div>
      </div>
      <div class="song_lyric"><ul></ul></div>
      </div>
     </div>
     </div>
    
    下のエリアコードは主に関連コンテンツを再生するために使用されます。以下の通りです。
    
     <div class="footer">
     <div class="footer_in">
      <a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="music_pre" title="   "></a>
      <a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="music_play" title="  "></a>
      <a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="music_next" title="   "></a>
      <div class="music_progress_info">
      <div class="music_progress_top">
       <span class="music_progrss_name"></span>
       <span class="music_progrss_time"></span>
      </div>
      <div class="music_progress_bar">
       <div class="music_progress_line">
       <div class="music_progress_dot"></div>
       </div>
      </div>
      </div>
      <a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="music_mode" title="    "></a>
      <a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="music_fav" title="  "></a>
      <a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="music_down" title="  "></a>
      <a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="music_comment" title="  "></a>
      <a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="music_only" title="    "></a>
      <div class="music_voice">
      <a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="music_voice_info" title="  "></a>
      <div class="music_voice_bar">
       <div class="music_voice_line">
       <div class="music_voice_dot"></div>
       </div>
      </div>
      </div>
     </div>
     </div>
    
    jQuery機能性コアコード
    この例では、機能上の区分から、主に再生モジュール、プログレスバーモジュール、歌詞モジュールに分けられており、各モジュールは互いに独立しているため、適切なパッケージ化が行われている。
    再生モジュール【Play】は主に曲の初期化、再生と一時停止、前の曲、次の曲、再生の同期、ジャンプなどの機能を含みます。コアコードは以下の通りです。
    
    (function(window){
     function Player($audio){
     return new Player.prototype.init($audio);
     }
     Player.prototype={
     constructor :Player,
     musicList:[],
     currIndex:-1,
     $audio:null,
     audio:null,
     init:function($audio){
      this.$audio=$audio;//jQuey    
      this.audio=$audio.get(0);//  audio  
     },
     play:function(index,music){
      console.log(index,music);
      console.log(this.$audio);
      if(this.currIndex==index){
      //     ,    ,      
    
      if(this.audio.paused){
       this.audio.play();
      }else{
       this.audio.pause();
      }
      }else{
      //     ,    
      this.$audio.attr('src',music.link_url);
      this.audio.play();
      this.currIndex=index;
      }
     },
     preIndex:function(){
      var index=this.currIndex-1;
      if(index<0){
      index=this.musicList.length-1;
      }
      return index;
     },
     nextIndex:function(){
      var index=this.currIndex+1;
      if(index>this.musicList.length-1){
      index=0;
      }
      return index;
     },
     del:function(index){
      this.musicList.splice(index,1);
      if(index<this.currIndex){
      this.currIndex=this.currIndex-1;
      }
     },
     musicTimeUpdate:function(callBack){
      //            
      var that=this;
      //  audio    
      this.$audio.on("timeupdate",function(){
      var duration=that.audio.duration;
      var currentTime=that.audio.currentTime;
      var timeStr=that.formatTime(currentTime,duration);
      //         
      callBack(duration,currentTime,timeStr);
      });
     },
     //            
     formatTime:function (currentTime,duration){
      //   
      var endMin=parseInt(duration/60);
      var endSec=parseInt(duration%60);
      endMin=endMin<10?"0"+endMin:endMin;
      endSec=endSec<10?"0"+endSec:endSec;
      //    
      var curMin=parseInt(currentTime/60);
      var curSec=parseInt(currentTime%60);
      curMin=curMin<10?"0"+curMin:curMin;
      curSec=curSec<10?"0"+curSec:curSec;
      return curMin+":"+curSec+" / "+endMin+":"+endSec;
     },
     musicSeekTo:function(value){
      var that=this;
      var duration=that.audio.duration;
      if(isNaN(duration))return;
      if(isNaN(value))return;
      that.audio.currentTime=duration*value ;
     },
     musicVoiceSeekTo:function(value){
      if(isNaN(value))return;
      if(value<=0 || value>=1) return;
      this.audio.volume=value;
     }
     };
     Player.prototype.init.prototype=Player.prototype;
     window.Player=Player;
    })(window);
    歌詞モジュール【lyric】は主に歌詞のロード、解析、同期などの機能が含まれています。コアコードは以下の通りです。
    
    (function(window){
     function Lyric(path){
     return new Lyric.prototype.init(path);
     }
     Lyric.prototype={
     constructor :Lyric,
     times:[],
     lyrics:[],
     index:-1,
     init:function(path){
      this.path=path;
     },
     loadLyric:function(callBack){
      var that=this;
      $.ajax({
      type: "get",
      dataType:"text",
      contentType: "application/text; charset=utf-8",
      url: that.path,
      success: function(data) {
       //console.log(data);
       that.parseLyric(data);
       callBack();
      },
      error: function(e) {
       console.log(e);
      }
      });
     },
     parseLyric:function(data){
      var that=this;
      //        
      that.times=[];
      that.lyrics=[];
      that.index=-1;
      //
      var array=data.split("
    "); //console.log(array); var timeReg=/\[(\d*:\d*\.\d*)\]/; $.each(array, function(index,ele) { //console.log(ele); // var lyc=ele.split("]")[1]; if(lyc==null || lyc.length==1){ return true;// } that.lyrics.push(lyc); var res=timeReg.exec(ele); //console.log(res); if(res==null){ return true; // } var timeStr=res[1]; var res2=timeStr.split(":"); var min=parseInt(res2[0]) *60; var sec=parseFloat(res2[1]) ; var res3=parseFloat( Number(min+sec).toFixed(2)); //console.log(res3); that.times.push(res3); }); console.log(that.times.length +" , "+ that.lyrics.length); }, currentLyric:function(currentTime){ //console.log(currentTime); if(currentTime>this.times[0]){ this.index++; this.times.shift();// , } return this.index; } }; Lyric.prototype.init.prototype=Lyric.prototype; window.Lyric=Lyric; })(window);
    プログレスバーモジュール【Progess】は主に、プログレスバーの初期化、クリック、ドラッグ、コールバックなどの機能があります。コアコードは以下の通りです。
    
    (function(window){
     function Progress($progressBar,$progressLine,$progressDot){
     return new Progress.prototype.init($progressBar,$progressLine,$progressDot);
     }
     Progress.prototype={
     constructor :Progress,
     isMove:false,
     init:function($progressBar,$progressLine,$progressDot){
      this.$progressBar=$progressBar;
      this.$progressLine=$progressLine;
      this.$progressDot=$progressDot;
     },
     progressClick:function(callBack){
      //console.log(this.$progressBar);
      var that=this;//   this  Progress
      this.$progressBar.click(function(event){
      //   this  progrssBar     
      var normalLeft = $(this).offset().left;//          
      var eventLeft = event.pageX;//             
      that.$progressLine.css("width",eventLeft-normalLeft);
      that.$progressDot.css("left",eventLeft-normalLeft);
      //        
      var value=(eventLeft-normalLeft)/$(this).width();
      callBack(value);
      });
     },
     progressMove:function(callBack){
      var that=this;//   this  Progress
      var normalLeft =-1;
      var eventLeft=-1;
      var barWidth=this.$progressBar.width();
      this.$progressBar.mousedown(function(){
      that.isMove=true;
      normalLeft = $(this).offset().left;//          
    
      $(document).mousemove(function(){
       //   this  progrssBar     
       eventLeft = event.pageX;//             
       var v=eventLeft-normalLeft;
       if(v>=0 && v<=barWidth){
       //           
       that.$progressLine.css("width",eventLeft-normalLeft);
       that.$progressDot.css("left",eventLeft-normalLeft);
       }
      });
      });
      $(document).mouseup(function(){
      $(document).off("mousemove");
      that.isMove=false;
      //        
      var value=(eventLeft-normalLeft)/that.$progressBar.width();
      //       ,        
      callBack(value);
      });
     },
     setProgress:function(value){
      if(this.isMove)return;
      if(value<0 || value>100){
      return;
      }
      this.$progressLine.css("width",value+"%");
      this.$progressDot.css("left",value+"%");
     }
     };
     Progress.prototype.init.prototype=Progress.prototype;
     window.Progress=Progress;
    })(window);
    ローディングフローは、初期化された歌曲リスト、歌詞情報、登録イベント、初期化されたプログレスバーなどの機能を含み、本例の歌曲リストと歌詞情報はいずれもajaxを通じてローカルファイルから取得され、コアコードは以下の通りである。
    
    $(function() {
     var $audio =$("audio");
     var player=new Player($audio);
     var progress=null;
     var voiceProgress=null;
     var lyric=null;
     //1.    
     getPlayerList();
     //2.    
     initEvent();
     //3.      ,    
     initProgress();
    
     //      
     player.musicTimeUpdate(function(duration,currentTime,timeStr){
     //    
     $(".music_progrss_time").text(timeStr);
     //     
     var value=currentTime/duration *100;
     progress.setProgress(value);
     //      
     var oldIndex=lyric.index;
     var index=lyric.currentLyric(currentTime);
     if(oldIndex==index)return;
     var item=$(".song_lyric ul li").eq(index);
     item.addClass("cur");
     item.siblings().removeClass("cur");
     if(index<0) return;
     $(".song_lyric ul").css({
      marginTop:(-index+2)*40
     });
     })
    
     //      
     function getPlayerList() {
     $.ajax({
      type: "get",
      url: "music_list.json",
      success: function(data) {
      //player.musicList=data;
      //console.log(data);
      var musicList = $(".content_list ul");
      $.each(data, function(index, ele) {
       var item = createMusicItem(index, ele);
       musicList.append(item);
      });
      //            
      initMusicInfo(data[0]);
    
      //       
      initMusicLyric(data[0]);
      },
      error: function(e) {
      console.log(e);
      }
     });
     }
     //      ,      
     function createMusicItem(index, music) {
     var $item = $("<li class=\"list_music\">
    " + "<div class=\"list_check\">
    " + "<i></i>
    " + "</div>
    " + "<div class=\"list_number\">
    " + (index + 1) + "</div>
    " + "<div class=\"list_name\">
    " + music.name + "<div class=\"list_menu\">
    " + "<a href=\"javascript:;\" title=\" \" class=\"list_menu_play\"></a>
    " + "<a href=\"javascript:\;\" title=\" \"></a>
    " + "<a href=\"javascript:;\" title=\" \"></a>
    " + "<a href=\"javascript:;\" title=\" \"></a>
    " + "</div>
    " + "</div>
    " + "<div class=\"list_singer\">
    " + music.singer + "</div>
    " + "<div class=\"list_time\">
    " + "<span>
    " + music.time + "</span>
    " + "<a href=\"javascript:;\" title=\" \" class=\"list_menu_del\"></a>
    " + "</div>
    " + "</li>"); $item.get(0).index=index; $item.get(0).music=music; return $item; } // function initMusicInfo(music){ // var $musicImg=$(".song_info_pic img"); var $musicName=$(".song_info_name a"); var $musicSinger=$(".song_info_singer a"); var $musicAlbum=$(".song_info_album a"); var $musicTopName=$(".music_progrss_name"); var $musicTopTime=$(".music_progrss_time"); var $musicBg=$(".mask_bg"); // $musicImg.attr("src",music.cover); $musicName.text(music.name); $musicSinger.text(music.singer); $musicAlbum.text(music.album); $musicTopName.text(music.name+" / "+ music.singer); $musicTopTime.text("00:00 / "+music.time); $musicBg.css("background","url('"+music.cover+"') no-repeat 0 0;"); } // function initMusicLyric(music){ lyric=new Lyric(music.link_lrc); var lyricContainer=$(".song_lyric ul"); // lyricContainer.html(""); // lyric.loadLyric(function(){ // $.each(lyric.lyrics,function(index,ele){ var item=$("<li>"+ele+"</li>"); lyricContainer.append(item); }); }); } // function initEvent() { // // $(".content_list").delegate(".list_music", "mouseover", function() { // :1. 2. , $(this).find(".list_menu").stop().fadeIn(100); $(this).find(".list_time a").stop().fadeIn(100); $(this).find(".list_time span").stop().fadeOut(100); // $(this).find(".list_name").addClass("list_music_hover"); }); $(".content_list").delegate(".list_music", "mouseleave", function() { // :1. 2. , $(this).find(".list_menu").stop().fadeOut(100); $(this).find(".list_time a").stop().fadeOut(100); $(this).find(".list_time span").stop().fadeIn(100); $(this).find(".list_name").removeClass("list_music_hover"); }); // // $(".list_music").hover(function(){ // // :1. 2. , // $(this).find(".list_menu").stop().fadeIn(100); // $(this).find(".list_time a").stop().fadeIn(100); // $(this).find(".list_time span").stop().fadeOut(100); // },function(){ // // :1. 2. , // $(this).find(".list_menu").stop().fadeOut(100); // $(this).find(".list_time a").stop().fadeOut(100); // $(this).find(".list_time span").stop().fadeIn(100); // }); $(".content_list").delegate(".list_check", "click", function() { $(this).toggleClass("list_checked"); var musicList = $(this).parents(".list_music"); if($(this).hasClass("list_checked")) { musicList.find("div").css("color", "#fff"); musicList.siblings().find("div").css("color", "rgba(255,255,255,0.5)"); } else { musicList.find("div").css("color", "rgba(255,255,255,0.5)"); } }); // // // $(".list_check").click(function(){ // $(this).toggleClass("list_checked"); // }); // $(".content_list").delegate(".list_menu_play", "click", function() { // $(this).toggleClass("list_menu_play2"); // var $musicList = $(this).parents(".list_music"); // console.log($musicList.get(0).index); // console.log($musicList.get(0).music); $musicList.siblings().find(".list_menu_play").removeClass("list_menu_play2"); // if($(this).hasClass("list_menu_play2")) { $(".music_play").addClass("music_pause"); $musicList.find("div").css("color", "#fff"); $musicList.siblings().find("div").css("color", "rgba(255,255,255,0.5)"); } else { $(".music_play").removeClass("music_pause"); $musicList.find("div").css("color", "rgba(255,255,255,0.5)"); } $musicList.find(".list_number").toggleClass("list_number_play"); $musicList.siblings().find(".list_number").removeClass("list_number_play"); // player.play($musicList.get(0).index,$musicList.get(0).music); // initMusicInfo($musicList.get(0).music); // initMusicLyric($musicList.get(0).music); }); // $(".content_list").delegate(".list_menu_del", "click", function() { var $item=$(this).parents(".list_music"); $item.remove(); player.del($item.get(0).index); if($item.get(0).index==player.currIndex){ // , $(".music_next").trigger("click"); } // $(".list_music").each(function(index,ele){ ele.index=index; $(ele).find(".list_number").text(index+1); }); }); // // $(".music_play").click(function(){ // if(player.currIndex==-1){ // $(".list_music").eq(0).find(".list_menu_play").trigger("click"); }else{ // $(".list_music").eq(player.currIndex).find(".list_menu_play").trigger("click"); } }); // $(".music_pre").click(function(){ $(".list_music").eq(player.preIndex()).find(".list_menu_play").trigger("click"); }); // $(".music_next").click(function(){ $(".list_music").eq(player.nextIndex()).find(".list_menu_play").trigger("click"); }); // $(".music_voice_info").click(function(){ // $(this).toggleClass("music_voice_info2"); if($(this).hasClass("music_voice_info2")){ // player.musicVoiceSeekTo(0); }else{ // player.musicVoiceSeekTo(1); } }); } // function initProgress(){ // var $progressBar=$(".music_progress_bar"); var $progressLine=$(".music_progress_line"); var $progressDot=$(".music_progress_dot"); progress=new Progress($progressBar,$progressLine,$progressDot); progress.progressClick(function(value){ console.log(" 0001"); player.musicSeekTo(value); }); progress.progressMove(function(value){ player.musicSeekTo(value); }); // var $musicVoiceBar=$(".music_voice_bar"); var $musicVoiceLine=$(".music_voice_line"); var $musicVoiceDot=$(".music_voice_dot"); voiceProgress=new Progress($musicVoiceBar,$musicVoiceLine,$musicVoiceDot); voiceProgress.progressClick(function(value){ console.log(" 0001"); player.musicVoiceSeekTo(value); }); voiceProgress.progressMove(function(value){ player.musicVoiceSeekTo(value); }); } });
    曲が変わると背景図も変わります。

    ソースリンク
    以上はjQueryがQQ版の音楽プレーヤーの詳しい内容をまねることを開発したので、更にjQueryに関して音楽プレーヤーの資料を開発して私達のその他の関連している文章に注意して下さい!