CSSの継承を防ぐにはどうすればよいですか?


94

ネストされたリスト(<ul>タグと<li>タグ)を使用する階層ナビゲーションメニューがサイドバーにあります。リストアイテムのスタイルがすでにある既成のテーマを使用していますが、トップレベルアイテムのスタイルを変更したいのですが、サブアイテムには適用しません。それらのスタイルを子リストアイテムにカスケードせずに、トップレベルのリストアイテムタグにスタイルを適用する簡単な方法はありますか?サブアイテムにオーバーライドスタイルを明示的に追加できることは理解していますが、「これらのスタイルをこのクラスに適用し、カスケードしないでください」と言う簡単な方法がある場合は、そのスタイルコードをすべて複製する必要はありません。それらを任意の子要素にまで下げます」。これが私が使用しているhtmlです:

<ul id="sidebar">
  <li class="top-level-nav">
    <span>HEADING 1</span>
    <ul>
      <li>sub-heading A</li>
      <li>sub-heading B</li>
    </ul>
  </li>
  <li class="top-level-nav">
    <span>HEADING 2</span>
    <ul>
      <li>sub-heading A</li>
      <li>sub-heading B</li>
    </ul>
  </li>
</ul>

そのため、CSSにはすでにスタイルが#sidebar ulあり#sidebar ul liますが#sidebar .top-level-nav、サブ子にカスケードされないスタイルを追加したいと思います。これを簡単に行う方法はありますか、それともすべてのスタイルを再配置して、オンになっていたスタイルが#sidebar ul特定のクラスに固有になるようにする必要がありますか?


2
私はサイトで同様の質問を検索しましたが、何も見つかりませんでした(質問がないと言っているわけではありませんが、調べました)。それが何であるか知っているなら、私にそれを教えてくれませんか?ありがとう!

1
stackoverflow.com/questions/747308/breaking-css-inheritance | それはマシューが答えたことをほとんど言っています。
JasonV 2009年

1
だから私は答えは「いいえ、それを単純に行う方法はありません-サブアイテムのすべてのスタイル設定を手動でオーバーライドする必要があります」-これを正しく解釈していますか?再度、感謝します。

回答:


38

現在のところ、親セレクターはありません(または、Shaun Inmanが呼んでいるように、修飾セレクター)。そのため、親リストアイテムのスタイルをオーバーライドするには、子リストアイテムにスタイルを適用する必要があります。

カスケードは、カスケードスタイルシートの要点の一種であるため、この名前が付けられています。


13
この情報はIE8以降古くなっています。SilviuPostavaruによる回答を参照してください。チェックをより適切な答えに変更することを検討してください。
tmuecksch 2013年

笑、私はカスケードがちょっと本質であることに同意します。しかし、異なることを意図した特定の親からの伝播を停止する方法があるはずです。
Obay Abd-Algader

72

子セレクターを使用します

だから使用する

#parent > child

最初のレベルの子供だけにスタイルを適用させます。残念ながら、IE6は子セレクターをサポートしていません。

それ以外の場合は使用できます

#parent child child

複数のレベル下にある子に別の特定のスタイルを設定します。


1
JSFiddleでこれを実際に見せていただけませんか。インラインブロックで表示されたdivを中央に配置しようとしましたが、テキストはdiv内で中央に配置されます。
カルマリウス2014

41

呼ばれるプロパティがありますallCSS3の継承モジュールが。それはこのように動作します:

#sidebar ul li {
  all: initial;
}

2016-12の時点で、IE / EdgeとOperaMiniを除くすべてのブラウザーがこのプロパティをサポートしています。


4
@AndriusDobrotinasは最終的にサポートされるようになりますか?あなたのコメントを完全には把握していないようです。PostCSSを使用する場合、この機能を提供するPostCSSプラグインがあります:github.com/maximkoretskiy/postcss-initial
Boldewyn

1
@AndriusDobrotinas、あなたのコメントは非常に非建設的です。回答はコミュニティのために投稿されました。その利点を確認するために一生懸命努力してください。
コーディ

2
現在のところ、IEとOpera Miniのみがサポートしており、他のすべての主要なブラウザはサポートしています
Legends

@Boldewynリンクされたw3ドキュメントからわかる限り、「デフォルト」値はありません...
benomatis 2017年

@webenoがありました、私が答えを書いたとき:w3.org/TR/2013/WD-css3-cascade-20130103/#all-shorthand古いものdefaultと新しいものの間にいくつかの微妙な違いがあるようですがunset、今は私ですさらに調査する時間がありません。回答を編集して、最新の状態にしてください。
Boldewyn 2017年

