2020-1-20

フォームのdisableスタイルの個人的実装ベタープラクティス

雑な技術メモ

デモ

要約

  • disable 時の見た目は opacity で対応。
    • デザインもそのように作ってもらう必要はある。
  • フォームパーツのグループや、フォームパーツ以外にも disable な見た目にする必要がある場合は fieldset を使う

disable 時の見た目は opacity で対応。

フォームの disable 時の見た目は input 等のようなフォームパーツだけを気にすれば OK な話ではなく、デモのようにフォーム周辺のテキストに対しても気を使う必要がある。

disabled 時のスタイルとしては、大きく下の2パターンになるかと思う。

  • border-color, color を指定の色に変更
  • opacity で半透明に変更

「border-color, color を指定の色に変更」に関しては、非常に面倒な事になる場合があるので避けたほうがいい。

例えば、最初は disable になるパーツには黒色のテキストしかなく、disable な時には灰色にすればよかったとする。ただ運用の結果、黒以外の文字色(例えば赤)が入った場合に「赤色の文字も灰色にしていいのか?」という問題が発生する。
もちろん「赤色の場合はちょっと薄い赤色に」とかなると地獄。

「opacity で半透明に変更」でやっておけば、色のパターンが増えたとしてもルールとして破綻しないので問題は発生しない。

具体的なスタイル指定例

デモが全てだが、肝は以下の部分。

/* フォームパーツ単体でdisabled指定された場合のスタイル */
.c-radio_input:disabled,
.c-radio_input:disabled ~ *,
select:disabled {
  opacity: var(--disable-opacity);
}

/* fieldset単位でdisabled指定された場合のスタイル */
fieldset:disabled {
  opacity: var(--disable-opacity);
}

/* 二重でopacityがかからないように、打ち消す必要がある */
fieldset:disabled .c-radio_input:disabled,
fieldset:disabled .c-radio_input:disabled ~ *,
fieldset:disabled select:disabled {
  opacity: initial;
}

複数のフォームパーツのグループだったり、フォームパーツ以外にも disable 時に色を薄くする必要がある場合は fieldset を使用する。