2011-12-20 8 views
7

私はいくつかのdivを含むDOM構造を持っています。視覚的に、これらのDivのいくつかは他人の子供ですが、DOM構造ではすべて兄弟です。CSSを使用してオーバーラップする要素の上をホバーするときの要素のスタイルホバーの状態

「親」divのホバー状態を、その「子」divにカーソルを置いてもスタイルを設定する必要があります。

Javscriptなしでこれを行う方法はありますか?たぶんdivの現在の位置を使って、別のdivの中にいることを知ることができますか?


更新


問題は親が実際に兄弟です。コンテナは1つしかなく、8つの子divとしましょう。 2はより大きなdivで、残りの6つはそれぞれのより大きなdivの内側に3つ表示されます。ような何か:

http://jsfiddle.net/XazKw/12/

色を変更する必要がありホバー子どもを取り巻く親のみ。

私はDOM構造BTWを変更できません。単一の容器を持つすべての要素を囲む、その後のようなものをやっについて

どう
+0

あなたはいくつかのサンプルマークアップを投稿すると、あなたが起こるしたいものを示してもらえますか?子div要素の1つを動かすと、親divのスタイルを設定したいと思うでしょうか? –

+0

このような計算はJavaScriptでのみ行うことができます。 – BoltClock

+2

CSS3で兄弟セレクタがあります:http://stackoverflow.com/questions/1817792/css-previous-sibling-selectorこれは、ブラウザの最近のバージョンのために開発されていることを意味します。 –

答えて

0

スタイリングは、DOMの兄弟のホバー時に効果を取る場合、あなただけのはず兄弟セレクタを使用することができる:

.parent:hover ~ .child { /* styling */ } 
+0

これは、親ではなく子要素のスタイルになります – Wex

+1

OPはマウスを「親」要素よりも望んでいると思います。たとえば、角があります。 – ThinkingStiff

+0

正確には、1つ以上の親が存在する可能性があります。 – markitusss

3

私はCSSでそれをやってのクリーン(あるいはハック)方法を考えることはできません。あなたが何か他のことを理解していない場合、ここにはJavaScriptのメソッドがあります。ちょうどをbodyにトラップしてください。

function isOver(element, e) { 

    var left = element.offsetLeft, 
     top = element.offsetTop, 
     right = left + element.clientWidth, 
     bottom = top + element.clientHeight; 

    return (e.pageX > left && e.pageX < right && e.pageY > top && e.pageY < bottom); 

}; 

デモ:http://jsfiddle.net/ThinkingStiff/UhE2C/

HTML:

<div id="parent"></div> 
<div id="overlap"></div> 

CSS:

#parent { 
    border: 1px solid red; 
    height: 100px; 
    left: 50px; 
    position: relative; 
    top: 50px; 
    width: 100px; 
} 

#overlap { 
    background-color: blue; 
    border: 1px solid blue; 
    height: 100px; 
    left: 115px; 
    position: absolute; 
    top: 130px; 
    width: 100px; 
    z-index: 1; 
} 

スクリプト:

document.body.addEventListener('mousemove', function (event) { 

    if(isOver(document.getElementById('parent'), event)) { 
     document.getElementById('parent').innerHTML = 'is over!';   
    } else { 
     document.getElementById('parent').innerHTML = ''; 
    }; 

}, false);   

function isOver(element, e) { 

    var left = element.offsetLeft, 
     top = element.offsetTop, 
     right = left + element.clientWidth, 
     bottom = top + element.clientHeight; 

    return (e.pageX > left && e.pageX < right && e.pageY > top && e.pageY < bottom); 

}; 
+0

ありがとうございました。 CSSソリューションが利用できない場合は、これが有効です。 – markitusss

2

いいえ、CSSだけで親や兄弟に影響を与えることはできません。兄弟姉妹の次の兄弟だけがあなたを助けません。

誰でも:parent疑似クラスが必要ですか?

+0

':parent'疑似クラスの選択は何でしょうか? ':not(:empty)'と同じことは? – BoltClock

+0

'div p:parent'はp要素を含むdiv要素を選択します。これは 'cd/files/images /../'のLinuxコマンドのようになり、 '/ files'ディレクトリに行きます。 – DanMan

0

できないことは(しばしば)偽造することができます。最も単純な解決策は、DOMを再配置し、隣接する兄弟セレクタを使用することですが、別の方法があります。つまり、a)より複雑です。b)最新のブラウザが必要です。

擬似要素を使用すると、親に対してホバー効果を偽ることができます。それは親のホバリングするとき擬似要素のみ可視であろうと述べ - この場合.child :)と.childs親変更状態のように見えるこのよう.parentを覆う.parentからのオフセットを補償するために絶対位置。

Fiddle here

+0

私は彼がDOMを変更できないことを知っています。 DOMを変更しないソリューションを提供する前に、自分の考えを共有したいと思っていました。 – Litek

関連する問題