26

*セレクターを使用して、子スタイルをデフォルトに戻すことができます

#parent {
    white-space: pre-wrap;
}

#parent * {
    white-space: initial;
}

1
これは非常に優れた解決策です。特に、親のクラスがわからない場合はそうです。
BurninLeo 2015

私はこれに対する答えを知っていると思いますが、とにかくこれをインラインに設定することはありますか?<div id="parent" style="white-space:pre-wrap;*white-space:initial;"/>
1.21ギガワット

11

iframeでラップすると、親のcssが廃止されます。


2
技術的にはCSSの継承を停止する唯一の物理的な方法であるため、これが最悪の答えであることはおかしいです。私はあなたがそれをこのように使うべきだと主張しているわけではありません。
davidelrizzo 2015年

2
CSSを物理的に使用するのではなく、CSSが属する仮想世界に置いておくことをお勧めします。
michaelward82 2016年

実際に追加するiframeと、子コンポーネントが見えなくなりました。考え?
Kevin Ghaboosi 2017

5

簡単な答えは次のとおりです。いいえ、CSSの継承を防ぐことはできません。親に設定されているスタイルのみを上書きできます。仕様を参照してください:

HTMLドキュメント内のすべての要素は、親をhtml持たないルート要素()を除いて、その親からすべての継承可能なプロパティを継承します。- W3C

すべての継承されたプロパティをオーバーライドすることは別として。initialキーワードを使用することもできますcolor: initial;。またall、たとえばall: initial;、すべてのプロパティを一度にリセットするなどと一緒に使用することもできます。例:

.container {
  color: blue;
  font-style: italic;
}
.initial {
  all: initial;
}
<div class="container">
  The quick brown <span class="initial">fox</span> jumps over the lazy dog
</div>

使用できるかによるブラウザサポートテーブル...

  • all (現在、IEとEdgeの両方でサポートはありませんが、その他は良好です)
  • initial (現在、IEでのサポートはありませんが、その他は良好です)

場合によっては、直接子セレクター>を使用すると便利なことがあります。例:

.list > li {
  border: 1px solid red;
  color: blue;
}
<ul class="list">
  <li>
    <span>HEADING 1</span>
    <ul>
      <li>sub-heading A</li>
      <li>sub-heading B</li>
    </ul>
  </li>
  <li>
    <span>HEADING 2</span>
    <ul>
      <li>sub-heading A</li>
      <li>sub-heading B</li>
    </ul>
  </li>
</ul>

境界線スタイルは、継承さ<li>borderていないプロパティと同様に、直接の子にのみ適用されています。ただしcolor、継承されたプロパティと同様に、テキストの色はすべての子に適用されています。

したがって、>セレクターは、継承の防止に関しては、継承されていないプロパティでのみ役立ちます。


2

jQueryのようなものを使用して、この動作を「無効」にすることができますが、cssとjavascriptで表示ロジックを取得するため、これが良い解決策とは思えません。それでも、要件によっては、jQueryのcss utilsを使用すると、特にIE6で機能させようとしている場合に、ハッキーなcssを試すよりも作業が楽になることがあります。


2

たとえば、XHTMLドキュメントに2つのdivがある場合。

<div id='div1'>
    <p>hello, how are you?</p>
    <div id='div2'>
        <p>I am fine, thank you.</p>
    </div>
</div>

次に、CSSでこれを試してください。

#div1 > #div2 > p{
    color: red;
}

'div2'段落にのみ影響します。

#div1 > p {
    color: red;
} 

'div1'段落にのみ影響します。


2

のクラス参照は必要ありませんli。のようなCSSを持つ代わりに

li.top-level-nav { color:black; }

あなたは書ける

ul#sidebar > li { color:black; }

これliにより、サイドバーからすぐに下がるsにのみスタイリングが適用されますul


0

「#sidebarulli」セレクターでデフォルトに戻すだけです


答えてくれてありがとう。はい、サブアイテムのスタイルに戻すことができることは理解していますが、自分で作成していないテーマを使用しているため、それを避けようとしています。時間を大幅に節約できるかどうか疑問に思っています。いたるところに散らばっているulとliのさまざまなスタイルをすべて見つけて、サイトの他の領域での意図しない結果を心配する代わりに、「カスケード禁止:true」ルールなどを使用するだけです。 。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.