javascript - 导航栏仅在 iOS 中向上滚动时显示

标签 javascript ios touch mobile-safari

我正在使用 Marius Craciunoiu technique在用户向上滚动时显示我的整个导航栏。

所以,这是我的 JavaScript(使用 jQuery)代码:

var delta, didScroll, lastScrollTop, navbarHeight;

delta = 5;
lastScrollTop = 0;
navbarHeight = $('.navbar').outerHeight();

$(window).on('scroll touchmove', function() {
  didScroll = true;
});

setInterval(function() {
  if (didScroll) {
    hasScrolled();
    didScroll = false;
  }
}, 250);

function hasScrolled() {
  var scrollTop = $(this).scrollTop();

  if (Math.abs(lastScrollTop - scrollTop) <= delta) { return; }

  if (scrollTop > lastScrollTop && scrollTop > navbarHeight) {
    $('.navbar').addClass('scrolling');
  } else {
    if (scrollTop + $(window).height() < $(document).height()) {
      $('.navbar').removeClass('scrolling');
    }
  }

  lastScrollTop = scrollTop;
}

为了更简单,我将我的代码发布在 http://jsfiddle.net/caio/7HrK7/ 上.如果你想在 iOS 中测试,请使用 http://fiddle.jshell.net/caio/7HrK7/show/light/网址。

视频: http://hiperload.com/s/ua5k53n0x/d.mp4?inline

如您所见,我的代码如何在台式机和 Android 手机上运行。但是在iOS上它需要一个触摸事件来响应,同时滚动事件仍然发生,否则它只会在最后执行。我尝试添加 touchmove 事件,但没有成功。你能帮帮我吗?

最佳答案

看起来 iOS 在滚动时暂停了所有计时器。在这里尝试该技术也许您会很幸运:

iOS 6 js events function not called if has setTimeout in it

或者,您可以直接在 touchmove 上运行 hasScrolled()。这似乎会导致一些闪烁(至少在我的 iPad 上是这样),因此您可能需要想出一种不同的方式来为滚动条设置动画:

$(window).on('touchmove', function() {
  hasScrolled();
});

请看这里的 fiddle : http://jsfiddle.net/mariusc23/7HrK7/13/

如果您找到解决方案,请告诉我,以便我更新帖子。我也会花一些时间在上面。谢谢阅读。 :)

关于javascript - 导航栏仅在 iOS 中向上滚动时显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23459199/

相关文章:

javascript - 如何使用 requirejs 正确定义 shim 配置

javascript - 从react js中的子文件夹导入模块

android - 用于 ipad、android 的网络 session 摄像头和麦克风作为基于网络的解决方案的方法

objective-c - 使用 LAPACK 求解 Ax=B,其中 x >= 0

ios - 当参数不是预期的参数时,OCMock 抛出 NSInternalInconsistencyException

iOS – 如何让 UIView 捕获并转发触摸事件?

ios - 快速检测屏幕上任何地方的触摸

javascript - 当循环遍历 JS 数组的值并删除值时,是否需要使用 while 而不是 for?

iOS8 触摸位置在风景中受到限制,好像窗口在一侧是肖像?

javascript - 在 MEAN 堆栈应用程序中从 mongodb 获取 "404 not found"