LoginSignup
7
7

More than 5 years have passed since last update.

Android 2系でテキスト入力時に上下に激しくスクロールされるバグ

Last updated at Posted at 2013-11-14

Androidのテキスト入力のバグ

スマートフォンサイトで、オーバレイしたモーダル上にログインフォームを設置したところ、
メールアドレス・パスワードの文字入力時に、一文字打つごとに画面が上下に激しくスクロールされて、
打っている文字がとても視認できないという問題が発生した。

<div id="mask"></div>
<div id="Login">
   <input type="email">
   <input type="password">
</div>
<section class="content">
   //メインのコンテンツ
</section>
/* 半透明の陰 */
#mask {
   position: fixed;
   z-index: 3000;
   opacity: 0.7;
   top: 0;
   left: 0;
   width: 100%;
   height: 100%;
   background: #000;
}
/* ログインフォーム */
#Login {
   position: absolute;
   z-index: 4000;
   width: 100%;
}

bodyをスクロール不能にする

検索してもあまり出てこなかったのだけど、
(だいたい検索ワードがよく分からない。「上下に揺れる」とかで検索したら・・・)
少ないながらも言及していた記事ではAndroid 2系に対応するならばモーダル上でテキスト入力させるのは諦めろという感じの論調だった。

そんな中でも参考になりそうな記事がこれ。
https://github.com/scottjehl/Device-Bugs/issues/32
この中に書いてある以下の対処で、異常なスクロールが発生する問題は直りました。

outline: none/overflow:hidden seen here

When working with dialogs, setting this on the

when opening and removing it again when closing a dialog seemed to help.
訳:ダイアログ(モーダル)が開く時にこれ(outline:none と overflow: hidden)を<body>タグにセットして、閉じる時に削除してやれば、うまくいくっぽい。

異常にスクロールしまくるのが問題なら、そもそもスクロールしない状態にすればいいじゃないか、ということのようだ。

ただし、bodyがスクロールしなくなるってことは、
#Login要素も position:absoluteではなくて、position:fixedにしないといけないだろう。
モーダルがページの中程に出現する仕様ならば。

モーダル要素が画面より大きい場合

ところがモーダルの中身が多くて、どうしてもスクロールを発生させなければならない場合は、上記の方法は使えない。
そこで、モーダル展開時に以下のような処理を追加した。

if(window.navigator.userAgent.toLowerCase().indexOf('android 2') != -1){
   $("#mask").css({'position':'absolute','height':$('body').height()+'px'});
}

先の記事でも書かれているが、position:fixedが鬼門らしい。

所感

かなり以前にも同じバグにつまづいた経験があるが、
どう対処したのか忘れてしまっていたので、解決に戸惑った。
記事にしてしまうとかなりあっけないが、実際にこのおかげで数時間も足止めを食らった。

Android 2はいつまでシェアを食っているのだろうか。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7