2011-12-20 173 views
7

我有一個包含多個div的DOM結構。在視覺上,其中一些Div是其他人的子女,但在DOM Structure中,他們都是兄弟姐妹。當CSS懸停在重疊元素上時,元素的懸停狀態

我需要對「父」div的懸停狀態進行樣式設置,即使在懸停在其「子」div上時也是如此。

有沒有辦法做到這一點沒有Javscript?也許通過使用div的當前位置知道他們在另一個div裏面?


更新


的問題是父母實際上是兄弟姐妹。只有一個容器,讓我們說8個孩子的div。 2個是較大的div,另外六個在每個較大的div內顯示3個。喜歡的東西:

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

只有周圍懸停兒童應改變顏色的家長。

我無法改變DOM結構。

+0

你能發佈一些樣品標記,並告訴你要怎樣呢?看起來你想要設計一個父div,當你懸停它的一個子元素時? – 2011-12-20 18:06:24

+0

這種計算只能用JavaScript來完成。 – BoltClock 2011-12-20 18:06:47

+2

存在CSS3同級選擇:http://stackoverflow.com/questions/1817792/css-previous-sibling-selector這將意味着你的瀏覽器的現代版本的開發。 – 2011-12-20 18:06:58

回答

0

如果造型需要在一個DOM同級的懸停效果,你應該只能夠使用兄弟選擇器:

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

這將風格的孩子元素,而不是父母 – Wex 2011-12-20 18:23:51

+1

我認爲OP希望鼠標在「父」元素上,兄弟姐妹可以重疊只是一個角落,例如, – ThinkingStiff 2011-12-20 18:24:48

+0

沒錯,而且可能有超過1父。 – markitusss 2011-12-20 22:07:17

3

我不能想到一個乾淨的(甚至是黑客)的方式,只用CSS。這裏有一個Javascript方法,如果你沒有指出任何其他的東西。只需在body上設置mousemove即可。

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 2011-12-20 21:12:33

2

不,您不能通過CSS單獨影響父母或以前的兄弟姐妹。只跟隨兄弟姐妹,這對你沒有幫助。

其他人想要一個:parent僞類?

+0

什麼是':parent'僞類選擇?與':not(:empty)'相同的東西? – BoltClock 2011-12-20 23:22:12

+0

'DIV號碼:parent'將選擇含有p個元素,例如div元素。它就像是一個Linux命令:'cd/files/images /../',最終會進入'/ files'目錄。 – DanMan 2011-12-21 09:42:46

0

什麼不能做可以(經常)僞造。雖然最簡單的解決方案是重新排列DOM並使用相鄰的兄弟選擇器,但還有其他方法,那就是a)更復雜b)需要現代瀏覽器。

您可以使用僞元素來僞造父級上的懸停效果。說盤旋它的父當僞元素將是唯一可見的 - 在這種情況下:) .child和定位絕對補償.childs.parent覆蓋.parent因此看起來像父改變了狀態偏移。

Fiddle here

+0

我知道他不能更改DOM。只是想在提供不改變DOM的解決方案之前分享我的想法。 – Litek 2011-12-21 12:04:15