2012-11-27 125 views
3

在我的程序中,我在開始屏幕上有背景音樂。此功能用於在點擊開始按鈕後淡出我的背景聲音。Jquery - 淡入淡出後的音頻

$(bgMusic).on('timeupdate', function() { 
    var vol = 1, 
     interval = 250; 
    if (bgMusic.volume == 1) { 
     var intervalID = setInterval(function() { 
      if (vol > 0) { 
       vol -= 0.05; 
       bgMusic.volume = vol.toFixed(2); 
      } else { 
       clearInterval(intervalID); 
      } 
     }, interval); 
    } 
}); 

我現在已經添加了一個重啓按鈕,帶您回到開始界面,所以我需要以相同的速度淡出音樂回去。我已經嘗試了幾件事,但他們不工作,有人可以幫助我嗎?

我需要的東西沿着這些路線:

$(bgMusic).off('timeupdate', function() { 
    var vol = 0, 
     interval = 250; 
    if (bgMusic.volume == 0) { 
     var intervalID = setInterval(function() { 
      if (vol < 0) { 
       vol += 0.05; 
       bgMusic.volume = vol.toFixed(2); 
      } else { 
       clearInterval(intervalID); 
      } 
     }, interval); 
    } 
}); 
+0

獲取當前量。設置一個你淡出的標誌。扭轉你在那裏。如果音量大約爲0,並且您淡出,請淡入。 –

+0

請添加您嘗試過的以及處理重新啓動按鈕並淡入音樂的內容。 – ryadavilli

+0

檢查編輯@ryadavilli –

回答

0

可能有更好的方法來做到這一點,但我只是寫了一個音量推子,以獲得更習慣於<audio>

要通過enableFader(yourAudioNode)啓用它在你的<audio>,然後淡出呼叫yourAudioNode.fadeOut(),或在通話yourAudioNode.fadeIn()褪色。
它基於監聽時間更新所以除非您指定較慢的速率,否則它將以頻率explained here更改音量。

function enableFader(node, per_step, min_interval) { 
    'use strict'; 
    var fadeOut, fadeIn; 
    node.fadeSettings = { 
     dir : 0, 
     step : per_step || 0.05, 
     interval : min_interval || 0.150, 
     lastTime : -Infinity 
    }; 
    fadeOut = function fadeOut() { 
     var vol = this.volume, 
      settings = this.fadeSettings, 
      ctime = this.currentTime, 
      dtime = Math.abs(ctime - settings.lastTime); 
     if (settings.dir === -1 && dtime >= settings.interval && vol > 0) { 
      settings.lastTime = ctime; 
      this.volume = (vol - settings.step).toFixed(2); 
     } else if (vol <= 0 || settings.dir !== -1) { 
      this.removeEventListener('timeupdate', fadeOut); 
      settings.dir = 0; 
     } 
    }; 
    fadeIn = function fadeIn() { 
     var vol = this.volume, 
      settings = this.fadeSettings, 
      ctime = this.currentTime, 
      dtime = Math.abs(ctime - settings.lastTime); 
     if (settings.dir === 1 && dtime >= settings.interval && vol < 1) { 
      settings.lastTime = ctime; 
      this.volume = (vol + settings.step).toFixed(2); 
     } else if (vol >= 1 || settings.dir !== 1) { 
      this.removeEventListener('timeupdate', fadeIn); 
      settings.dir = 0; 
     } 
    }; 
    node.fadeOut = function() { 
     this.fadeSettings.dir = -1; 
     this.addEventListener('timeupdate', fadeOut, false); 
    }; 
    node.fadeIn = function() { 
     this.fadeSettings.dir = 1; 
     this.addEventListener('timeupdate', fadeIn, false); 
    }; 
} 

我使用Google Chrome中的我的開發控制檯在this page上測試了它。

var a = document.getElementById('song'); 
enableFader(a); 
a.fadeOut(); 
// a.fadeIn(); 
+0

那麼,爲了使它適合我的代碼,我會在這裏更改什麼? @Paul S –

+0

當'bgMusic'在DOM中時,調用'enableFader(bgMusic);'然後當單擊開始時,'bgMusic.fadeOut()'或重置'bgMusic.fadeIn()'。 (我假設'bgMusic'是對一個節點的引用,而不是其他對象,我在這裏編寫的所有東西都是在_native JavaScript_中完成的)。這個方法的實際代碼更復雜一些快速簡單的setInterval,但我已經做到了,所以fadeIn和fadeOut不會相互爭鬥,依靠事件意味着如果你暫停/ etc,它會在繼續之前等待簡歷。 –