在不禁用滚动功能的情况下防止 iOS 弹跳

IT技术 javascript jquery html ios css
2021-03-07 16:51:25

我正在尝试实施一种解决方案,以防止当网页内容大于视口时,iOS Safari 中的 iOS 反弹效果。

我正在处理的页面在结构上非常具体,与此页面非常相似http://new.salt.ch/

  • 基本结构是基于引导的。
  • 它在顶部有一个固定的导航栏。
  • 它有一个全屏背景幻灯片。
  • 幻灯片有一个固定在视口底部的覆盖层。
  • 有一个页脚元素可以在画布外加载并且仅在滚动内容时可见。
  • 内容在导航栏后面滚动。
  • 内容由位于导航栏下方 20 像素的标题和位于视口上方 20 像素的一系列按钮组成。
  • 滚动时,按钮和标题都会向上移动屏幕以显示页脚。

我遇到的问题与页面http://new.salt.ch/上的问题相同,因为当您向上滚动时,屏幕底部会出现反弹效果,并显示背景和叠加层。

我尝试了各种解决方案,包括 iNoBounce.js、Nonbounce.js 以及我在 SO 上找到的其他一些建议。

我总是有同样的问题......当我尝试禁用反弹时,所有滚动都会被禁用。我猜这是因为内容(页脚除外)总是足够大以至于不需要滚动,因此滚动被禁用并且页脚不再可在滚动时访问。

6个回答

此代码应该停止反弹,因为它是反弹的 HTML 标记

html {
    height  : 100%;
    overflow: hidden;
    position: relative;
}
body {
    height  : 100%;
    overflow: auto;
    position: relative;
}
这对我有用。我有一个水平滚动的滑块,它不断引起轻微的反弹。
2021-04-21 16:51:25
在 ios12 中工作,并添加position: relative到两者
2021-05-10 16:51:25
此修复程序似乎已过时。弹跳修复.js 似乎也不起作用。
2021-05-14 16:51:25
如果你们可以放置您遇到问题的版本,那么它可能有助于更新修复程序。
2021-05-15 16:51:25
关于这个问题的任何更新?我试过上面的代码,它在 ios 9.3.5 上不起作用
2021-05-16 16:51:25

我浏览了一些关于 SO 的答案,在偶然发现这段代码之前,事情看起来很黯淡。

html {
  position: fixed;
  height: 100%;
  overflow: hidden;
}

body {
  width: 100vw;
  height: 100vh;
  overflow-y: scroll;
  overflow-x: hidden;
  -webkit-overflow-scrolling: touch;
}

样式声明body可以放在任何您希望能够滚动的元素上。您还可以改变overflow-xoverflow-y需要。我个人需要它不要滚动到两侧,所以我声明它是这样。

更新2017年9月15日:我不得不使用此修补另一个项目,我能够没有这些声明做position: fixedheight: 100%;html选择。青年会

2018 年 4 月 12 日更新(在评论中提到):如果您在页面上使用固定元素,滚动时这些元素可能会出现视觉“抖动”。

