Javascript iOS Safari:防止(或控制)滚动输入焦点

Javascript iOS Safari:防止(或控制)滚动输入焦点,javascript,css,ios,mobile-safari,Javascript,Css,Ios,Mobile Safari,关于这一点,有很多老生常谈的问题(但不完全如此),但由于我找不到任何现代的东西,我想我会再次提问,希望得到一个现代的答案 我正在开发一个爱好者响应的web应用程序,但我在iOS上的输入焦点方面遇到了问题。我希望输入在焦点上滚动到iOS键盘的正上方(或不滚动),但iOS希望在任何情况下都将该控件居中 在附加的GIF中,您可以看到我看到的行为,然后我在末尾滚动以指示一旦触发焦点事件,我希望发生什么 我发现有一件事是这样的,但我想要更好的:下面的代码可以工作,但是在GIF中看到的滚动和窗口返回到我想

关于这一点,有很多老生常谈的问题(但不完全如此),但由于我找不到任何现代的东西,我想我会再次提问,希望得到一个现代的答案

我正在开发一个爱好者响应的web应用程序,但我在iOS上的输入焦点方面遇到了问题。我希望输入在焦点上滚动到iOS键盘的正上方(或不滚动),但iOS希望在任何情况下都将该控件居中

在附加的GIF中,您可以看到我看到的行为,然后我在末尾滚动以指示一旦触发焦点事件,我希望发生什么

我发现有一件事是这样的,但我想要更好的:下面的代码可以工作,但是在GIF中看到的滚动和窗口返回到我想要的位置之间有明显的延迟。另外,如果我将
setTimeout()
计时调整到~400以下,它将不起作用。iOS在焦点滚动时是否有一些块

element.addEventListener('focus', (e) => { setTimeout(() => { window.scroll(0,0) }, 500) });

更新#1

到目前为止,我尝试过的唯一有效的解决方案是以下方法,感觉非常简陋(其中
scrollLock
focus
blur
监听器的其他地方定义):


所有涉及
preventDefault()
window.scroll调用的解决方案都没有阻止上面所示的滚动,而是主动监视滚动并强制它返回到我想要的工作位置。然而,我希望这不是答案

对我们有效的一件事是在获得焦点50毫秒后调用滚动事件。因此,如果单击文本字段,将触发焦点事件。在这种情况下,我们会触发一个
设置超时(()=>窗口。滚动到(0100),50)

到容器的高度有多高?你能不能打开
窗口。点击按钮或其他东西滚动(0,0)
而不是
焦点
?容器高度似乎对mobile Safari并不重要(它是一个灵活的容器,但不应该超过可用的视图高度)。我可以在除“聚焦”
之外的其他位置触发,但这并不能解决iOS的初始滚动问题。试试这个解决方案怎么样?让我知道它是如何运行的。我遇到的一个解决方案是在页脚周围保留一个隐藏的元素。在
输入上观察
焦点
事件,并使隐藏元素
可见。也许这会奏效。谢谢@Rayon的研究!不幸的是,这些解决方案不起作用,但我确实发现了一种可能性,我已经将其添加为OP的更新。
document.addEventListener('scroll', (e) => {
    if (scrollLock && document.documentElement.scrollTop > 100) {
        document.documentElement.scrollTop = 100;
    }
});