13

我遇到了一个奇怪的问题。我目前正在制作一个仅适用于 iOS 6 的使用 HTML5 和 CSS3 的移动网络应用程序。

但是,当input元素获得焦点并显示软键盘时,窗口会滚动,以便输入不会被键盘遮挡(即使在任何情况下都不会遮挡)。

我已经阅读了 SO 并通过 Google 可以添加以下内容来防止这种行为(在 UIWebView 中查看时):

input.onfocus = function () {
    window.scrollTo(0, 0);
    document.body.scrollTop = 0;
}

但是,似乎在 iOS 6 中,即使窗口最初滚动到0,0,然后再次滚动到焦点元素的中心。有没有其他人遇到过这个问题,他们知道 iOS 6 的修复方法吗?

4

4 回答 4

20

我也碰到了这个问题。以下适用于 iOS 6:

<input onfocus="this.style.webkitTransform = 'translate3d(0px,-10000px,0)'; webkitRequestAnimationFrame(function() { this.style.webkitTransform = ''; }.bind(this))"/>

基本上,由于 Safari 会根据文本框的垂直位置决定是否滚动页面,因此您可以通过暂时将元素移动到屏幕顶部上方然后在焦点事件完成后再次返回来欺骗它。

缺点是元素消失了几分之一秒。如果您想解决这个问题,您可以在原始位置动态插入原始元素的克隆,然后在webkitRequestAnimationFrame回调中将其删除。

于 2013-01-12T19:47:14.370 回答
1

会不会是时间问题?

尝试在超时中将其包装起来,以确保它在本机事件触发后触发。

input.onfocus = function () {
    setTimeout(function() {
        window.scrollTo(0, 0);
        document.body.scrollTop = 0;
    }, 50)
}
于 2013-01-11T16:04:43.310 回答
0

更新: 虽然公认的解决方案适用于 UIWebView,但更新更快的 WKWebView 已经到来。如果您使用最新版本的 iOS 版 Cordova,您可以为 iOS 9 设备启用 WKWebView,但默认情况下,视图仍会向上滚动。要解决这个问题,只需添加键盘插件(不再需要 CSS hack):

在终端中添加 Cordova 插件:

cordova platform add ios@4
cordova plugin add cordova-plugin-wkwebview-engine --save
cordova plugin add cordova-plugin-keyboard --save

在 Cordova 的 config.xml 中设置 iOS 首选项以使用 WKWebView

<platform name="ios">
    <feature name="CDVWKWebViewEngine">
        <param name="ios-package" value="CDVWKWebViewEngine" />
    </feature>
    <preference name="CordovaWebViewEngine" value="CDVWKWebViewEngine" />
</platform>

然后在 Cordova 的 config.xml 中插入 iOS 键盘首选项

    <preference name="KeyboardShrinksView" value="true" />
    <preference name="DisallowOverscroll" value="true" />

Cordova 文档中列出了有关 iOS 首选项的更多详细信息: https ://cordova.apache.org/docs/en/5.4.0/guide/platforms/ios/config.html

于 2016-01-06T15:25:42.573 回答
-4

input的字体大小样式设置为1em或更高。

<input type=text style="font-size:1.2em">

于 2013-01-10T02:56:46.583 回答