やあ。今日も今日とてCSSの沼にハマっているかい?
フロントエンドの現場で長く生きていると、「あー、またこの面倒な要件か…」と頭を抱える瞬間が定期的にやってくる。特に、バックエンドの出力都合でクラス名がめちゃくちゃだったり、外部から差し込まれるウィジェットのスタイルを無理やり整えなきゃいけない時とかね。
今回は、そんな修羅場をスマートに切り抜けるための秘密兵器――部分一致属性セレクタ `[attr=value]` について話をしよう。
公式ドキュメントを開けば「属性値の中に指定した文字列が含まれる要素を選択する」と一言で書いてある。だが、実務でこれをどう使い倒すか、ブラウザの裏側でこいつがどれだけのコストを払って動いているかまで意識しているエンジニアは意外と少ない。
中級から一段上のシニアへステップアップしたい君のために、今日はこのセレクタの裏側と実践的な極意をたっぷり授けようか。
—
1. 属性セレクタの現在地と「部分一致 `=`」の正体
CSSを書くとき、私たちはついつい `.btn` とか `#main` みたいなクラスやIDセレクタに頼りがちだ。でも、HTMLの「属性」に目を向けると、CSSの表現力は一気に何倍にも跳ね上がる。
属性セレクタにはいくつか種類がある。
- 完全一致:`[attr=”value”]`
- 空白区切りの単語一致:`[attr~=”value”]`
- ハイフン区切りの前方一致:`[attr|=”value”]`
- 前方一致:`[attr^=”value”]`
- 後方一致:`[attr$=”value”]`
- そして、今回主役の部分一致:`[attr=”value”]`
この `=` は、指定した属性の値の中に、「どこであれ」その文字列が含まれていればマッチするという、非常に強力、かつ少し危険なヤツだ。
例えば、`[class=”btn-“]` と書けば、`class=”primary-btn-lg”` であろうが `class=”btn-100″` であろうが、文字列のどこかに `btn-` が含まれていれば全て捕獲できる。この「場所を問わない」という緩さが、現場での救世主になるのさ。
2. ブラウザの裏側で何が起きているか?(パフォーマンスの現実)
さて、シニアを目指す君なら「便利なものには裏がある」というエンジニアの鉄則を知っているはずだ。
クラス名やIDによるセレクタは、ブラウザのレンダリングエンジン(BlinkやWebKitなど)にとって非常に最適化しやすい。ハッシュマップなどでO(1)に近い感覚で要素を引けるからだ。
しかし、この部分一致 `[attr=value]` はどうだろう?
ブラウザは、対象となる要素の属性値を文字列として取り出し、その中に指定文字列が含まれているかを部分文字列検索(Substring Search)することになる。要するに、DOMツリーの走査コストが高くなりやすいんだ。
数千個の要素に対して `[class=”icon-“]` のような重い部分一致セレクタを乱発すると、リフローや再描画のたびにブラウザのメインスレッドに負荷がかかる。
だからこそ、「どこにでも使えるから便利!」と安易に全体に適用するのではなく、「スコープを絞って使う」のがプロの作法というわけだ。
3. 【実務チートシート】現場で即座に使える実践コード
百聞は一見にしかず。現場で「おっ、これ分かってるね」と周囲を唸らせるような、`[attr=value]` の具体的な活用シーンを見ていこう。
今回は、CMSの出力などで「クラス名が統一されていないが、特定の規則性を持つリンクやアイコン」を綺麗にスタイリングするケースを想定してみる。
通常のカード(読み込み成功)
ここは通常のコンテンツです。
エラー発生カード
ネットワークエラーの状態を部分一致(error)でキャッチして赤枠にしています。
リンクのテスト
通常の内部リンク:会社概要
外部サイトへのリンク:ヘルプページ(自動でアイコン付与)
カオスな命名規則のグリッド要素(col- を部分一致で捕捉)
—
4. シニアが教える「使っていい場面」「ダメな場面」の境界線
最後に、この部分一致セレクタを実務で運用する上での重要なマインドセットを伝えておこう。
🚨 やってはいけないアンチパターン
- グローバルに広すぎる指定
`[class=”btn”]` とだけ書くと、`my-btn` や `btn-primary` だけでなく、意図しない `.sidebar-button` や `.login-about-btn` まで巻き込んでしまうことがある。部分一致は「意図しないヒット(衝突)」が起きやすい諸刃の剣だ。
- パフォーマンスの悪化を無視した乱用
スマホの低スペック端末でDOMが巨大なWebアプリを動かす際、セレクタの右側(末尾)に部分一致を多用すると、毎フレームのスタイル計算が重くなり、スクロールのカクつき(Jank)の原因になる。
✨ 正しいベストプラクティス
- プレフィックスやスコープと組み合わせる
単に `[class=”col-“]` と書くのではなく、親要素を限定して `.grid-container [class=”col-“]` のように文脈を絞る。これだけでブラウザの走査範囲が狭まり、パフォーマンスリスクを大幅に軽減できる。
- デザインシステムの命名規則(BEMなど)を補完する例外処理として使う
本来はBEM等で厳密にクラス設計すべきだが、「どうしても触れないレガシーHTML」や「サードパーティ製プラグインの微調整」といった、どうしようもない現場の泥臭い課題をエレガントに解決する最終手段として胸に秘めておく。
—
部分一致セレクタ `[attr=value]` は、CSSの仕様書の隅っこにひっそりと書かれている地味な機能に見えるかもしれない。だが、現場のリアルな制約や、ままならないHTML構造に直面したとき、こいつを知っているかいないかでエンジニアとしての引き出しの深さが決定的に変わる。
さあ、今日の学びを自分のプロジェクトのコードレビューやリファクタリングに早速活かしてみてくれ。質問があればいつでも声をかけてくれよ。

コメント