2015-11-23 8 views
6

同じレベルのCSSスタイルの束があります:同じ特異性を持つCSSセレクタをHTMLタグの親子関係の順に適用する方法は?

.style1 a { 
    color: red; 
} 
.style2 a { 
    color: green; 
} 

はまた、それらのスタイルが適用されるネストされたブロックでのHTMLコードがあります:その結果、第2のリンクとして

<div class="style2"> 
    <span> 
     <a href="/">Style 2</a> 
    </span> 
    <div class="style1"> 
     <div> 
      <a href="/">Style 1</a> 
     </div> 
     <div class="style2"> 
      <a href="/">Style 2</a> 
     </div> 
    </div> 
</div> 

(«スタイル1»)は緑になります。これは、リンクタグが両方のCSSセレクタに対して同じ特異性を持ち、.style2 aが後で宣言されたために発生します。したがって、.style2 aが適用されます。

タグのネストに関する予備的な情報なしで、最も近いスタイルクラスの親からスタイルを適用する方法(2番目のリンクを赤くする)?

コードの遊び場:http://codepen.io/anon/pen/zvXmOw

HTMLはを修正することが可能です。しかしリンクがどこにあってもよいと考えてください。

----------

私が見つけた最良の解決策は、制限ネストに基づいています。まず(スタイル - 親からのリンクタグまでの距離が限られている):

<style> 
.style1 > a, 
.style1 > :not(.style) > a, 
.style1 > :not(.style) > :not(.style) > a { 
    color: red; 
} 
.style2 > a, 
.style2 > :not(.style) > a, 
.style2 > :not(.style) > :not(.style) > a { 
    color: green; 
} 
</style> 
<div class="style style2"> 
    <span> 
     <a href="/">Style 2</a> 
    </span> 
    <div class="style style1"> 
     <div> 
      <a href="/">Style 1</a> 
     </div> 
     <div class="style style2"> 
      <a href="/">Style 2</a> 
     </div> 
    </div> 
</div> 

セカンド(スタイルのdivのネストが制限されている):

<style> 
.style1 a, 
.style .style1 a, 
.style .style .style1 a { 
    color: red; 
} 
.style2 a, 
.style .style2 a, 
.style .style .style2 a { 
    color: green; 
} 
</style> 
<div class="style style2"> 
    <span> 
     <a href="/">Style 2</a> 
    </span> 
    <div class="style style1"> 
     <div> 
      <a href="/">Style 1</a> 
     </div> 
     <div class="style style2"> 
      <a href="/">Style 2</a> 
     </div> 
    </div> 
</div> 

私が見つけることを試みている限界withounよりよい解決策があります。

+0

のように使用します。スタイル1> a { 色:赤; } 。スタイル2> a { 色:緑; } –

+0

@KishoreSahas、リンクされていない場合もあります(最後のものを除く)。リンクはstyle-divs内の任意の場所に置くことができます。 – Finesse

+0

私は同意します、質問に間違いがあります –

答えて

2

HTMLタグの親子順に同じ特異性のCSSセレクタを作成するにはどうすればよいですか?

できません。 CSSは単純にそのようには機能しません。セレクタが等しい特異性を持つ場合、ルールはスタイルシート順に適用されます。あなたはそれを変更することはできません。

color: inheritでリンク上の効果を得たり、クラスのメンバーである要素の色を設定することができます。

おそらく、アンカーのクラスを直接設定する方が簡単でしょう。

+0

アイデアは、HTMLを変更せずにカードにスタイルテーマを適用することです。テーマはタグとクラスのセットに影響します。カードは入れ子にすることができます。だから、私はターゲット要素にクラスを適用せずにそれを行うための任意のトリックがあることを確認しようとします。 – Finesse

+0

@Finesse - 私が言ったように:いいえ、ありません。 – Quentin

+0

ネスティングが限定されています(更新された質問を参照)。 – Finesse

0

これは定義の問題です。彼の子供を適用するために.green classnameでdivを作るリンク.greenを作る方が良いです。良いCSSのプラクティスでは、これを作る方が良いと言われています。

<a href="" class="green">Green link</a> 
<a href="" class="red">Red link</a> 

ここで重要なことはありません。特定のスタイルがリンクのために作られている場合は、そのための良いコードを書いてみませんか?

+0

アイデアは、HTMLを変更することなくスタイルテーマをブロックに適用することです。テーマはタグとクラスのセットに影響します。 – Finesse

+0

1つのテーマは2つではなく、1つのテーマのみを適用することです。 2つのテーマを適用する必要がある場合は、テーマシステムがありません。 –

+0

ネストされるネストされたブロック(カードなど)があります。親カードには、スタイルを付ける必要がある独自のコンテンツがあります。また、このカードには、コンテンツのスタイル設定も必要な子カードがあります。 – Finesse

0

最高のは、おそらくそのようなスパンとdiv要素を削除するには、次のようになります。

<div class="style2"> 
    <a href="/">Style 2</a> 
    <div class="style1"> 
     <a href="/">Style 1</a> 
    <div class="style2"> 
     <a href="/">Style 2</a> 
    </div> 
</div> 

をしてから、このCSSを使用します。

.style1 > a { 
    color: red; 
} 
.style2 > a { 
    color: green; 
} 

フィドル:http://jsfiddle.net/09c6x5pp/

EDIT:

スパンとdivを保持したい場合:

.style1 > a, 
.style1 > div > a { 
    color: red; 
} 
.style2 > a, 
.style2 > span > a { 
    color: green; 
} 
+0

リンクはどこでもかまいません – Finesse

+0

次に、クラスを親の代わりにリンク自体に置くことをお勧めします。それを行うための唯一の方法。 – Nealime

1

それはCSS variablesを使用して達成することができます。

a { 
 
    color: var(--link-color); 
 
} 
 
.style1 { 
 
    --link-color: red; 
 
} 
 
.style2 { 
 
    --link-color: green; 
 
}
<div class="style2"> 
 
    <span> 
 
     <a href="/">Style 2</a> 
 
    </span> 
 
    <div class="style1"> 
 
     <div> 
 
      <a href="/">Style 1</a> 
 
     </div> 
 
     <div class="style2"> 
 
      <a href="/">Style 2</a> 
 
     </div> 
 
    </div> 
 
</div>

残念ながら、この技術は広く、十分なブラウザでサポートされていません。 Can I useによると、ユーザーの87%がそれをサポートしています。

+0

CSS変数が少なくとも97%のブラウザでサポートされる場合は、回答が受け入れられます。 – Finesse

関連する問題