iOS Safariでボタン連打時に拡大される問題の対処法

Web開発

iOS Safariでボタン連打時に拡大される問題の対処法

なぜ拡大されるのか?

iOS Safariには「ダブルタップで拡大(Smart Zoom)」という仕様があるんだ。

ボタンを連続で押すと、この仕様に引っかかって勝手に拡大されてしまう。

読者
読者

え、それってユーザーからしたらただの連打なのに!?

そう、その通り。だから開発者側で制御してやらないと、UIが壊れて見えるんだよ。

ごりら
ごりら

まずはCSSで抑止するのが一番シンプルだ!

対策1: CSSでダブルタップ拡大を抑止

iOS 13.4以降なら touch-action: manipulation; を指定するだけでOK。

これでピンチズームは残しつつ、ダブルタップ拡大を防げる。

読者
読者

おお、CSS一行で済むなら手軽だね!

/* 連打される要素に指定 */
button, a[role="button"], .btn {
  touch-action: manipulation;
}

Tailwindならこんな感じ。

ごりら
ごりら

<button class="touch-manipulation">保存</button> って書けばOK。 [/gorilla> 対策2: 入力フォーカス時の拡大を防ぐ iOSはフォントサイズが16px未満の入力要素をタップすると自動で拡大する。 だからフォーム要素は必ず16px以上に設定しよう。 [reader] あー、よくフォームで変に拡大されるのってそれか! [/reader] input, select, textarea, button { font-size: 16px; } 対策3: ビューポートの基本設定 メタタグで基本的なviewportを指定しておくと、挙動が安定する。 [gorilla] <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> を入れておこう。

対策4: ズーム自体を禁止する(最終手段)

どうしても解決しない場合は、ズーム自体を禁止できる。

ただしアクセシビリティ的に推奨はできない方法。

読者
読者

拡大が必要な人もいるし、これは最後の手段だね。

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">

対策5: 古いiOS向けフォールバック

古いSafariでCSSが効かない場合は、JSでダブルタップを検知して自前で制御する。

ごりら
ごりら

対象範囲は絞らないと副作用が大きいぞ。

(function () {
  let last = 0;
  const container = document.body;
  container.addEventListener('touchend', function (e) {
    const now = Date.now();
    if (now - last < 350) {
      const btn = e.target.closest('button, [role="button"], a');
      if (btn) btn.click();
      e.preventDefault();
    }
    last = now;
  }, { passive: false });
})();

まとめ

まずは touch-action: manipulation; を試すのがベスト。

次にフォントサイズやviewport設定を確認して、それでもダメならJSフォールバック。

ズーム禁止は最後の手段として考えよう。

ごりら
ごりら

チェックリスト! touch-action → フォントサイズ16px以上 → viewport設定 → JSフォールバック → 最後にズーム禁止!

コメント

タイトルとURLをコピーしました