2012-11-27 7 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>에 더 익숙해 볼륨 페이더를 썼다.

통화 yourAudioNode.fadeOut()을 페이드 아웃 후, enableFader(yourAudioNode)하여 <audio>에 그것을 사용하려면, 또는 전화 yourAudioNode.fadeIn()에 페이드.
timeupdate에 대한 수신을 기반으로하므로 더 느린 속도를 지정하지 않으면 주파수가 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에서 devadmin을 사용하여 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은 서로 싸우지 않으며 이벤트에 의존한다는 것을 의미합니다. 일시 중지하면 계속하기 전에 이력서를 기다립니다. –

관련 문제