📱
【Flutter】アクセシビリティを考慮したボタン
動作確認環境
Flutter 2.2.3 • channel stable • https://github.com/flutter/flutter.git
Framework • revision f4abaa0735 (5 weeks ago) • 2021-07-01 12:46:11 -0700
Engine • revision 241c87ad80
Tools • Dart 2.13.4
考慮するアクセシビリティ
以下を考慮したボタンにする
- ターゲット(ボタン)のサイズが 44 × 44 ピクセル以上である。
- ユーザーがタップしやすい最低サイズと言われる44pxサイズ以上の確保。参照:WCAG 2.1 解説書
- 端末のアクセシビリティによるテキストサイズの変化に追従して適切に画面内に収める
- テキストサイズを大きくしても、画面からはみ出さないこと
結論
- Buttonの
style
指定でminimumSize
を44pxにする - 48px未満にならないButtonを縮めるために
tapTargetSize
にMaterialTapTargetSize.shrinkWrap
を指定する
OutlinedButton(
style: OutlinedButton.styleFrom(
minimumSize: const Size(44.0, 44.0),
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
),
onPressed: () {},
child: const Text(
'ボタン',
),
),
Buttonを44pxサイズにするための過程
アクセシビリティを考慮してデザインも、最低ラインの44pxで上がってくることも多々ある。
それをそのままFlutterで実装しようとすると、標準で48pxの高さになるため一手間必要になる。
素で実装したButton
OutlinedButton(
onPressed: () {},
child: const Text(
'ボタン',
),
),
その解決として、SizedBox
で囲うやりかたをすると固定サイズなる。
SizedBoxを使う
SizedBoxで囲って実装したButton
SizedBox(
height: 44,
child: OutlinedButton(
onPressed: () {},
child: const Text(
'ボタン',
),
),
),
しかし、2.
を満たせず、テキストがはみ出たボタンとなってしまう。
Buttonのstyleを使う
そこで、Buttonに対してstyle
を使って以下のように最低サイズを指定してやる。
Container
のconstraints
で最低サイズを指定してやることもできるが、tapTargetSize
の指定が必ず必要になるので、style
で指定してやる方がスマートな形になる。
style
に対してminimumSize
だけ指定しても、Buttonは48px未満のサイズにならないため、tapTargetSize
にMaterialTapTargetSize.shrinkWrap
を指定してやる。
最低サイズをstyle指定で行ったButton
OutlinedButton(
style: OutlinedButton.styleFrom(
minimumSize: const Size(44.0, 44.0),
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
),
onPressed: () {},
child: const Text(
'ボタン',
),
),
こうすることで、2.
の文字サイズを大きくした場合も、ボタン内にテキストが収まった形で表示される。
Discussion