なぜ「入力不可」をCSSで制御するのか? `:read-only` と `:read-write` が切り拓くモダンなUI開発
現場でコードをレビューしていると、たまに見かけるんですよ。「読み取り専用の入力フィールド」をスタイルするために、わざわざ `.is-readonly` みたいなクラスをJSで付与したり、`[readonly]` 属性セレクタを必死に叩いているコードを。
もちろんそれも間違いじゃない。でも、CSSにはもっとエレガントで、ブラウザの「状態」をネイティブに解釈する賢い方法がある。それが `:read-only` と `:read-write` です。今日は、この疑似クラスがいかに現場の「泥臭い実装」をスマートに変えてくれるか、その極意を伝授しましょう。
—
1. `:read-only` と `:read-write` の本質
この二つの疑似クラスは、単なる「属性の有無」を見ているわけではありません。ブラウザが「ユーザーが現在その要素に対して文字を入力できる状態にあるか」を判定する、いわば「インタラクティブな状態検知器」です。
- :read-write: ユーザーが編集可能な要素(`` や `
- :read-only: 上記以外。つまり、読み取り専用属性がついている、あるいはそもそも編集できない要素。
特筆すべきは、`contenteditable` 属性を持つ要素までカバーしている点です。クラス名での管理が不要になるため、DOMが汚れるのを嫌うミニマリストなエンジニアにはたまらないはずです。
—
2. なぜ今、あえてこれらを使うべきなのか
実務でこれらを使う最大の理由は「整合性」です。
CSSで `input[readonly]` と指定したとしても、将来的に `contenteditable` な要素を編集不可にしたくなった瞬間、そのスタイルは適用されなくなります。しかし、`:read-only` ならば、「ユーザーが編集できない」という状態そのものをフックしているため、マークアップがどうであれ、一貫したUIを担保できる。これがプロのCSS設計における「堅牢性」というやつです。
—
3. 実践:現場で使える「洗練されたフォーム」のコード例
言葉で説明するより、コードを見せたほうが早いでしょう。以下のサンプルは、モダンな管理画面でそのまま使えるレベルの設計にしています。
/ ベースとなる入力フィールドのスタイル /
.form-input {
padding: 10px;
border: 1px solid #ccc;
border-radius: 4px;
transition: all 0.2s ease;
}
/ 編集可能な状態:フォーカス時に少し強調 /
.form-input:read-write:focus {
outline: none;
border-color: #007bff;
box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.2);
}
/ 編集不可な状態:背景をグレーにして「触れない」ことを視覚的に伝える /
.form-input:read-only {
background-color: #f8f9fa;
border-color: #e9ecef;
color: #6c757d;
cursor: not-allowed; / ユーザーに触れないことをカーソルで示す /
}
/ 応用:contenteditable要素に対しても一貫したスタイルを適用 /
[contenteditable]:read-only {
border-style: dashed; / 編集不可なプレースホルダー的なUI /
opacity: 0.7;
}
このコードのポイント
1. `cursor: not-allowed`: これが重要です。エンジニアはコードのロジックばかり考えがちですが、ユーザーは「なぜ触れないのか」を直感的に知る必要があります。CSSで状態を制御するなら、カーソルまでセットで管理するのがプロの作法です。
2. フォーカス制御: `:read-write:focus` とすることで、読み取り専用の要素が誤ってフォーカスを受けても、不要なハイライトが出ないようにしています。
—
4. 現場でハマる「落とし穴」への警告
もちろん、魔法ではありません。注意点も共有しておきます。
- ブラウザサポート: 主要ブラウザはすべて対応していますが、Safariで `contenteditable` を制御する際には、たまにブラウザのレンダリングエンジン特有の挙動(フォーカスの当たり方など)にブレが出ることがあります。必ず実機(特にiOS)で確認を。
- 属性セレクタとの併用: まだレガシーなブラウザ対応が必須の環境であれば、`[readonly]` との併用も考慮してください。ただし、最近のモダンな現場であれば、基本的にはこの疑似クラスで十分です。
—
最後に:CSSは「状態」を書くもの
CSSを書くとき、多くの人が「見た目」を記述しようとします。でも、優秀なアーキテクトは「アプリケーションの状態」を記述する。
`:read-only` や `:read-write` を活用することは、HTMLという「構造」とCSSという「見た目」の間に、「状態」という新しい橋を架ける作業です。クラス名を大量に量産してDOMを汚す前に、まずはブラウザが持っているこの強力なセンサーを使い倒してみてください。
君たちの書くCSSが、より美しく、より論理的になることを期待しています。また次の現場でお会いしましょう。

コメント