こんにちは!日々Webのコードと向き合っている皆さん、今日もお疲れ様です。CSSの世界へようこそ!
Webサイトを作っていると、お問い合わせフォームやマイページなど「ユーザーに文字を入力してもらう場所」を作る機会がよくありますよね。そのとき、こんな経験はありませんか?
「この入力欄は自由に書き換えてほしいけれど、こっちの会員ID欄は書き換えられたくないな…」
「でも、デザインで『ここは書き込めませんよ』ってパッと見で伝わらないと、ユーザーが混乱しちゃうかも…」
大丈夫、心配いりません!CSSには、その要素が「今、書き込める状態か? それとも読むだけ(編集不可)の状態か?」を賢く見分けて、自動でデザインを変えてくれる魔法の疑似クラスを用意してくれています。
それが、今回ご紹介する `:read-write` と `:read-only` です。
一見すると難しそうな英語ですが、仕組みさえ分かれば「なんだ、こんなに便利だったんだ!」と膝を打つこと間違いなしです。初心者の方でもスッと頭に入るように、身近な例えを交えながら優しく紐解いていきましょう!
—
1. 例え話でイメージしよう!「ノート」と「額縁」
まずは、難しいコードのことは一度忘れて、身の回りの道具でイメージしてみましょう。
例えば、目の前に2つのアイテムがあるとします。
1. 自由になんでも書ける「新品のノート」
2. 大切な写真が入っていてガラスで覆われた「額縁(がくぶち)」
ノートは、ペンを持っていればいつでも文字を書いたり消したりできますよね。
これが `:read-write`(読み・書きOK) の状態です。
一方、額縁はどうでしょう? 中に入っている文字や写真を「読む(見る)」ことはできますが、ガラスの上から直接ペンで文字を書き換えることはできませんよね。
これが `:read-only`(読むことだけOK / 編集不可) の状態です。
ネットショッピングの画面を思い出してみてください。
- 「お届け先住所の入力欄」= 書き込める(ノート= `:read-write`)
- 「変更できない注文番号や合計金額」= 読むだけ(額縁= `:read-only`)
CSSの `:read-write` と `:read-only` は、「君はノートかな? 額縁かな?」とブラウザが判定して、それぞれに合ったステキな見た目(スタイル)を自動で着せ替えさせてくれる仕組みなんです。
—
2. それぞれの疑似クラスを詳しく見てみよう
それでは、具体的にCSSでどう使うのかを順番に見ていきましょう!
① `:read-write` —— 「ここは書き込めますよ!」のサイン
ユーザーが自由に入力・編集できる要素に反応します。
- 対象になるもの:
- 通常の入力欄(`` や `
- JavaScriptなどで編集可能に指定された要素(`contenteditable` 属性がついたHTML要素)
/ ユーザーが書き込める場所のデザイン /
input:read-write {
background-color: #ffffff; / 清潔感のある真っ白な背景 /
border: 2px solid #4a90e2; / 入力できることが分かりやすい青い枠線 /
}
「ここは書ける場所だよ!」と伝えるために、背景を明るい白にしたり、枠線を少し目立たせてあげると、ユーザーが迷わずにクリック(タップ)できるようになります。
—
② `:read-only` —— 「見るだけでお願いね!」のサイン
ユーザーが編集できない(読むことしかできない)状態の要素に反応します。
- 対象になるもの:
- HTMLで `readonly` 属性がついている入力欄(``)
- そもそも入力欄ではない、普通の段落(`
`)や見出し(`
`)など
/ ユーザーが書き込めない場所のデザイン /
input:read-only {
background-color: #f5f5f5; / ちょっとグレーにして「押せない感」を出す /
color: #666666; / 文字色も少し落ち着かせる /
cursor: not-allowed; / マウスカーソルを「禁止マーク」にする /
}
背景を少し暗めのグレーにしたり、マウスを乗せたときに「ここは触れませんよ」というカーソル表示(`cursor: not-allowed`)にしてあげると、とても親切なデザインになりますね。
—
3. 初心者が絶対につまずく「readonly」と「disabled」のちがい
ここでひとつ、CSSを学び始めた皆さんがほぼ100%つまずく大注目のポイントをお伝えしておきますね。(大丈夫、ここを越えればあなたもCSS中級者の仲間入りです!)
HTMLには、入力できなくする属性として `readonly` と `disabled` の2種類があります。
- `readonly`(リードオンリー):
「見るだけ!」の状態。編集はできないけれど、フォームを送信したときにはそのデータがサーバーに送信されます。
- `disabled`(ディスエーブルド):
「無効化(使用停止)」の状態。編集もできないし、フォームを送信してもデータは送られません。
CSSの `:read-only` は、基本的に `readonly` 属性がついた要素に反応します。
(※実はブラウザの仕様上、`disabled` がついた要素も「編集できない」という意味で `:read-only` が適用されることが多いですが、意味合いとしては別物です。)
「送信したいけど書き換えさせたくないデータ(会員番号など)」には `readonly` を使い、CSSでは `:read-only` で優しくグレーアウトしてあげる、と覚えておきましょう!
—
4. そのまま試せる!実用サンプルコード
さあ、理屈がわかったところで、実際のコードを見てみましょう!
以下のコードをコピーして、ご自身のエディタ(VS Codeなど)に貼り付けてブラウザで開いてみてください。動きや見た目の違いがひと目で分かりますよ。
HTMLファイル (`index.html`)
CSSファイル (`style.css`)
/ 全体のレイアウトを整える準備 /
body {
font-family: sans-serif;
background-color: #eef2f5;
display: flex;
justify-content: center;
padding: 40px 20px;
}
.profile-card {
background: #ffffff;
padding: 30px;
border-radius: 12px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
width: 100%;
max-width: 400px;
}
.form-group {
margin-bottom: 20px;
}
label {
display: block;
font-size: 14px;
font-weight: bold;
margin-bottom: 8px;
color: #333333;
}
/ ========================================================
★ ここからが本番! pseudo-class(疑似クラス)の指定
======================================================== /
/ ——————————————————–
1. :read-write (ユーザーが書き込める要素のスタイル)
——————————————————– /
:read-write {
background-color: #ffffff; / 入力しやすいように背景はパキッとした白 /
border: 2px solid #3b82f6; / 親しみやすい鮮やかな青色の枠線 /
color: #1e293b; / 文字は読みやすい濃いグレー /
border-radius: 6px;
padding: 10px 12px;
width: 100%;
box-sizing: border-box;
transition: all 0.2s ease; / 変化を滑らかにするおまじない /
}
/ 入力中に枠線を少し強く輝かせる演出 /
:read-write:focus {
outline: none;
border-color: #1d4ed8;
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.3);
}
/ ——————————————————–
2. :read-only (ユーザーが書き込めない要素のスタイル)
——————————————————– /
/ ※ input要素のうち、readonlyなものに絞ってスタイルをあてます /
input:read-only {
background-color: #f1f5f9; / ほんのりグレーにして「入力不可」を表現 /
border: 2px solid #cbd5e1; / 控えめな薄いグレーの枠線 /
color: #64748b; / 少し薄い文字色にして優先度を下げる /
cursor: not-allowed; / マウスカーソルを禁止マークに変更 /
border-radius: 6px;
padding: 10px 12px;
width: 100%;
box-sizing: border-box;
}
/ 補足:DIV要素で作ったメモ欄の見た目を少し整える /
.editable-memo {
min-height: 80px;
}
—
5. チーフアーキテクトからのワンポイント・アドバイス!
最後に、フロントエンド現場の第一線からの小さな「プロの知恵」をあなたにお贈りします。
「属性セレクタ(`input[readonly]`)」を使っても同じような見た目を作ることができますが、なぜ今回ご紹介した「疑似クラス(`:read-only`)」を使うのでしょうか?
その理由は、「HTMLのタグの種類に縛られずに、状態そのものを判別できるから」です。
たとえば、最近のWebアプリでは `
`:read-write` や `:read-only` を使っておけば、それが `` であれ `