モバイルWebの5つの小さな不具合(とその修正方法)
あらゆるブレークポイントでレイアウトをテストし、レスポンシブグリッドはきれいに見え、Chrome DevToolsではすべて正常に動作しています。しかし、実際のスマートフォンでサイトを開くと、何かが微妙に、頑固におかしい。これがモバイルWebの小さな不具合(papercuts)です — ページを壊すことはないものの、静かにユーザー体験を低下させる小さなバグです。
ここでは、実際のプロジェクトで繰り返し現れる5つの不具合と、それぞれの最新の修正方法を紹介します。
重要なポイント
100vhはダイナミックUIクロームを持つモバイルブラウザでオーバーフローします。安定したデフォルトとして100svhを使用するか、ブラウザクロームの表示・非表示に合わせてレイアウトをリサイズする場合は100dvhを使用してください。- 下部固定要素はデバイスのセーフエリアによって隠れる可能性があります。
viewport-fit=coverを追加し、env(safe-area-inset-bottom)を使用して要素を表示し続けてください。 - iOS Safariは16px未満のフォントサイズの入力欄で自動ズームします。ユーザーズームを無効にするのではなく、すべてのフォームフィールドに
font-size: 16px以上を設定してください。 - スクロールチェーンによりモーダルからスクロールイベントが漏れ出します。スクロール可能なコンテナに
overscroll-behavior: containを適用してください — JavaScriptは不要です。 - 小さすぎるタップターゲットはタップの失敗や誤操作を引き起こします。パディングを使用してヒットエリアを拡大し、約44×44pxのタッチターゲットを目指してください。
1. 100vhによるフルハイトレイアウトの崩れ
症状: iOS Safariでフルスクリーンのヒーローセクションやモーダルが少し高すぎて、コンテンツが切り取られたりスクロールバーが表示されたりします。
原因: 100vhはビューポート全体の高さに対して計算され、ブラウザのダイナミックUIクローム(アドレスバーとナビゲーションコントロール)を無視します。これらの要素が表示されているとき、100vhはオーバーフローします。
修正方法: 新しいCSSビューポート単位を使用します。ほとんどのフルハイトレイアウトでは、100svh(small viewport height)がブラウザUIが表示されている状態での表示領域を表すため、安定した選択肢です。ブラウザクロームの表示・非表示に合わせてレイアウトを動的にリサイズしたい場合は100dvhを使用してください。これらの単位の最新ブラウザサポートは広く利用可能で、https://webstatus.dev/features/viewport-unit-variantsで確認できます。
.hero {
height: 100svh; /* stable default */
}
2. デバイスのセーフエリアに隠れる下部固定UI
症状: スティッキーフッター、ボトムナビゲーションバー、またはアクションボタンが、iPhoneのホームインジケーターや他のデバイスのセーフエリアによって部分的に隠れてしまいます。
原因: bottom: 0で配置された固定要素は、デバイスのセーフエリアではなく、ビューポートの端にぴったり配置されます。ホームインジケーターや角丸を持つデバイスでは、システムUIが要素と重なる可能性があります。
修正方法: metaビューポートタグにviewport-fit=coverを追加し、env(safe-area-inset-bottom)などのCSSセーフエリア環境変数を使用して要素を上に押し上げます。
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
.bottom-nav {
padding-bottom: env(safe-area-inset-bottom);
}
3. iOSでフォーム入力欄がズームされる
症状: iOS Safariで<input>をタップすると、ページが予期せずズームインし、レイアウトが崩れます。
原因: iOS Safariは、入力欄のフォントサイズが16px未満の場合、可読性補助として自動的にズームします。
修正方法: すべての入力欄にfont-size: 16px(またはそれ以上)を設定します。user-scalable=noでズームを無効にしないでください — これはアクセシビリティを損ないます。ついでに、inputmodeで適切なキーボードをリクエストし、autocompleteで入力の手間を減らし、enterkeyhintでリターンキーにラベルを付けましょう。
<input
type="email"
inputmode="email"
autocomplete="email"
enterkeyhint="done"
style="font-size: 16px;"
/>
Discover how at OpenReplay.com.
4. モーダルやドロワーからスクロールが漏れ出す
症状: ユーザーがモーダルやボトムシート内でスクロールして端に達すると、背後のページもスクロールし始めます。
原因: これはスクロールチェーンです — 子スクロールコンテナが境界に達したとき、ブラウザがスクロールイベントを親に伝播させます。
修正方法: スクロール可能なコンテナにoverscroll-behavior: containを適用します。最新ブラウザのサポートは広範で、Safari 16以降を含みます。詳細はhttps://webstatus.dev/features/overscroll-behaviorで確認できます。
.modal-body {
overflow-y: auto;
overscroll-behavior: contain;
}
5. タップターゲットの反応が悪い、または間違った要素が反応する
症状: ボタンの反応が鈍く感じられたり、タップが間違った要素に登録されたりします — 特にナビゲーションメニューやリストなどの密集したUIで顕著です。
原因: 小さすぎるタッチターゲットは、ヒットテストの曖昧さを生み出します。最新ブラウザは(ビューポートmetaタグが正しければ)歴史的な300msの遅延なしでタップイベントを処理しますが、小さすぎるターゲットは依然としてタップの失敗や誤操作を引き起こします。
修正方法: WCAGターゲットサイズ推奨の約44×44 CSSピクセル程度のタッチターゲットを目指してください。レイアウトに影響を与えずにヒットエリアを拡大するには、マージンではなくパディングを使用します。
.nav-link {
min-height: 44px;
min-width: 44px;
display: flex;
align-items: center;
padding: 0 12px;
}
まとめ
これらのモバイルWebの小さな不具合が単独で現れることはほとんどありません — 切り取られるレイアウト、隠れるボタン、ズームするフォーム。それぞれは単独では軽微ですが、まとめて見ると、実機でテストされていないサイトであることを示すサインとなります。最新のCSSは、これらすべてに対処するためのクリーンで標準ベースのツールを提供します。これらの修正を一度適用すれば、ブラウザが進化しても機能し続けます。
よくある質問
はい。small、large、dynamicビューポート単位(svh、lvh、dvh)は、iOS 15.4以降のSafari、Chrome、Edge、Firefoxを含むすべての最新ブラウザでサポートされています。古いブラウザ向けには、svhまたはdvhルールの前にheight: 100vhを宣言することでフォールバックを提供できます。ブラウザは認識できない単位を無視し、フォールバックを使用します。
はい、Safari 16以降で動作します。iOS Safariの古いバージョンでは、overscroll-behaviorは効果がなく、スクロールチェーンは依然として発生します。これらの古いバージョンをサポートする必要がある場合、モーダルが開いている間にbodyのtouchmoveを防ぐJavaScriptベースのアプローチが最も信頼性の高いフォールバックです。
ユーザースケーリングを無効にすると、ピンチズーム機能が削除され、これは低視力のユーザーにとって重要なアクセシビリティ機能です。また、WCAG達成基準1.4.4に違反します。正しい修正方法は、入力欄のフォントサイズを16px以上に設定することで、必要とするユーザーのズームを制限することなく自動ズームを防ぎます。
画面の端近くに配置される要素のみがセーフエリアインセットを必要とします。下部固定のナビゲーションバーや下端近くのフローティングアクションボタンは、env(safe-area-inset-bottom)の恩恵を受けます。画面の端から離れて配置されている要素やビューポートの中央に配置されている要素は、一般的に必要ありません。常にホームインジケーターやノッチを持つデバイスでテストして確認してください。
Truly understand users experience
See every user interaction, feel every frustration and track all hesitations with OpenReplay — the open-source digital experience platform. It can be self-hosted in minutes, giving you complete control over your customer data. . Check our GitHub repo and join the thousands of developers in our community..