【CSSテクニック】:not()セレクタで階層を跨いだ除外を実現

【CSSテクニック】:not()セレクタで階層を跨いだ除外を実現

CSS の世界で :not() 擬似クラスって、実はめちゃくちゃ便利なのに、意外と過小評価されがちなんですよね。
多くの人は「同じ階層の要素を除外する」くらいにしか使ってない印象ですが、実はそれだけじゃないんです。
最近、このセレクタを使ったちょっと面白い課題にぶつかって、:not() の“階層を跨いでるように見える”使い方にハマりました。

背景と課題のシナリオ

こんな感じのHTML構造を想定しています:

<div class="post">
    <p>Lorem ipsum dolor sit amet, sed alia expetenda liberavisse ut, id sit purto possim expetenda. In atqui aeque mandamus vis, sonet tamquam id his. Ne tota nobis his, eam tale sumo ut. Id odio ludus pro, sit ut autem ubique, no agam nemore pertinax per. Solum reque forensibus ius eu, an vix probo verear.</p>
    <p>Lorem ipsum dolor sit amet, sed alia expetenda liberavisse ut, id sit purto possim expetenda. In atqui aeque mandamus vis, sonet tamquam id his. Ne tota nobis his, eam tale sumo ut. Id odio ludus pro, sit ut autem ubique, no agam nemore pertinax per. Solum reque forensibus ius eu, an vix probo verear.</p>
    <p>Lorem ipsum dolor sit amet, sed alia expetenda <code>div .item</code> ut, id sit purto possim expetenda. In atqui aeque mandamus vis, sonet tamquam id his. Ne tota nobis his, eam tale sumo ut. Id odio ludus pro, sit ut autem ubique, no agam nemore pertinax per. Solum reque forensibus ius eu, an vix probo verear.</p>
    <p>Lorem ipsum dolor sit amet, sed alia expetenda liberavisse ut, id sit purto possim expetenda. In atqui aeque mandamus vis, sonet tamquam id his. Ne tota nobis his, eam tale sumo ut. Id odio ludus pro, sit ut autem ubique, no agam nemore pertinax per. Solum reque forensibus ius eu, an vix probo verear.</p>
    <p>Lorem ipsum dolor sit amet, sed alia expetenda liberavisse ut, id sit purto possim expetenda. In atqui aeque mandamus vis, sonet tamquam id his. Ne tota nobis his, eam tale sumo ut. Id odio ludus pro, sit ut autem ubique, no agam nemore pertinax per. Solum reque forensibus ius eu, an vix probo verear.</p>

    <p>
        <pre>
            <code>
                :root {
                --theme-color: #ffe4c4;
                --flex-list-col-num: 5;
                --flex-list-column-gap: 1em;
                --flex-width: calc((100% - var(--flex-list-column-gap) * (var(--flex-list-col-num) - 1)) / var(--flex-list-col-num));
                }
                
                #app {
                padding: 20px;
                }
            </code>
        </pre>
    </p>
</div>

上の構造はWordPressの投稿内容なんですが、<code>タグに背景色を付けたい一方で、<pre>タグで囲まれたコードブロックの<code>は除外したいっていう問題があって。つまり、段落内のインラインコードだけにスタイルをかけて、コードブロックには影響を与えたくないんです。

従来のアプローチとその限界

この問題を解決しようとすると、ふつうはこんな方法を試してみることが多いです:

  • codeタグに直接スタイルを当てる
  • preタグを除外する方法を試してみる

でも、この方法だと階層をまたいで選択することができません。

:not() を使った「階層を跨ぐ除外」の実現方法

調べてみたら、:not()セレクタで完璧に解決できることが分かりました:

code:not(pre code) {
    background-color: red;
}

このセレクタは「すべてのcodeタグを選ぶけど、preタグの中にあるcodeは除く」という意味です。

この手法が効果的な理由

