CSSの「編集不可」を制する:`:read-only`擬似クラスの極意と現場のリアル
現場でバリバリとフォームを実装していると、必ず一度は頭を抱えるのが「編集不可なフィールドのUI」です。
`readonly`属性がついた``や、あるいは単なる`disabled`状態の要素。これらを「どう見せるか」は、UXの観点から非常に重要です。ユーザーに「これは変更できないんだ」と一目で伝えつつ、かつ無機質になりすぎないデザインを当てる。
今日は、CSSの少しニッチな、しかし知っておくと間違いなく重宝する`:read-only`擬似クラスについて、現場目線で深掘りしていこう。
—
`:read-only` とは何者か?
MDNの定義を引くまでもなく、`:read-only`は「ユーザーが(直接的な操作で)値を変更できない状態」にある要素をターゲットにする擬似クラスだ。
ここで注意してほしいのが、「`readonly`属性がついている要素」だけではないという点だ。実はブラウザのレンダリングエンジンは、以下のような要素を`:read-only`として判定している。
1. `` や `
つまり、CSS側で「こいつは触らせないぞ」というルールを定義する際、属性をいちいち気にする必要がなくなる。これが`:read-only`を使う最大のメリットだ。
—
現場で直面する「落とし穴」
多くのエンジニアが陥る罠が、「`:read-only`だけで全てが解決する」と思い込むことだ。実は、ブラウザによって`disabled`との扱いに微妙な揺れがある。
`disabled`属性がついた要素は、ブラウザのデフォルトスタイルで背景が薄いグレーになり、カーソルも`not-allowed`になることが多い。しかし、`readonly`属性の要素は、見た目は通常の入力欄と変わらないことがほとんどだ。
「readonlyなのに、見た目は入力できそうに見える」
これほどユーザーをイラつかせるUIはない。だからこそ、`:read-only`を使って「視覚的にガードを固める」必要があるんだ。
—
実践:コピペで使える「読み取り専用」のベストプラクティス
現場でそのまま使える、堅牢なスタイル定義のサンプルを用意した。単に色を変えるだけでなく、カーソルの制御やフォーカス時の挙動まで考慮するのがプロの仕事だ。
/
- 読み取り専用フィールドの基本スタイル
- ユーザーに「触れない」ことを直感的に伝える
/
input:read-only,
textarea:read-only {
/ 背景色を少し落とし、境界線を薄くして「非活性感」を出す /
background-color: #f8f9fa;
border: 1px solid #dee2e6;
color: #6c757d; / 文字色を少しグレーに /
/ ユーザーがクリックしても「変更できない」とわかるように /
cursor: not-allowed;
/ 枠線が太くならないように、フォーカス時の挙動も制御 /
outline: none;
}
/
- readonlyであってもフォーカスが入るケースがあるため、
- その際の挙動を明示的に殺す(アクセシビリティとの兼ね合いに注意)
/
input:read-only:focus {
box-shadow: none;
border-color: #dee2e6;
}
/
- ラベル側のデザインとも連動させると、よりUXが向上する
- 親要素にreadonlyクラスを付与する設計にしておくと便利
/
.form-group:has(input:read-only) {
opacity: 0.8;
}
—
なぜこの実装が良いのか?
1. `cursor: not-allowed`の付与: これがあるだけで、UIの信頼性が格段に上がる。ユーザーは「あ、これはクリックしても無駄なんだな」と瞬時に理解できる。
2. `outline`の制御: デフォルトのフォーカスリングが残っていると、「あれ?入力できるの?」とユーザーが混乱する。状態に合わせて適切に消す(あるいは薄くする)のが正解だ。
3. `:has()`セレクタとの組み合わせ: 最近のモダンブラウザ環境なら、親要素の`.form-group`まで制御して、全体を薄くグレーアウトさせる手法も非常に有効だ。
最後に:エンジニアとしての矜持
CSSは、ただの「見た目合わせのツール」ではない。ユーザーがシステムと対話するための「言語」だ。
`:read-only`を使うことは、単にコードを短くすること以上に、「この要素は今のステータスでは変更不可能である」というロジックをスタイルという形でユーザーに伝達する責任を負うことでもある。
明日からの実装で、もし`readonly`な入力欄を作ることがあれば、ぜひこの擬似クラスを思い出してほしい。その小さなこだわりが、アプリケーション全体の品質を数段引き上げることになるはずだ。
さて、コードを書いていこうか。君の書くCSSが、誰かにとっての「使いやすいUI」に繋がることを期待しているよ。

コメント