div 中途触发航点

Trigger a waypoint when halfway through a div

我有一个 div,其中包含一个很长的多屏幕博客 post。长度因内容而异。我想在经过 div 的三分之一时触发一个航路点。我了解偏移功能,但这似乎适用于 div 出现在屏幕下方的距离。我无法修改 HTML 以包含任何标识符;我需要完全通过 Javascript 完成。

$('.article-body').waypoint({
  handler: function() {
    alert('Hit midpoint of my context');
  },
  context: ".article-body",
  offset: $(".article-body").height * 0.33
});

样本HTML:

<body>
    <div class="article-body">
        CONTENT CONTENT CONTENT
    </div>
<body>

这对全局变量有点草率,但你会明白的;它的要点是提前确定您希望触发 "waypoint" 的位置,然后观察 window 滚动直到到达该点。

(请注意,如果您的内容在页面加载后发生变化,您将需要重新计算 waypointPos。您可以每次都即时计算它,但滚动事件触发的频率足够高,可能会导致延迟;我会投票window 以较慢的时间间隔滚动位置,而不是在 window 滚动期间不断地进行 DOM 计算。)

// determine the scroll position where we want to do something, which is the element's top offset plus half of its height:
var waypointPos = ($('.hasWaypoint').height() / 2) + $('.hasWaypoint').offset().top;

// watch window scroll until we search that point:
var waypointTriggered = false;
$(window).scroll(function() {
  if (!waypointTriggered && $(window).scrollTop() >= waypointPos) {
    alert("Halfway there!");
    waypointTriggered = true; // don't keep triggering endlessly
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p style="height:200px">This is extra stuff whose height we want to ignore</p>
<div class="hasWaypoint" style="height: 3000px;border:1px solid">This is the big div</div>

我看到 Daniel 的回答已被接受,但这里是如何使用 Waypoints 来做到这一点:returns 负数的偏移函数。

偏移量总是根据元素顶部到 window 顶部的距离。假设我们有一个 300px 高的元素。如果我们将偏移量设置为 -100 ,那么当元素的前三分之一滚动过去时会产生触发效果。现在让我们把它变成一个动态函数:

offset: function() {
  return this.element.offsetHeight / -3;
}