美文网首页
HungerMusic

HungerMusic

作者: kzc爱吃梨 | 来源:发表于2019-09-26 10:17 被阅读0次

    难点


    1.歌词实现

      /*歌词处理*/
      loadLyric: function() {
        var _this = this
        $.getJSON('//jirenguapi.applinzi.com/fm/getLyric.php', {sid: this.song.sid}).done(function(ret){
          var lyric = ret.lyric
          var lyricObj = {}
          /*吧歌词变成key-value的形式 */
          lyric.split('\n').forEach(function(line){
            //[01:20:20][01:30:25] hello
            var times = line.match(/\d{2}:\d{2}/g)
            //times == ['01:20:20','01:30:25']
            var str = line.replace(/\[.+?\]/g, '')
            if(Array.isArray(times)){   //有些时段没有歌词,所以有个时间匹配,否则出现undefined
              times.forEach(function(time){
                lyricObj[time] = str
              })
            }
          })
          _this.lyricObj = lyricObj
          //console.log(lyricObj)
        })
      }
    
      /*状态更新*/
      updataStatus(){
        /*歌曲的时间*/
        var duration = this.formateTime(this.audio.duration)
        var current = this.formateTime(this.audio.currentTime)
        this.$container.find('.current-time').text(this.formateTime(this.audio.currentTime))
        this.$container.find('.duration-time').text(duration)
        /*进度条*/
        this.$container.find('.bar-progress').css('width', this.audio.currentTime/this.audio.duration*100 +'%')
        /*对应时间展示对应歌词*/
        var line = this.lyricObj['0'+current]
        if(line){
          this.$container.find('.lyric p').text(line).boomText()
        }
      }
    

    2. 事件交互

    • 自定义事件
    //自定义事件(事件中心)所有模块都与这个事件中心进交互。
    var EventCenter = {
      on: function (type, handler) {
        $(document).on(type, handler)
      },
      fire: function (type, data) {
        $(document).trigger(type, data)
      }
    }
    /* 监听hello这个事件,然后执行后面的函数*/
    // EventCenter.on('hello', function(e, data){
    //     console.log(data)
    // })
    /*自定义一个hello的事件*/
    // EventCenter.fire('hello','你好')
    

    先fire一个自定义事件,然后两个板块通过监听这个自定义事件进行交互,减少耦合。

        this.$footer.on('click', 'li', function(){
           $(this).addClass('active').siblings().removeClass('active')
           /*自定义select-albumn事件,获取并发送里面的自定义属性{data-channel-id,data-channel-name},之后歌曲切换需要*/
           EventCenter.fire('select-albumn', {
             channelId: $(this).attr('data-channel-id'),
             channelName: $(this).attr('data-channel-name')
           })
        })
    
    /*监听自定义事件和事件发过来的对象数据*/
    EventCenter.on('select-albumn', function(e, channelObj){
          _this.channelId = channelObj.channelId
          _this.channelName = channelObj.channelName
          _this.loadMusic()
        })
    

    自定义事件的作用主要是让,后台知道用户点了那个歌单,然后加载对应歌单的音乐。

    3. JQuery插件开发项目歌词的炫酷效果

    例子:

     $.fn.boomText = function(){
       var str =  this.text()
       this.text(str.split('').reverse().join(''))
     }
    

    写一个插件,$.fn.函数名 = function(){}

    用法:$(选择元素).函数名()

    <body>
      <p>欢迎来到饥人谷</p>
      <div class="hello">hello</div>
    </body>
    
      <script>
        $.fn.boomText = function(type){
      //css3的语法动画
          type = type || 'rollIn'
      //给每个字都裹上一个`span`再赋值给原来的html,通过操作每个字实现歌词动画
          this.html(function(){
            var arr = $(this).text()
            .split('').map(function(word){
              return '<span class="boomText"  style="display:inline-block">'+ word + '</span>'
            })
            return arr.join('')
          })
      //每隔300毫秒给每个字加上一个标签`'animated ' + type`,  使它有对应的动画效果。
          var index = 0
          var $boomTexts = $(this).find('span')
          var clock = setInterval(function(){
            $boomTexts.eq(index).addClass('animated ' + type)
            index++
            if(index >= $boomTexts.length){
              clearInterval(clock)
            }
          }, 300)
          }
    
        $('p').boomText('zoomIn')
        $('.hello').boomText()
      </script>
    

    Animate.css动画


    效果展示·

    相关文章

      网友评论

          本文标题:HungerMusic

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