Increasing/decreasing 视频元素上的音频,通过 jQuery Waypoints 触发

Increasing/decreasing audio on a video element, triggered via jQuery Waypoints

我有一个包含一系列 (HTML 5) 个视频的页面,这些视频的音频需要根据您在页面上的位置淡入或淡出(每个视频可能不同)。我正在使用 jQuery Waypoints 和 InView 插件来检测元素何时在视口中。我不确定如何始终如一地执行此操作,以免在音量仍在减小或增大时绊倒航路点时导致意外行为。

var waypoint = new Waypoint.Inview({
  element: $('#element')[0],
  enter: function() {
    $('#element')[0].volume = 0;
    $('#ielement')[0].play();
    incVol($('#element')[0]);
  },
  entered: function() {},
  exit: function() {},
  exited: function() {
    decVol($('#element')[0]);
  }
});

function incVol(e) {
  setTimeout(function() {
    if ((e.volume + .05) < 1) {
      e.volume += .05;
      incVol(e);
    } else {
      e.vol = 1;
    }
  }, 100)
}

function decVol(e) {
  setTimeout(function() {
    if ((e.volume - .05) > 0) {
      e.volume -= .05;
      decVol(e);
    } else {
      e.volume = 0;
      e.pause();
    }
  }, 100)
}

这是一次不一致的尝试,如果您触发 'enter' 而 'decVol' 仍然是 运行,您将完全失去音量并且必须触发 'exit',等待,然后然后再次触发'enter'。

我也尝试过使用 jQuery 的音量动画。但这似乎也不一致。

var waypoint = new Waypoint.Inview({
  element: $('#element')[0],
  enter: function() {
    $('#element')[0].volume = 0;
    $('#element')[0].play();
    $('#element').animate({
      volume: 1
    }, 1000);
  },
  entered: function() {},
  exit: function() {},
  exited: function() {
    $('#element').animate({
      volume: 0
    }, 1000, function() {
      $('#element')[0].pause();
    });
  }
});

如果我上下滚动太快,特别是如果我在页面中有多个 waypoints 这种类型,那么事件队列就会变得很长,并且我会淡化 ins/outs 发生在很久之后事件已经触发(不过,我目前更喜欢这个实现)。

关于如何更好地实现我想要的目标有什么建议吗?

在 animate() 函数前面加上 stop() 就是答案。 类似于:

$('#element').stop(true, false).animate({
  volume: 1
}, 1000);