14

我有一个移动网络应用程序,它在一个位置显示一个对话框:覆盖整个屏幕的固定元素。无论显示多少内容或页面滚动了多远,覆盖元素都会使页面内容变暗,并且对话框会出现在所有内容之上。对话框中有一个<input type="search />字段。

在 Android 上,当用户点击输入字段以使其获得焦点时,通常(但并非总是)会出现一些非常不稳定的行为:

  • 软键盘出现,然后立即消失。
  • 底层页面(被覆盖层覆盖)滚动几十个像素,有时向上,有时向下,有时双向,有时重复。当输入字段失去焦点时也会发生这种情况。
  • 覆盖元素会瞬间向下和向右移动几个像素,显示屏幕顶部和左侧边缘的底层内容。(它在不到一秒后返回原位。)

这是在带有内置浏览器的 Android 2.3.4 上。它也可能出现在其他 Android 版本上。

页面构造如下:(请记住,其中一些怪癖仅在页面包含足够的内容以允许滚动时才会出现。)

<head>
  <style type="text/css">
    #menuoverlay {
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    z-index: 10;
    background-color: rgba(0,0,0,.75);
    text-align: center;
    }
    #menu {
    display: inline-block;
    margin-top: 1em;
    border: 3px solid #02b;
    border-radius: 8px;
    padding: 1ex;
    background-color: black;
    color: silver;
    }
  </style>
</head>

<body>
  <div id="menuoverlay">
    <div id="menu">
      ...menu items...
      ...menu items...
      <form action=""><input type="search"/></form>
    </div>
  </div>

  <div id="content">
    ...lots of stuff...
    ...lots of stuff...
    ...lots of stuff...
  </div>
<body>

有没有其他人看到过这种行为?你找到预防的方法了吗?


在网上搜索让我看到了一些类似问题的报告。以下是我到目前为止所读内容的摘要:

  • 在许多 Android 设备上,内置浏览器显然没有像人们期望的那样使用 WebKit 的输入字段。相反,当 html 定义的字段获得焦点时,浏览器会尝试用它单独创建的新文本小部件覆盖它们。
  • 这些重复的文本字段通常会忽略 css 样式,从而产生一种效果,即字段看起来是样式化的,直到它们获得焦点,然后突然恢复为系统默认样式。
  • Android 浏览器经常无法正确定位这些重复字段。当错位时,它们有时是可见的,但有时仅移动焦点目标而没有任何视觉指示它们已移动。
  • transform: translate3d()当输入字段的祖先元素具有、-webkit-backface-visibility或等样式时,通常会出现这些问题position: fixed

以下是一些相关链接:

Android浏览器textarea到处滚动,无法使用

如何设置 HTML INPUT 标记的样式,以便在专注于 Android 2.2+ 时保持 CSS?

Android 2.2/2.3 的原生浏览器和固定定位

4

2 回答 2

12

我设法通过设置outline: none我的input元素来防止瞬时覆盖偏移。

overflow: hidden通过在显示对话框时设置html body,然后在隐藏对话框时再次删除它,我得到了狂野的页面滚动和消失的键盘。这对重置页面的滚动位置有一个令人讨厌的副作用,所以我保存它并在必要时恢复它,并将所有这些hackery 包装在条件中,因此它只能在 Android 上运行。(我希望我的 Android 用户在对话框打开时看到半透明覆盖下的页面内容发生变化时不会太分心。)

有趣的是,我还能够通过touchstart在我的覆盖元素上捕获事件并调用 preventDefault() 来防止疯狂的页面滚动。这让我想知道所有这些疯狂是否是由这样的一系列事件引起的:

  • touchstart冒泡到文档根目录
  • 浏览器查看touchstart重复输入字段的放置位置
  • 浏览器将焦点放在输入字段上
  • 软键盘似乎允许在输入字段中输入
  • 视口调整大小以适应软键盘
  • 在触摸事件期间调整大小的视口看起来像是对浏览器的触摸拖动
  • 虚假拖动导致页面滚动并关闭键盘

我最终没有touchstart解决这个问题,因为它阻止了输入字段获得焦点,并且focus()从 javascript 调用只是不起作用。我已经读到 Android 浏览器禁用了focus()输入字段上的方法,这可以解释这种行为。也许它这样做是因为它不能与它在 html 定义的字段上创建的重复文本小部件一起工作。

于 2012-05-10T22:23:01.180 回答
0

就我而言,“位置:固定;” 不是问题,“vertical-align:center;” 或“-webkit-box-align:center;” 推回并关闭软键盘,使用“-webkit-box-align:start;” 解决了我的问题。

于 2013-09-21T14:23:14.497 回答