非常感谢!:)
2021-04-25 16:51:25
@EthanB 你的想象力一定被打破了!享受 CSS 和分号。
2021-04-27 16:51:25
谢谢。我已经为此苦苦挣扎了一段时间。
2021-05-01 16:51:25
正在处理 Angular 7 项目。我在 iPod (6. gen) 上进行测试并注意到页面非常有弹性。从左滑动写入时。我可以看到当前页面后面的前几页。不好。这解决了问题。谢谢!!!:-D <3 这就是分享的力量。节省了我很多时间。
2021-05-07 16:51:25
+1 以消除 James Campbell 的回答中发生的一点垂直摆动。-1 表示非分号和非 CSS。:(
2021-05-15 16:51:25

如果我正确解释了您的问题,多年来我们一直在开发跨平台移动网络应用程序时遇到同样的问题,试图让所有不同的专有滚动功能在每个设备上正常工作:Apple iOS、Google Android、Windows手机、笔记本电脑 Chrome、笔记本电脑 Safari、IE 和笔记本电脑 Edge。

jQuery Mobile 继续尝试在其框架范围内解决此问题,但由于每个设备制造商/操作系统制造商的不断更新,这太过分了。

是的,我们为每个单独的移动设备提供了解决方案。我们已经测试过,但没有认真考虑为每个设备开发设备选择性分页框架,要求我们检测每个设备并为每个设备提供一个略有不同的框架。基本上维护至少 3 个和实际上多达 12 个不同版本的代码,这是一个非常糟糕的主意。

解决方案:我们最幸运的是将持久的页眉和页脚放在页面框架的顶部。为简单起见,以下是使用内联样式的通用解决方案:

<html>
<head>
  <title>Fixed Header and Footer on All Mobile Web Apps</title>
  <meta name="viewport" content="user-scalable=no, initial-scale=1.0, maximum-scale=1.0" />
  <style>
    html, body { height:100%; width:100%; }
  </style>
</head>
<body>
<div style="position: fixed; height:100%; width:100%; top:0; left:0;">
  <div style="height:calc(100% - 1px); width:100%; margin-top: 60px; z-index: 1; overflow-y: scroll; -webkit-overflow-scrolling: touch;">
    [Body Content That Can Scroll if it extends beyond screen...]

  </div>
  <div style="position: absolute; top:0; left:0; width:100%; height: 60px; background:#dddddd; z-index:10;">
    [Header Content...]

  </div>
  <div style="position: absolute; bottom:0; left:0; width:100%; height: 40px; background:#cccccc; z-index:11;">
    [Footer Content...]

  </div>
</div>
</body>
</html>

因此,Body 可以是任何 jQuery Mobile 页面集。事实上,从理论上讲,Body 几乎可以是任何框架中的任何内容。

特别注意,高度为:calc(100% - 1px); 是关键的魔法。

这个问题看似无限的组合或排列,几乎成了我们这些年来的讨伐,试图找到最纯粹、最简单、最通用的解决方案。因此,在为该主题投入了大量令人尴尬的工时后,这不仅是我们最好的解决方案,而且还是我们发现的唯一一种通用兼容的方法,它还能让您坚持使用单一的代码库。它已在最新版本的 iOS、Windows Phone、Android、笔记本电脑 Chrome、笔记本电脑 Safari、PhoneGap、笔记本电脑 Firefox、IE 9-11 和 Windows Edge 上成功测试。

标签:移动应用、网络应用、固定页眉、固定页脚、持久页眉、持久页脚、滚动问题、iOS 滚动反弹、Chrome 滚动反弹、Android 滚动反弹、webkit 滚动问题、webkit 触摸滚动、iOS 触摸滚动问题

@IvanBorisenko 有什么解决方案吗?:)
2021-04-28 16:51:25
您刚刚为我节省了整个下午的调试时间 @Jeremy Whitt 真是太棒了!!!!!!
2021-04-28 16:51:25
Jeremy,我喜欢那个解决方案。很简单的。但是我遇到了一个问题。如果内容的初始滚动位置为 0 并且我向下拖动内容将没有(在 ios 上)反弹效果并且整个滚动状态被破坏,我无法向下或向上滚动。它仅在我最初向上滚动然后向下滚动时才有效。你没有遇到这样的问题吗?
2021-05-03 16:51:25
太感谢了!这就像一个魅力!我正在使用 Inobounce,当与不同的水平滚动组结合时,它让我很头疼。使用此解决方案,我的 Web 应用程序的外观就像一个真正的本机应用程序。即使不使用 javascript hacks... :D 干杯 - 接受我的赞成!:) 提示使用 calc(100% - 0.1px) 以避免实际看到 1px。(y)
2021-05-11 16:51:25
@AlexanderJorias 我有同样的问题。似乎不幸的是,标题应该在它上面有页面的滚动条。这对于 Cordova 应用程序来说似乎很尴尬。:-/
2021-05-15 16:51:25

我使用了 iNoBounce https://github.com/lazd/iNoBounce,它运行完美!

如果您还需要允许水平滚动,santi6291https://github.com/lazd/iNoBounce/pull/36 上有一个 pull request可以解决这个问题

对于 iOS 13 上的 2019 Safari,我能够使用此修复程序:

   html {
      overflow: hidden;
      height: 100%;
      position: fixed;
   }

   body {
      overflow: auto;
      height: 100%;
      position: relative;
  }

至少对我来说,它涵盖了大多数情况。

没有“位置”的东西对我有用。谢谢!
2021-05-07 16:51:25
我还必须添加width: 100%underhtml以保留预fixed布局。
2021-05-12 16:51:25