android - 当虚拟键盘在全屏显示模式下处于 Activity 状态时,PWA 不会调整窗口大小

标签 android html google-chrome progressive-web-apps virtual-keyboard

我正在开发一个 PWA,主要针对移动用户。据我所知,网络的默认行为是,当虚拟键盘处于 Activity 状态时,窗口大小会相应调整。这对于网络上的移动设备和独立显示模式来说效果很好。在全屏模式下,当键盘处于 Activity 状态时,窗口大小不会改变。这导致输入被隐藏在键盘后面。现在有人知道为什么会出现这种情况吗?或者是否有办法解决这个问题? (比如手动获取键盘的高度等)据我所知,该问题仅发生在android chrome上,ios safari按预期工作。

最佳答案

当 PWA 显示设置为全屏时,API 不允许视口(viewport)根据输入事件进行调整,因此虚拟键盘将始终覆盖应用程序。欲了解更多详情,请参阅Progressive Web-App Soft-Keyboard and Nav Bar overlaps in Fullscreen

最简单的解决方案是将其设置为独立。否则:

例如,您可以执行的强制视口(viewport)更新的一种通用 CSS 解决方法是使用 :focus-within(注意,未经过广泛测试):

@media only screen and (orientation: landscape) and (hover: none) {
    body:focus-within,
    body:focus-within .an-absolutely-positioned-input-ancestor {
        max-height: 53vh;
        overflow: auto;
    }
}

我们使用的更具体的解决方法是使用 Javascript 将 input_focus 类添加到仅在焦点事件上适用的特定表单元素的 body 标记,然后使用 CSS 选择该元素并将该元素(绝对/固定)设置为 float 在上面键盘。 使用 jQuery 的简短示例:

JS

var inputs = jQuery('input[type="text"]').add('textarea');
inputs.each((index, input) => {
    input.on('focus', e => {
        jQuery('body').addClass('input_focus');
    }).on('blur', e => {
        jQuery('body').removeClass('input_focus');
    });
}

CSS

body.input_focus :is(
    input[type="text"],
    textarea
    ):focus {position: fixed;} /* position as you need */

注意:如果使用 AJAX 动态加载 DOM 区域,请将 JS 包装在一个函数中,并在每次 AJAX 完成加载时运行。

关于android - 当虚拟键盘在全屏显示模式下处于 Activity 状态时,PWA 不会调整窗口大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71606355/

相关文章:

Android API 检查调用是 Activity 还是保持

javascript - 侧导航滑动过渡不滑出

c# - 我如何使用 WPF 为 Google Chrome 之类的窗口设置主题?

css 样式在 chrome 中没有正确应用以进行引导切换

javascript - 如何为动态创建的数据库元素显示弹出式 div

javascript - 无法在 js 弹出窗口中嵌入对象

android - 检查是否为另一个应用程序授予了外部存储管理器

android - 大布局影响 Galaxy Note

Android AudioTrack() 播放流开始后如何停止

jquery - 使用 jquery 的 html 目标 iframe