CSS:在iOS 13上禁用滚动的弹跳效果

c0vxltue  于 2023-01-18  发布在  iOS
关注(0)|答案(4)|浏览(702)

Safari 13 release notes中,声明不再需要将以下内容应用于元素以启用弹跳滚动效果:

div {
  overflow-x: scroll;
  -webkit-overflow-scrolling: touch; /* No longer needed */
}

但是,我现在无法再使用以下代码禁用此效果:

div {
  overflow-x: scroll;
  -webkit-overflow-scrolling: auto;
}

我正在做一个旋转木马,需要这个。你知道怎么修吗?

7z5jn7bk

7z5jn7bk1#

我认为你应该尝试使用overflow属性来改变这种情况,因为在Safari中,overflow属性会阻止弹跳滚动行为。要在滚动div的父容器中实现这一点,你必须设置:

overflow: hidden;

然后在你的div中设置如下内容:

div {
  overflow: auto;
}
bjp0bcyl

bjp0bcyl2#

在Safari中多边形填充这个CSS属性是相当棘手的。
对于不可滚动的元素,您可以通过关闭触摸手势来防止滚动链接,您可以使用Safari支持的CSS属性来实现这一点:触摸动作:没有。
但是对于可滚动的元素,需要JavaScript。
请记住,滚动链接发生在您到达元素的边界时。因此,我们需要确保用户永远无法完全滚动到顶部或底部。错误地这样做可能会导致用户体验问题,因为用户显然会与默认的惯性滚动作斗争。
这里有个窍门:
创建一个内部元素,至少比滚动父元素高3px,强制区域获得overscroll行为。立即将滚动位置设置为1px,以防止向上滚动时出现滚动链。使用JavaScript,捕捉滚动位置正好为0或正好位于底部的时间。在requestAnimationFrame之后,将滚动位置设置为从顶部或底部开始的1px。容器仍然会获得惯性滚动(用户不必与之对抗),但不会触发滚动链接。
下面是JavaScript函数:

this.addEventListener('scroll', async handleScroll() {
  await new Promise(resolve => window.requestAnimationFrame(resolve))
  const {
    scrollTop,
    scrollLeft,
    scrollHeight,
    clientHeight
  } = this
  const atTop = scrollTop === 0
  const beforeTop = 1
  const atBottom = scrollTop === scrollHeight - clientHeight
  const beforeBottom = scrollHeight - clientHeight - 1

  if (atTop) {
    this.scrollTo(scrollLeft, beforeTop) 
  } else if (atBottom) {
    this.scrollTo(scrollLeft, beforeBottom)
  }
}

来源:https://dev.to/mpuckett/the-holy-grail-web-app-shell-with-header-and-footer-for-iphone-549j

ql3eal8s

ql3eal8s3#

iOS 16现在支持css overscroll-behavior。如果您的目标设备〉iOS 16,为了防止溢出父级中的内容到达开头或结尾时出现反弹效果,请使用overflow : scroll将以下CSS添加到div

div {
  overscroll-behavior: none;
  overflow : scroll
}

在iOS 16及更高版本中测试。

hpcdzsge

hpcdzsge4#

我不知道我是否真的理解正确,但它在这里!:)
你就不能把那行代码从文件里删掉吗?
您还可以尝试写入-webkit-overflow-scrolling: auto; !important
希望这对您有所帮助:

相关问题