[HTML & CSS General] モバイルブラウザでピンチアウトすると position:fixed した要素がただよう

PC向けにデザインされたサイトをモバイルブラウザでも表示させるという条件ではまりました。

[markdown]
## 症状

モバイルブラウザでも同じデザインレイアウトで表示させたい。

* PC向けにデザインされた Fixed-Width レイアウト
* メインコンテンツの左右に固定配置要素

ナビゲーションやページタイトルといった要素が `position:fixed` されています。

> * [CSS基礎 positionプロパティ(absolute/relative/fixed/static)の使い方 | Stronghold](http://zxcvbnmnbvcxz.com/css_sutudy_3/)

モバイル用のデザインはありません。
ユーザーの使い勝手を考えると、横幅を指定して表示し、ピンチイン/ピンチアウトによるスケールの変更を許可する必要がありそうです。

“`html

“`

> * [ビューポートを設定する – PageSpeed Insights — Google Developers](https://developers.google.com/speed/docs/insights/ConfigureViewport?hl=ja)
> * [スマートフォンサイトでのViewport設定 – 新世代Web制作テクニック総特集 – MdN Design Interactive](http://www.mdn.co.jp/di/articles/2742/?page=10)

この状況で、モバイルブラウザでピンチアウトすると position:fixed した要素がただようように表示され、拡大して読みたいメインコンテンツの邪魔をします。

## 調査

調査をすると モバイルブラウザで `position:fixed` を利用するのはいろいろとリスクがあることが分かりました。

### 全般

いわゆるスマホサイトの制作について。
今回の件とは直接関係しませんが色々あることが分かりました。

> * [iPhone/iPadサイト制作でハマらないために](https://dl.dropboxusercontent.com/u/268240/presentations/lp13/index.html)

(スライド 38-44) [CSS Nite LP, Disk 13](http://cssnite.jp/archives/post_2096.html) の講演スライド。iOS の話。

スマートフォンブラウザ不具合特集 from Hiroaki Wakamatsu

(スライド 28-32) [CSS Nite in OSAKA, Vol.29](http://osaka.cssnite.jp/event/vol29/20120430.html) の講演スライド。Android の話が主。

スマートフォンサイト制作 よくあるトラブルと 解決方法・回避方法 from Maboroshi.inc

(スライド 52-53)

> * [Fixed Positioning in Mobile Browsers | Brad Frost Web](http://bradfrostweb.com/blog/mobile/fixed-position/)

### 補足

Android 2.x 系では、position: fixed を使う場合、viewport user-scalable=no の指定が必須とのこと。

> * [スマートフォンとposition:fixedのバグ – to-R](http://blog.webcreativepark.net/2011/12/07-052517.html)

Android 2.x 系のシェアは、約14%(2014/07 現在)。

> * [Dashboards | Android Developers](http://developer.android.com/about/dashboards/index.html)

また、何かの際にはこちらのまとめが役立ちそうです。

> * [AndroidやiPhoneのHTML,CSS,JavaScriptのバグまとめ – to-R](http://blog.webcreativepark.net/2012/03/13-093853.html)

### 今回のケース

いろいろ探し回って、こちらで救われました。

> * [iOSにおけるviewportの指定方法による細かい違い – to-R](http://blog.webcreativepark.net/2013/10/11-155237.html)
>
> ピンチインピンチアウトやダブルタップにより画面が拡大された場合、SPモードではposition:fixedの指定がposition:staticの状態に変更されますが、PCモードではposition:fixedの状態が保たれます。これによりPCモードでは拡大した際にposition:fixedを指定した要素が画面内に常にいるようになり結構邪魔になりますので、PCモードを利用する場合はposition:fixedは利用しないほうがよいでしょう。

viewport の設定との両立で困ったわけですが、width 設定によって振るまいが変わるとのこと。

## 対応

今回のケースを解決するためには、JavaScript で position:fixed を指定したクラスを外すような処理が良さそうです。
CSS クラスに下記を用意し、固定したい要素に指定しておき、

“`css
.fixed {
position: fixed;
}
“`

jQuery でピンチアウトを検出して、`.fixed` クラスを外します。

> * [gestureend | Event – JavaScript リファレンス](http://www.webcreativepark.net/javascript/event/gestureend/)

“`javascript
/*
モバイル端末でピンチ時に position: fixed を外す
*/
$(“body”).on(“gestureend”, function(){
‘use strict’;
$(‘#nav-fixed’).removeClass(‘fixed’);
$(‘#page-title-fixed’).removeClass(‘fixed’);
});
“`

但し、`gestureend` が iOS のみで有効らしく、Android でどのように実装するのかは別途調査が必要そうです。
Android 端末を手に入れてからまた調べます。
[/markdown]