在iphone safari虚拟键盘上键入时滚动到所选元素

时间:2010-06-01 15:43:33

标签: javascript iphone web-applications mobile-safari

我正在构建一个iphone webapp并且有一个带有输入字段的页面。我希望该字段在显示时向上滚动到虚拟键盘上方。我已经尝试在输入焦点事件上放置一个scrollTo(x,y)(即在键盘出现之前),但是当我开始键入页面时再次向上滚动(可能是基于默认的移动safari行为)。我也试过设置按键事件处理程序,但阻止这些事件的传播只是禁用了键盘,虽然它确实阻止了滚动。

当虚拟键盘出现时,有没有办法强制页面处于特定位置(键盘上方的输入字段),当我恢复键入时,没有移动页面?

3 个答案:

答案 0 :(得分:3)

好的,所以这可能是你见过的最糟糕的黑客,但它什么都不打算。

您可以做的是动态地(使用javascript)将文本框的位置更改为固定的position:fixed,这将更改文本框相对于浏览器窗口而不是页面的位置。这应该会使Iphone的滚动无关紧要,无论如何,您的文本框都应位于页面顶部。然后在onBlur上,css位置再次设置为相对位置(应该将它放回原位)。

为了使这个更漂亮,你可以在文本框onFocus后面放置一个div,这样它就会隐藏实际的网站内容,你可以使用top和left css属性将文本框居中(只需确保清除那些onBlur)。

答案 1 :(得分:0)

据我所知,问题在于,当键盘启动时,浏览器会尝试将窗口移动到元素本身的视图中。

可能发生的是在弹出键盘之前正在录制滚动条位置。然后,一旦键盘弹出,浏览器将根据记录的值计算窗口移动所需的距离,以使元素进入视图。到那时你已经改变了窗口的位置。所以它相对于你设置的位置移动窗口,而不是它认为的位置。

如果您不尝试手动将元素滚动到视图中(没有脚本编写),您遇到的行为是什么?

我的印象是iPhone浏览器原生地做你想要的。如果不是,它可能与元素定位有关。 I.E.浏览器无法正确计算元素的位置,例如如果它在一个固定位置的容器中(因为它的位置将在浏览器尝试scollTo时移动)。

如果失败,可以尝试将scrollTo函数置于超时内,以便在键盘出现后触发。

答案 2 :(得分:-1)

可能 有效,请尝试使用css translate3d而不是scrollTo(x,y)

请参阅http://www.webkit.org/blog/386/3d-transforms/