FormControl

単一の入力要素にラベル、ヘルプ/エラー/補足のメッセージテキスト、入力必須か否かを紐づけるためのコンポーネントです。1つの入力欄にラベル付けするとき、入力欄にエラーや補足メッセージを表示するときに使います。

使用上の注意

入力要素が1つの場合にのみ使用する

FormControlは、入力要素が1つだけの場合にのみ使用できます。

姓名のように値を分割して入力する場合や、CheckboxやRadioButtonといった複数の入力要素を持つフォームに対してラベルやメッセージテキストを表示したい場合は、Fieldsetを使用してください。

複数のフォームを横に並べる場合

入力要素をグルーピングできる場合は、基本的にFieldsetを使用してください。エラーが表示された際のレイアウト崩れを防ぐことができます。(エラーの表示方法

表示領域の都合などでやむを得ずFormControlを横に並べる場合は、エラーの表示時にレイアウトが崩れないか注意してください。

Do
Do
Fieldsetを使うとエラー表示時にレイアウトが崩れません。
FormControlを横に並べただけだと、エラー表示時にInputの位置がずれる例
Don't
単にFormControlを横に並べると、エラー表示時にInputの位置がずれます。

レイアウト

ステータスラベルやメッセージテキストの有無で、コンポーネント内のレイアウトにバリエーションがあります。

ステータスラベルの有無

フォーム入力が入力必須か任意かをユーザーが区別できるようにするために使用します。 代表的なステータスラベルは次のとおりです。

種類表示例説明
必須必須入力必須のフォームの場合に表示します。
任意任意任意のフォームの場合に表示します。

フォーム入力が必須の場合の表示例

フォーム入力が任意の場合の表示例

ステータスラベルの省略

ステータスラベルは視覚的に強い注意を惹くことから、認知負荷を減らすために省略する場合があります。 具体的には、以下のケースには省略を検討してください。

必須を省略するケース
  • フォーム入力が極めて少なく、すべて必須であることが自明な場合
  • 任意のフォームよりも入力必須のフォームが多い場合
ステータスラベル自体を省略するケース
  • フォームの説明文などで、すべての項目が必須、または任意であることが明記されている場合

メッセージテキストの有無

以下の種類別のメッセージテキストを目的に応じて組み合わせて使用できます。

種類Props説明
ヘルプメッセージhelpMessage入力して欲しい内容を具体的に伝えるテキストを入力要素の上に表示します。必要に応じて関連するヘルプページなどへのテキストリンクを設置できます。テキストリンクの詳細はヘルプページへの動線を参照してください。
入力例exampleMessageフォームの入力例を入力要素の上に表示します。原則として入力要素のplaceholderはユーザビリティおよびアクセシビリティの観点から非推奨としているため、その代替として使用してください。
エラーメッセージerrorMessagesフォームバリデーションなどで、適切な値が入力されていないことを伝えるテキストを、エラーメッセージ アイコン(FaCircleExclamation)とあわせて入力要素の上に表示します。
補足メッセージsupplementaryMessage入力時にユーザーが把握しなくても操作に影響のない情報を入力要素の下に表示します。

メッセージテキストの表示例

エラーメッセージ

エラーメッセージは、入力必須の入力要素の値が空の場合や、データ型が異なるなどの適切な値が入力されていない場合に表示します。

どの入力要素がエラーとなっているかを視覚的に見つけやすくするために、入力要素にもerror状態を付加します。

同一画面上でエラーをリアルタイムに判定できる場合は、エラーの原因が解消されたらメッセージの表示を止めます。

初期状態の場合
適切な値が入力されていない場合

状態

無効(disabled)

フォームの操作ができない状態を表現する際は、Inputなど内包する要素のdisabledを使用してください。

ユーザーはなぜ無効になっているのかわからないことがあります。権限による表示制御のデザインパターンを参考にして、そもそも無効ではなくフォーム自体を非表示にしたり、無効状態の理由を付近に表示することを検討してください。

読み取り専用

入力内容の確認時など、すでに入力済みの書き換えできない値として表示する際は、Inputなど内包する要素のreadOnlyを使用してください。

アクセシビリティ

基本的なアクセシビリティ機能

ラベルと入力要素を関連づける

FormControlコンポーネントは、label propsで指定したテキストを入力要素と関連づけます。 これにより、スクリーンリーダーを使用するユーザーにも、何を入力するための項目なのかが伝わります。

エラーメッセージを関連づける

errorMessages propsを設定すると、エラーメッセージが入力要素と関連づけられます。 これにより、スクリーンリーダーを使用するユーザーにも、エラーの発生とその内容が伝わります。

補足情報を関連づける

helpMessagesupplementaryMessage を設定すると、それらの情報が入力要素と関連づけられます。 これにより、スクリーンリーダーを使用するユーザーにも、入力時に参照できる補足情報として伝わります。

開発時の考慮点

入力要素と組み合わせて利用する

入力要素を使用する場合は、FormControlコンポーネントを利用してラベルを設定してください。 これにより、ラベルと入力要素が関連づけられ、何を入力または選択するための項目なのかが支援技術にも伝わります。

eslint-plugin-smarthrのsmarthr/a11y-input-in-form-control別タブで開くルールは、入力要素にFormControlを組み合わせることを促すものです。支援技術に入力の目的が伝わらないリスクを防ぐため、有効にして使用することを推奨します。

関連ページ

使い方チェックリスト

FormControl
参照元:使用上の注意 > 入力要素が1つの場合にのみ使用する 「使用上の注意 > 入力要素が1つの場合にのみ使用する」の本文へ移動
  • Must
    FormControl は入力要素が 1 つだけの場合にのみ使用する
  • Must
    値を分割して入力する場合や Checkbox / RadioButton など複数の入力要素を持つフォームに対してラベルやメッセージテキストを表示したい場合は Fieldset を使用する
参照元:使用上の注意 > 入力要素が1つの場合にのみ使用する > 複数のフォームを横に並べる場合 「使用上の注意 > 入力要素が1つの場合にのみ使用する > 複数のフォームを横に並べる場合」の本文へ移動
  • Must
    やむを得ず FormControl を横に並べる場合はエラー表示時にレイアウトが崩れないか注意する
  • Should
    入力要素をグルーピングできる場合は基本的に Fieldset を使用する
参照元:レイアウト > ステータスラベルの有無 「レイアウト > ステータスラベルの有無」の本文へ移動
  • Should
    フォーム入力が必須か任意かをユーザーが区別できるようにステータスラベルを使用する
参照元:レイアウト > ステータスラベルの有無 > ステータスラベルの省略 > 必須を省略するケース 「レイアウト > ステータスラベルの有無 > ステータスラベルの省略 > 必須を省略するケース」の本文へ移動
  • Should
    認知負荷を減らすために必須ステータスラベルの省略を検討する
    • フォーム入力が極めて少なく、すべて必須であることが自明な場合
    • 任意のフォームよりも入力必須のフォームが多い場合
参照元:レイアウト > ステータスラベルの有無 > ステータスラベルの省略 > ステータスラベル自体を省略するケース 「レイアウト > ステータスラベルの有無 > ステータスラベルの省略 > ステータスラベル自体を省略するケース」の本文へ移動
  • Should
    フォームの説明文などですべての項目が必須または任意であることが明記されている場合は、ステータスラベル自体の省略を検討する
参照元:レイアウト > メッセージテキストの有無 「レイアウト > メッセージテキストの有無」の本文へ移動
  • Must
    入力要素の `placeholder` の代替として、入力例は `exampleMessage` を使用する
参照元:レイアウト > メッセージテキストの有無 > エラーメッセージ 「レイアウト > メッセージテキストの有無 > エラーメッセージ」の本文へ移動
  • Must
    エラーメッセージは入力必須の入力要素の値が空、またはデータ型が異なるなど適切な値が入力されていない場合に表示する
  • Must
    どの入力要素がエラーかを視覚的に見つけやすくするため、入力要素にも `error` 状態を付加する
  • Must
    同一画面上でエラーをリアルタイムに判定できる場合は、エラーの原因が解消されたらメッセージの表示を止める
参照元:状態 > 無効(disabled) 「状態 > 無効(disabled)」の本文へ移動
  • Must
    フォームの操作ができない状態を表現する際は、Input など内包する要素の `disabled` を使用する
    • そもそも無効ではなくフォーム自体を非表示にしたり、無効状態の理由を付近に表示することを検討する
参照元:状態 > 読み取り専用 「状態 > 読み取り専用」の本文へ移動
  • Must
    入力内容の確認時など、すでに入力済みの書き換えできない値として表示する際は、Input など内包する要素の `readOnly` を使用する

Props

label必須
string number false true ReactElement<any, string | JSXElementConstructor<any>> Iterable<ReactNode> ReactPortal { text: ReactNode; styleType?: TextProps; icon?: any; unrecommendedHide?: boolean; htmlFor?: string; id?: string; }

グループのラベル名

subActionArea
string number false true ReactElement<any, string | JSXElementConstructor<any>> Iterable<ReactNode> ReactPortal

タイトル右の領域

innerMargin
0 1 2 0.25 0.5 0.75 1.25 1.5 2.5 3 3.5 4 8 -0.25 -0.5 -0.75 -1 -1.25 -1.5 -2 -2.5 -3 -3.5 -4 -8 "X3S" "XXS" "XS" "S" "M" "L" "XL" "XXL" "X3L"

タイトル群と子要素の間の間隔調整用(基本的には不要)

statusLabels
FunctionComponentElement<any> FunctionComponentElement<any>[]

タイトルの隣に表示する StatusLabel の配列

helpMessage
string number false true ReactElement<any, string | JSXElementConstructor<any>> Iterable<ReactNode> ReactPortal

タイトルの下に表示するヘルプメッセージ

exampleMessage
string number false true ReactElement<any, string | JSXElementConstructor<any>> Iterable<ReactNode> ReactPortal

タイトルの下に表示する入力例

errorMessages
string number false true ReactElement<any, string | JSXElementConstructor<any>> Iterable<ReactNode> ReactPortal ReactNode[]

タイトルの下に表示するエラーメッセージ

autoBindErrorInput
false true

エラーがある場合に自動的に入力要素を error にするかどうか

supplementaryMessage
string number false true ReactElement<any, string | JSXElementConstructor<any>> Iterable<ReactNode> ReactPortal

フォームコントロールの下に表示する補足メッセージ