【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()セレクタのこの使い方を試してみてください。きっとビックリするような効果が出ますよ。

関連記事
SCSSの @for ループ(ループ文)
SCSSの @for ループ
無敵の小さな蚊
無敵の小さな蚊
4ヶ月前
SCSSの @for ループ(ループ文)
ユーザーのブラウザに保存されているJavaScript、CSS、画像のキャッシュを削除するにはどうすればいいですか?
ブラウザのキャッシュによる古いJavaScript、CSS、画像の表示を防ぐには、URLにバージョン番号や日時パラメータを付けてリソースを更新する方法が有効です。 毎回タイムスタンプを使うとキャッシュ効果がなくなるため、手動や適切なタイミングでバージョン番号を管理するのがおすすめです。
Details
Details
4ヶ月前
ユーザーのブラウザに保存されているJavaScript、CSS、画像のキャッシュを削除するにはどうすればいいですか?
PHPでランダムIDを生成するランダムな文字列を生成する
このPHPコードは、セキュリティ重視のWebシステムに必要な「予測不可能な」ランダムトークンを生成するために設計されています。openssl_random_pseudo_bytes() を使うことで、一般的な rand() や mt_rand() よりも格段に安全なランダム性が確保されます。
Details
Details
4ヶ月前
PHPでランダムIDを生成するランダムな文字列を生成する
相対パスと絶対パスの使い方
相対パスは、モジュールやディレクトリ内のローカルな参照に適しており、柔軟性があります。一方、絶対パスはウェブサイト全体で共通のリソース(CSS、画像、CDNなど)を参照する際に便利です。両者を理解して使い分けることで、パスのエラーや読み込み不具合を防げます。
Details
Details
4ヶ月前
相対パスと絶対パスの使い方
第1回:ウェブにおける色の基礎(2025年最新版)
ウェブデザインの基礎「色」について、2025年最新トレンドやアクセシビリティ・ダークモード対応まで、実務ですぐ使えるCSS色指定方法を分かりやすく解説。初心者から現場のデザイナーまで必見のカラーマネジメント入門ガイド。
aki0o0
aki0o0
4ヶ月前
ABテストとは?赤か青か?データが導く最適な選択
ABテストは、今やデジタルマーケティングの「常識」となった科学的な意思決定手法です。日本のECサイトやアプリ開発の現場でも、「どちらのデザインが効果的か」「どんなキャッチコピーが響くか」を決める際に頻繁に活用されています。 この手法のルーツ […]
解構人
解構人
3ヶ月前
ABテストとは?赤か青か?データが導く最適な選択
【CSS & JavaScript & SVG対応】円グラフ(扇形図)のアニメーション表現まとめ
はじめに 円グラフ(パイチャート)は、比率や構成比を視覚的に伝えるのに最適なUIコンポーネントです。最近、業務で使う機会があり、さまざまな方法でエフェクトをつけて表示する実装を試しました。 この記事では、以下の3パターンで実装する方法を紹介 […]
キウイフルーツ
キウイフルーツ
3ヶ月前
【CSS & JavaScript & SVG対応】円グラフ(扇形図)のアニメーション表現まとめ
SEOは聞いたことありますよね?ではGEOってご存知ですか?|生成エンジン最適化(GEO)の重要性や必要なことをまとめました!
SEOは知ってるけどGEOは初耳?AI時代に欠かせない「生成エンジン最適化(GEO)」の意味・必要性・対策ポイントを初心者向けにやさしく解説!
WASABI
WASABI
3ヶ月前
SEOは聞いたことありますよね?ではGEOってご存知ですか?|生成エンジン最適化(GEO)の重要性や必要なことをまとめました!
JavaScriptでURL(パス)からファイル名を取得する
window.location.pathname でURLのパス部分を取得。 lastIndexOf('/') で最後のスラッシュ位置を検出。 substring でスラッシュの次から最後までを切り出し、ファイル名を抽出。
Details
Details
4ヶ月前
JavaScriptでURL(パス)からファイル名を取得する
PHPでMySQLのバージョンを確認する方法
PHPを使ってMySQLのバージョンを取得する方法には、mysqli_get_server_info()、PDO::getAttribute()、および SELECT VERSION() という3つの一般的な方法があります。それぞれの方法でMySQLへの接続が必要です。
Details
Details
4ヶ月前
PHPでMySQLのバージョンを確認する方法
ページ遷移の一般的な方法
本記事では、Webページにおけるページ遷移(リダイレクト)の一般的な実装方法について紹介しています。JavaScript、HTMLのメタタグ、PHP、ASPを用いたリダイレクト方法をそれぞれ具体的なコード例と共に解説しています。
Details
Details
4ヶ月前
ページ遷移の一般的な方法
【jQuery】フルスクリーンナビゲーション時に背景のスクロールを無効にする方法
このjQueryコードは、トグルボタンの状態に応じてナビゲーションを開閉し、背景のスクロールを動的に制御します。クラス名 back をトリガーとして、html 要素に適切なスタイルを適用し、快適なフルスクリーンUIを提供します。
Details
Details
4ヶ月前
【jQuery】フルスクリーンナビゲーション時に背景のスクロールを無効にする方法
!important なしでも大丈夫!CSS @layer でスタイル管理をもっと簡単に
CSS の !important は便利ですが、乱用すると保守が難しくなります。そこで注目されているのが新機能 @layer。この記事では、@layer を使って優先度を整理する方法を実装例とともに紹介します。
Details
Details
2ヶ月前
!important なしでも大丈夫!CSS @layer でスタイル管理をもっと簡単に
scroll-behaviorで平滑スクロール、一行でいけるんだ
一般的に、アンカーリンクをスムーズにスクロールさせる時、JavaScriptやjQueryで実装することが多いです。例えば、 でも実は、CSSだけでもできるんです。そのためのプロパティがこちら: これを書くだけで、リンクをクリックした時にス […]
メモ・ノートスケ
メモ・ノートスケ
4ヶ月前
scroll-behaviorで平滑スクロール、一行でいけるんだ
【SEO基礎】rel=”nofollow”とは?リンクの評価をコントロールするHTML属性を解説
SEO対策に欠かせない「rel="nofollow"」の意味と使い方を解説。広告やユーザー投稿に適切なrel属性を設定し、検索エンジンとの正しい関係を築きましょう。
qqplus
qqplus
4ヶ月前
【SEO基礎】rel=”nofollow”とは?リンクの評価をコントロールするHTML属性を解説