Upgrade to Pro — share decks privately, control downloads, hide ads and more …

iOS・Androidの文字サイズ設定をWebViewに!モバイルUIのアクセシビリティ...

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 iOS・Androidの文字サイズ設定をWebViewに!モバイルUIのアクセシビリティTips

フロントエンドカンファレンス名古屋 2026 でのLTで使用したスライドです。

Avatar for おしん

おしん

May 07, 2026

More Decks by おしん

Other Decks in Technology

Transcript

  1. WebView だけ、文字サイズが固定になっていませんか? アプリネイティブ画面 OS 設定に追従 iOSの Dynamic Type や Androidのフォ

    ントスケールに合わせて読みやすくなる WebView 画面 標準サイズのまま ユーザーが選んだ文字サイズが Webコンテンツだけ反映されない (特にiOSで) Web とネイティブの境界にあるため、対応漏れが起きやすい
  2. 文字サイズ設定は「特別対応」ではない iOS Android Android 14 以降は 最大200%のフォントスケーリングをサポート (従来は最大130%) OSの標準機能 対応工数に対して、UX

    改善のインパクトが大きい領 域 出典: https://medium.com/airbnb-engineering/supporting-dynamic-type-at-airbnb- b47c68b0c998 3 割 文字サイズ調整を有効化している スマホユーザー
  3. iOS WebView :実装のポイント ① CSS: body に-apple-system-body を指定 body {

    font: -apple-system-body; /* iOS WebKit がサイズを 反映 */ } ② CSS: font-size は em 単位で指定 .title { font-size: 1.143em; } /* ✅ スケール する */ .description { font-size: 0.857em; } /* ✅ スケール する */ .bad-title { font-size: 16px; } /* ❌ 固定値 */ px 固定ではなく em を使うことで body のサイズ変化に追従 これだけで iOS WebKit が Dynamic Type の設定値を body のフォントサイズに反映
  4. iOS ネイティブ:WebView リロード ③ Swift: Dynamic Type 変更を検知して WebView をリロード

    NotificationCenter.default.addObserver( self, selector: #selector(dynamicTypeDidChange), name: UIContentSizeCategory.didChangeNotification, object: nil ) @objc private func dynamicTypeDidChange() { webView?.reload() // リロード後、CSS が新しいサイズで再評価される } UIContentSizeCategory.didChangeNotification を 受信したら WebView をリロードし CSSを再評価
  5. Android ネイティブ:実装のポイント ① AndroidManifest: fontScale をconfigChanges に追加 <activity android:configChanges="fontScale|uiMode|density" ...

    > Activity を再生成せず onConfigurationChanged で フォントスケール変化を受け取れるようにする ② Kotlin: WebSettings.setTextZoom(int) で反映 // 初期化 applyFontScale(resources.configuration.fontScale) override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) applyFontScale(newConfig.fontScale) } private fun applyFontScale(fontScale: Float) { webView.settings.textZoom = (fontScale * 100).roundToInt() } fontScale を検知し WebView 内のテキスト全体をスケールさせる
  6. Android WebView :テキストは単位を問わずスケールされる ③ CSS:WebSettings.setTextZoom(int) の挙動 /* ✅ px 固定でも

    setTextZoom でスケールされる */ .title { font-size: 16px; } /* ✅ em 相対でも同様にスケールされる */ .description { font-size: 0.75em; } /* ✅ rem 相対でも同様にスケールされる */ .caption { font-size: 0.75rem; } /* ⚠ テキスト以外(幅・高さ・余白)は変化しない */ .icon { width: 48px; height: 48px; } /* → スケールされない */ WebSettings.setTextZoom(int) は レンダリングエンジンレベルで適用されるため HTML/JS の変更は不要
  7. iOS ・Android 実装仕様の比較 項目 iOS Android スケール変化の検知 UIContentSizeCategory .didChangeNotification onConfigurationChanged

    ( fontScale ) WebView への適用 CSS font: -apple-system-body WebSettings.setTextZoom(int) スケールする単位 em px ・ em ・ rem すべてスケールされる スケールしない単位/ 要素 px 固定・ rem (ルート基準のため) 幅・高さ・余白など 非テキスト要素