子要素をホバーするときに親要素をスタイルする方法は?


159

CSS親セレクターが存在しないことは知っていますが、そのようなセレクターなしで子要素をホバーするときに親要素をスタイル設定することは可能ですか?

例を挙げましょう:ホバーすると削除される要素を強調表示する削除ボタンを考えます

<div>
    <p>Lorem ipsum ...</p>
    <button>Delete</button>
</div>

純粋なCSSを使用して、マウスをボタンの上に置いたときにこのセクションの背景色を変更するにはどうすればよいですか?



回答:


134

さて、この質問は以前に何度も尋ねられており、短い典型的な答えは、次のとおりです。純粋なCSSでは実行できません。その名のとおりです。カスケードスタイルシートは、カスケード方向のスタイル設定のみをサポートし、アップ方向はサポートしません。

ただし、この例のようにこの効果が望まれるほとんどの状況では、これらのカスケード特性を使用して目的の効果に到達する可能性があります。この疑似マークアップを考えてみましょう:

<parent>
    <sibling></sibling>
    <child></child>
</parent>

トリックは、兄弟に親と同じサイズと位置を与え、親の代わりに兄弟をスタイルすることです。これは親がスタイルされているように見えます!

では、兄弟をどのようにスタイルするのですか?

子がホバリングされると、親もホバリングされますが、兄弟はホバリングされません。同じことが兄弟にも言えます。これは、兄弟をスタイルするための3つの可能なCSSセレクターパスで終わります。

parent sibling { }
parent sibling:hover { }
parent:hover sibling { }

これらの異なるパスはいくつかの素晴らしい可能性を可能にします。たとえば、質問の例でこのトリックを解き放つと、次のフィドルになります。

div {position: relative}
div:hover {background: salmon}
div p:hover {background: white}
div p {padding-bottom: 26px}
div button {position: absolute; bottom: 0}

スタイルの親画像の例

明らかに、ほとんどの場合、このトリックは兄弟を親と同じサイズにする絶対配置の使用に依存します。なお、子を親の中に表示させます。

特定の要素を選択するために、より限定されたセレクターパスを使用する必要がある場合があります。これは、ツリーメニューにトリックを複数回実装するこのフィドルに示すようにです。本当にいいです。


1
これは強調表示には適していますが、フォントの色を変更しようとしても機能しません。
Jahanzeb Khan 2013

1
@JahanzebKhanフォントの色を変更しても問題ありません
NGLN 2013

116

私はそれが古い質問であることを知っていますが、私は疑似子(疑似ラッパー)なしでなんとかそうすることができました。

あなたは何にもないし、親を設定した場合pointer-events、その後、子供divpointer-eventsのセットauto、それは動作します:)
注意をすることを<img>(たとえば)タグは、トリックを行いません。
また、独自のイベントリスナーを持つ他の子にもを設定pointer-eventsすることを忘れautoないでください。そうしないと、クリック機能が失われます。

div.parent {  
    pointer-events: none;
}

div.child {
    pointer-events: auto;
}

div.parent:hover {
    background: yellow;
}    
<div class="parent">
  parent - you can hover over here and it won't trigger
  <div class="child">hover over the child instead!</div>
</div>

編集:
としてシャドウウィザードが親切に注意:それは以下のIE10とのために、この意志はない仕事を言及する価値があります。(FFとChromeの古いバージョンもここにあります


3
これはIE10以下では機能しません。(FFとChromeの旧バージョンも、こちらをご覧ください
Shadow Wizardは、Ear For Youの

2
ポインターイベントをnoneに設定すると、その要素のイベントリスナーが機能しなくなります。
rhazen

1
@rhazenあなたは絶対的に正しいです。私の経験では、この使用法は通常、単一のクリック領域/要素に
関連付け

child1のparent、child1、childの2レベルがある場合はどうでしょうか。親にポインターイベントなしを、子にポインターイベント自動を追加しました。子1の子を除いて、child1にカーソルを合わせたいです。デモはこちら:codepen.io/lion5893/pen/WNQgyVx
Nam L

13

もう、単純なアプローチ(旧質問への)..
兄弟や使用などの場所要素に次のようになります。

隣接兄弟セレクター+ または 一般兄弟セレクター~

<div id="parent">
  <!-- control should come before the target... think "cascading" ! -->
  <button id="control">Hover Me!</button>
  <div id="target">I'm hovered too!</div>
</div>
#parent {
  position: relative;
  height: 100px;
}

/* Move button control to bottom. */
#control {
  position: absolute;
  bottom: 0;
}