:not()擬似クラスのすごいところは、単純なクラスやIDだけじゃなくて、複雑なセレクタも引数にできるってところです。だから、こんな感じで高度な選択ができるんです:

  • 複数の階層をまたいで除外すること
  • 親要素を踏まえてスタイルを調整する

この機能のおかげで、普通のCSSセレクタではできない「逆向きに選ぶ」方法ができちゃいます。

応用パターンと実用例

このテクニックはいろんな場面で使えます。例えば:

  • インラインコードだけにスタイルをつけて、コードブロックには影響させない
  • 特定の親要素の中の要素を除外したいとき
  • 複雑な階層構造を操作したい場合

まとめ::not() の可能性を引き出すには

:not()擬似クラスのこういう使い方は、CSSセレクタの柔軟さとパワフルさをよく表してますね。CSSの機能を工夫して使えば、一見ややこしい問題も案外シンプルに解決できるって分かりました。

次に「上方向に選択したい」や「特定の構造を除外したい」みたいなスタイルの問題にぶつかったら、ぜひ:not()セレクタのこの使い方を試してみてください。きっとビックリするような効果が出ますよ。

関連記事
WordPressサイトでメルマガ運用する時の注意点|簡単にできることには注意が必要でやんす。
「一括管理って響き最高!」だけど…WordPressでメルマガ配信するならセキュリティにご用心!メリットと落とし穴、そしてBenchmark Emailの使い方まで、編集長がゆるっと解説!
WASABI
WASABI
1ヶ月前
WordPressサイトでメルマガ運用する時の注意点|簡単にできることには注意が必要でやんす。
【2025年6月最新版】TIOBEインデックスで見る人気プログラミング言語ランキングとは?
2025年6月最新版のTIOBEインデックスから、今人気のプログラミング言語を解説。Python、C、C++、Javaなどの注目度や、インデックスの活用方法も紹介します。
解構人
解構人
2ヶ月前
【2025年6月最新版】TIOBEインデックスで見る人気プログラミング言語ランキングとは?
SafariでGoogleフォントが正しく表示されない原因と対策【font-weight・font-style完全ガイド】
SafariやiOSでGoogleフォントが正しく表示されない主な原因と対策を徹底解説。font-weight・font-styleの指定ミスによるWebフォント崩れを解決するCSSサンプル付きガイド。
aki0o0
aki0o0
3ヶ月前
SafariでGoogleフォントが正しく表示されない原因と対策【font-weight・font-style完全ガイド】
PHPでウェブサイトのフッターにあるCopyrightの年数範囲を自動更新する
auto_copyright() 関数は、動的に著作権の年数を出力します。引数として開始年を受け取り、現在の年と比較して、単一年または範囲(例: 2015 - 2025)を表示します。
Details
Details
3ヶ月前
PHPでウェブサイトのフッターにあるCopyrightの年数範囲を自動更新する
よく使われるPHPライブラリ9選【公式リンク付き・2025年版】
2025年最新!PHPでのWeb開発に役立つライブラリ&フレームワーク12選を厳選紹介。Laravel・Symfony・PHPMailer・Guzzleなど、実務で使えるツールをまとめてチェック。公式リンク付きで、今すぐ使える便利リスト!
aki0o0
aki0o0
3ヶ月前
よく使われるPHPライブラリ9選【公式リンク付き・2025年版】
【CSS & JavaScript & SVG対応】円グラフ(扇形図)のアニメーション表現まとめ
はじめに 円グラフ(パイチャート)は、比率や構成比を視覚的に伝えるのに最適なUIコンポーネントです。最近、業務で使う機会があり、さまざまな方法でエフェクトをつけて表示する実装を試しました。 この記事では、以下の3パターンで実装する方法を紹介 […]
キウイフルーツ
キウイフルーツ
2ヶ月前
【CSS & JavaScript & SVG対応】円グラフ(扇形図)のアニメーション表現まとめ
フッターのJavaScriptは画像読み込みに影響する?ブラウザの読み込み順と最適化の基本
はじめに Webサイトの表示速度や操作感は、単にコンテンツの量や見た目だけでなく、ブラウザがリソースをどのように読み込むかによっても大きく左右されます。特にJavaScriptや画像の読み込み順序、そしてそれらがどのように相互作用しているか […]
解構人
解構人
2ヶ月前
フッターのJavaScriptは画像読み込みに影響する?ブラウザの読み込み順と最適化の基本
第1回:ウェブにおける色の基礎(2025年最新版)
ウェブデザインの基礎「色」について、2025年最新トレンドやアクセシビリティ・ダークモード対応まで、実務ですぐ使えるCSS色指定方法を分かりやすく解説。初心者から現場のデザイナーまで必見のカラーマネジメント入門ガイド。
aki0o0
aki0o0
3ヶ月前
同一ドメイン配下の複数アプリケーションにおけるCSRF対策ガイド
目次 1. 技術的背景と適用シナリオ 代表的な適用例 技術的利点 潜在的なリスク 2. CSRF保護メカニズムの基本原則 保護の三要素 3. 複数アプリケーション環境におけるセキュリティ課題 3.1 セッション命名衝突の深層的影響 具体的な […]
解構人
解構人
2ヶ月前
同一ドメイン配下の複数アプリケーションにおけるCSRF対策ガイド
PHPのcheckdnsrr関数徹底解説:メールアドレス検証での活用方法
目次 フォーム開発で遭遇した課題 checkdnsrr関数とは? 主な用途 メールアドレスのドメイン検証 ドメイン存在確認 SPFレコードチェック ネットワーク診断ツール メリット デメリットと制限事項 実際の活用例 基本的なメールドメイン […]
解構人
解構人
1ヶ月前
PHPのcheckdnsrr関数徹底解説:メールアドレス検証での活用方法
iPhone(iOS Safari)における input タグの角丸問題とその対策
iPhone(iOS Safari)でinputタグに自動で適用される角丸スタイルを無効化する方法を詳しく解説。CSSによるリセットやカスタムスタイルの実装手順を、具体的なコードとともに紹介します。
キウイフルーツ
キウイフルーツ
2ヶ月前
iPhone(iOS Safari)における input タグの角丸問題とその対策
【jQuery】フルスクリーンナビゲーション時に背景のスクロールを無効にする方法
このjQueryコードは、トグルボタンの状態に応じてナビゲーションを開閉し、背景のスクロールを動的に制御します。クラス名 back をトリガーとして、html 要素に適切なスタイルを適用し、快適なフルスクリーンUIを提供します。
Details
Details
3ヶ月前
【jQuery】フルスクリーンナビゲーション時に背景のスクロールを無効にする方法
SEOは聞いたことありますよね?ではGEOってご存知ですか?|生成エンジン最適化(GEO)の重要性や必要なことをまとめました!
SEOは知ってるけどGEOは初耳?AI時代に欠かせない「生成エンジン最適化(GEO)」の意味・必要性・対策ポイントを初心者向けにやさしく解説!
WASABI
WASABI
1ヶ月前
SEOは聞いたことありますよね?ではGEOってご存知ですか?|生成エンジン最適化(GEO)の重要性や必要なことをまとめました!
PHPの hash_equals 関数とは?なぜ == や === を使わないのか?
hash_equals は PHP において、2つの文字列が等しいかを安全に比較するための関数です。特にパスワードのハッシュや署名の検証などで使われます。== や === といった通常の比較演算子とは異なり、タイミング攻撃(Timing A […]
解構人
解構人
25日前
PHPの hash_equals 関数とは?なぜ == や === を使わないのか?
JavaScriptでナビゲーション以外の場所をクリックしたらナビゲーションを閉じる
本コードは典型的なモバイル用サイドナビゲーションの実装例です。ボタンによる表示切替と、メニュー外クリック検知を組み合わせることで、ユーザー体験を向上させています。さらにESCキーでのメニュー閉鎖も可能にし、アクセシビリティも配慮しています。
Details
Details
2ヶ月前
JavaScriptでナビゲーション以外の場所をクリックしたらナビゲーションを閉じる