こんにちは!フロントエンドの現場を渡り歩いてきた、シニアアーキテクトの私です。
CSSの勉強をしていると、次から次へと新しいセレクタが登場して「もう、覚えきれないよ…!」と頭を抱えたくなりませんか? `>` とか `+` とか、果てには `:not()` や `:nth-child()` なんてものまで出てきて、お腹いっぱいになりますよね。
でも、安心してください。今日ご紹介する `:defined`(ディファインド)擬似クラス は、そんな複雑な記号の中でも、知っているとちょっとカッコよくて、しかもモダンなWeb制作でめちゃくちゃ頼りになる「隠し味」のような存在です。
今回は、難しい専門用語はできるだけ脇に置いて、身近な例えを交えながら優しく紐解いていきましょう!
—
1. まずはイメージから:「名前が登録されたお医者さん」の話
Webの世界には、最初から用意されている「標準の要素」(`
` や `
ここで、こんなシチュエーションを想像してみてください。
あなたは大きなお祭りの会場にいます。そこに「救護テント」が設置されました。
でも、お祭りが始まってすぐの頃は、まだ看板も出ていないし、中にお医者さんがスタンバイしているかどうかわかりませんよね。「今、ここに入っていいのかな…?」と不安になります。
しばらくして、準備が整い、看板が掲げられ、お医者さんが席に着いたとします。これで「よし、ここはちゃんとお医者さんがいる(定義された)救護テントだ!」と安心して駆け込むことができますよね。
この `:defined` 擬似クラスは、まさにこの状態を見分けるためのものです。
「今そこにあるカスタム要素が、ちゃんとプログラムとして読み込まれて、使える状態(定義済み)になっているか?」を判断してくれます。
—
2. つまずきがちなポイント:「あれ?カスタム要素がバグる…?」
Web制作に少し慣れてくると、自分でオリジナルのタグ(例えば `
しかし、ここで一つの「落とし穴」があります。
HTMLに `
JavaScriptが読み込まれる前の、いわゆる「準備中」のわずかな時間に、ブラウザが素のままで表示してしまい、ページがガタッと崩れたり、変な見た目になってドキッとした経験はありませんか?
「あぁ、JavaScriptの読み込み待ちのせいで、スタイルが崩れてる……どうしよう!」
そんなとき、そっとあなたを助けてくれるのが `:defined` なのです。
—
3. コードで見てみよう:実用的な使い方
百聞は一見にしかず。実際のコードを見てみましょう。
ここでは、自分で作った特別なボタン `
コードの解説
1. `fancy-button:not(:defined)`
「もし、`
2. `fancy-button:defined`
「準備完了!JavaScriptの定義が読み込まれました!」という状態です。ここでは私たちが本来見せたかった、ピカピカの美しいスタイルを適用しています。
ちなみに、もう一つ知っておいてほしい大切な事実があります。
それは、`
` といった最初から用意されている標準のHTML要素は、最初から「定義済み(defined)」の状態として扱われます。そのため、標準要素に対して `:defined` を書いても常にマッチしますが、基本的にはこの「カスタム要素の読み込み待ち・チラつき防止」の文脈で使うのが現場のスタンダードです。
—
まとめ:焦らなくて大丈夫、一歩ずつ進みましょう
今日お話しした `:defined` は、Web Componentsという少し高度な技術で真価を発揮するセレクタなので、毎日のコーディングで絶対に欠かせないというわけではありません。
でも、「JavaScriptの読み込み待ちによる表示の崩れ(FOUC:Flash of Unstyled Content と呼ばれたりもします)をキレイにコントロールしたいな」と思ったとき、この `:defined` の存在を思い出してもらえたら、あなたの引き出しは確実に一つ深くなります。
CSSの世界は広く、覚えることもたくさんあって途方に暮れることもあるかもしれませんが、こうして一つひとつの意味を紐解いていけば、必ず自分の力になります。
今日覚えた `:defined`、ぜひ頭の片隅に置いてあげてくださいね。それでは、また次回のCSSの旅でお会いしましょう!

コメント