#control:hover ~ #target {
  background: red;
}

ここに画像の説明を入力してください

ここでデモフィドル


1
これが機能するのは、#targetsがDOMの#controlの後にあることだけです(つまり、前の兄弟には影響せず、次の兄弟にのみ影響します)
Gio

10

選択した子の親を選択するためのCSSセレクターはありません。

あなたはJavaScriptでそれを行うことができます


3
本当。$(child).hover(function(){$(this).closest(parentSelector).addClass( 'hoverClass')}、function(){$(this).closest(parentSelector).removeClass( 'hoverClass')のようなもの)});
アーミルアフリディ2014年

8
@AamirAfridiそれは純粋なJSではありませんが、jQueryを使用する必要があります。
Ivotje50 2015年

6

前述のように、「選択された子の親を選択するためのCSSセレクターはありません」。

だからあなたはどちらか:


これはjavascript / jQueryソリューションの例です

JavaScript側では:

$('#my-id-selector-00').on('mouseover', function(){
  $(this).parent().addClass('is-hover');
}).on('mouseout', function(){
  $(this).parent().removeClass('is-hover');
})

そして、CSS側では、次のようになります。

.is-hover {
  background-color: red;
}

3

この解決策はデザインに完全に依存しますが、子をホバーするときに背景を変更したい親divがある場合は、::after/を使用して親を模倣することができます::before

<div class="item">
    design <span class="icon-cross">x</span>
</div>

CSS:

.item {
    background: blue;
    border-radius: 10px;
    position: relative;
    z-index: 1;
}
.item span.icon-cross:hover::after {
    background: DodgerBlue;
    border-radius: 10px;
    display: block;
    position: absolute;
    z-index: -1;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    content: "";
}

ここで完全なフィドルの例を参照してください


-1

純粋なcssソリューションを必要としない人のためのシンプルなjqueryソリューション:

    $(".letter").hover(function() {
      $(this).closest("#word").toggleClass("hovered")
    });
.hovered {
  background-color: lightblue;
}

.letter {
  margin: 20px;
  background: lightgray;
}

.letter:hover {
  background: grey;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="word">
  <div class="letter">T</div>
  <div class="letter">E</div>
  <div class="letter">S</div>
  <div class="letter">T</div>
</div>


-8

これはSassで非常に簡単に実行できます。このためにJavaScriptを深く掘り下げないでください。sassの&セレクターはまさにこれを行います。

http://thesassway.com/intermediate/referencing-parent-selectors-using-ampersand


6
-1 Sassはcssにより多くの機能を追加しません。それは単にそれを書きやすくするだけです。sassで実行できることはすべてcssで実行でき、その逆も可能です。
Dastur

3
@Dastur変数とミックスインを考えると、SassはCSSに非常に多くの機能を追加すると思います。すべてをCSSで行うことができます。これは、プレーンな古いCを使用して洗練されたソフトウェアを作成するのと同じ方法で行えます。現代の言語では、以前はできなかった機能を有効にすることなく、多くのことが追加されます。SassとCSSでも同じです。
Cobus Kruger 2016

6
@Cobus Kruger部分的には正しいですが、その比較はできません。c ++、c#、javascriptなどの言語はCに基づいている場合がありますが、実行前にCに変換されることはありません。sassは実行前にcssに変換されるため、sassスタイルシートを本当にロードすることはなく、cssのみです。
Dastur 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.