Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
iOS・Androidの文字サイズ設定をWebViewに!モバイルUIのアクセシビリティ...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
おしん
May 09, 2026
Technology
140
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
iOS・Androidの文字サイズ設定をWebViewに!モバイルUIのアクセシビリティTips
フロントエンドカンファレンス名古屋 2026 でのLTで使用したスライドです。
おしん
May 09, 2026
More Decks by おしん
See All by おしん
モバイルアプリへのRemoteConfigの恩恵
shincarpediem
1
160
Swift UI デフォルト引数クイズ
shincarpediem
0
170
よりアプリらしさを出すために
shincarpediem
0
160
Concurrency Warningが 沢山出たから聞いてほしい ~Xcode 16.1 Beta 編~
shincarpediem
0
260
iOSのPhoto Libraryアクセス権限を見直してみよう
shincarpediem
0
270
SwiftUI登場前のVIPERアプリでもSwiftUIをスムーズに導入できた話
shincarpediem
2
1.9k
VIPERアプリにSwiftUIを導入してみた
shincarpediem
0
460
Other Decks in Technology
See All in Technology
新規事業を牽引する技術選定 〜フルスタックTypeScript開発の実践事例〜
nullnull
3
380
Rubyで音を視る
ydah
1
250
Agentic Web
dynamis
1
190
MCP Appsを作ってみよう
iwamot
PRO
4
310
Rancherの紹介&Update情報(RancherJP Online Meetup #09)
yoshiyuki_kono
0
140
個人最適 から 全体最適 へ AI情報共有会・AIギルド・AI-DLC で進める カンリーの組織展開
rfdnxbro
0
2k
スキルと MCP ツール、責務をどう分けるか? AI が迷わないインターフェース設計の戦略
cdataj
1
630
価格.comをAI駆動で全面刷新する ー 30年分の技術的負債を返し、次の30年の土台をつくる ー / AI Engineering Summit Tokyo 2026
tkyowa
52
58k
NAB Show 2026 動画技術関連レポート / NAB Show 2026 Report
cyberagentdevelopers
PRO
0
130
サイバーセキュリティ概論 / Introduction to Cybersecurity
ks91
PRO
0
170
AWSシリコン最前線 〜AI時代のチップ選択を読み解く〜
htokoyo
2
300
エンジニアリング戦略の作り方 / Crafting Engineering Strategy
iwashi86
16
5.2k
Featured
See All Featured
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Chasing Engaging Ingredients in Design
codingconduct
0
210
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
Ruling the World: When Life Gets Gamed
codingconduct
0
250
Designing for Timeless Needs
cassininazir
1
250
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
600
We Are The Robots
honzajavorek
0
240
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
380
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
280
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
Transcript
モバイルUIのアクセシビリティTips おしん / @38Punkd iOS ・Android の 文字サイズ設定を WebView に!
・株式会社スタメン ・iOSエンジニア ・アプリネイティブ × WebViewの ハイブリッドアプリ開発に携わってきました おしん / @38Punkd
WebView だけ、文字サイズが固定になっていませんか? アプリネイティブ画面 OS 設定に追従 iOSの Dynamic Type や Androidのフォ
ントスケールに合わせて読みやすくなる WebView 画面 標準サイズのまま ユーザーが選んだ文字サイズが Webコンテンツだけ反映されない (特にiOSで) Web とネイティブの境界にあるため、対応漏れが起きやすい
文字サイズ設定は「特別対応」ではない iOS Android Android 14 以降は 最大200%のフォントスケーリングをサポート (従来は最大130%) OSの標準機能 対応工数に対して、UX
改善のインパクトが大きい領 域 出典: https://medium.com/airbnb-engineering/supporting-dynamic-type-at-airbnb- b47c68b0c998 3 割 文字サイズ調整を有効化している スマホユーザー
iOS ネイティブ:実装のポイント ① Swift: Dynamic Type 変更を検知してフォントサイズを JS で注入 //
通知の登録 NotificationCenter.default.addObserver( self, selector: #selector(dynamicTypeDidChange), name: UIContentSizeCategory.didChangeNotification, object: nil ) @objc private func dynamicTypeDidChange() { applyFontSize() } func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { applyFontSize() // ページロード完了時にも適用 } private func applyFontSize() { let size = UIFont.preferredFont(forTextStyle: .body).pointSize webView?.evaluateJavaScript( "document.documentElement.style.fontSize = '\(size)px'", completionHandler: nil ) } 通知を受信したら Swift 側で body サイズを取得し evaluateJavaScript で :root の font-size を書き換える
iOS WebView :実装のポイント ② CSS: font-size はrem 単位で指定 :root {
font-size: 17px; /* フォールバック */ } .title { font-size: 1.143rem; } /* ✅ スケー ルする */ .description { font-size: 0.857rem; } /* ✅ スケー ルする */ .bad-title { font-size: 16px; } /* ❌ スケール しない */ Swift が :root の font-size を書き換えるので rem 指定の要素がすべて連動してスケールする
参考:より楽な代替案 -apple-system-body を指定し、通知受信時に webView.reload() を呼ぶだけでも同様の効果が得られます /* CSS: 指定するだけでよい */ :root,
body { font: -apple-system-body; } // Swift: リロードで CSS を再評価 @objc private func dynamicTypeDidChange() { webView?.reload() } 比較 JS 注入(推奨) -apple-system-body (代替案) 反映速度 即時反映(シームレス) リロードが発生する カスタマイズ性 高い(上限キャップ等が可能) Appleのスケールに固定される 実装コスト 小(JS連携が必要) 極小(非常にシンプル)
Android :「対応できている風」に注意 文字が大きく見えても、実態は 文字だけのスケーリングではなく、Activity再生成とWebView全体ズームに 依存している場合があります 見た目 文字サイズ設定に追従しているように見える 実態 Activity 再生成でWebViewが作り直される
副作用 文字だけでなく画像・余白もズームされ得る リスク スクロール位置や入力中の状態が失われる可能性 がある → WebView WebView
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 内のテキスト全体をスケールさせる
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 の変更は不要
iOS ・Android 実装仕様の比較 項目 iOS Android スケール変化の検知 UIContentSizeCategory .didChangeNotification onConfigurationChanged
(fontScale) WebView への適用 スケールする単位 px・em・rem・% すべてスケールされる スケールしない単位/ 要素 px 幅・高さ・余白など 非テキスト要素 document.documentElement.style.fontSize WebSettings.setTextZoom(int) ・rem・% em
サンプルコード iOS https://github.com/shin- carpediem/DynamicTypeWebViewDemo Android https://github.com/shin- carpediem/AndroidDynamicTypeWebViewDemo