2011-12-20 174 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