knowledge base

マークアップ/フロントエンドエンジニアのWEB制作における備忘録です。平日はWEB屋、休日は社会人劇団の主宰・劇作家をしています。

iOS版Safariでフォーム入力時に自動ズームしてしまう

iOSSafariで入力フォームにフォーカスすると、勝手にズームすることがあります。

予告なくズームされるため、ユーザビリティを考慮すると、好ましくありません。

この現象に対する対策はいくつかあるため、ご紹介いたします。

font-sizeを大きく設定する

iOSSafariでは入力フォームの文字サイズが16px以下だと、自動でズームする機能があるようです。 そこで、フォームの文字サイズを16px以上になるように設定します。

input[type="text"]{
   font-size: 20px;
}

ただし、CSSによるzoomが指定されてページ自体が縮小表示されていたら効かない場合があります。

ユーザーによる拡縮を禁止する【非推奨】

meta要素でユーザによる拡縮を禁止すれば、自動ズームはなくなります。

<meta name="viewport" content="width=device-width, user-scalable=no">

しかし、こちらはかえってユーザビリティーを悪くしてしまうので推奨はできません。

フォーカス時のみmetaを書き換える【非推奨】

入力フォームにフォーカスしたときのみ、user-scalableの値を書き換えればユーザビリティを維持することはできます。

しかし端末によっては正常に動作しない場合があるので、自己責任のもとお使いください。

var $target   = $('input[type="text"]');
var $viewport = $('meta[name="viewport"]');
$target.on('focus',function(){
     $viewport.attr('content', 'width=device-width, user-scalable=yes');
}).on('blur',function(){
     $viewport.attr('content', 'width=device-width, user-scalable=no');
});

jQueryに頼らずにmetaを取得するなら、こんな感じでしょうか。

var viewport = {};
var metalist = document.getElementsByTagName('meta');
for(var i = 0; i < metalist.length; i++) {
    var name = metalist[i].getAttribute('name');
    if(name && name.toLowerCase() === 'viewport') {
        viewport = metalist[i];
        return;
    }
}