为啥通用兄弟组合器并不总是有效?

Posted

技术标签:

【中文标题】为啥通用兄弟组合器并不总是有效?【英文标题】:Why is General sibling combinator not always working?为什么通用兄弟组合器并不总是有效? 【发布时间】:2012-10-26 11:16:24 【问题描述】:

我有四个 div,我想在悬停时更改它们的宽度和高度,这样你悬停的那个会展开,而所有其他的会缩小悬停的一个展开的程度。当我将鼠标悬停在第一个 div 上时,我设法让它工作,但是当我尝试对其他三个做同样的事情时,什么也没有发生。 我的 html

<div  id="main">
        <div  id="mainOne">
            <h3>text</h3>
        </div>
        <div  id="mainTwo">
            <h3>text2</h3>
        </div>
        <div  id="mainThree">
            <h3>text3</h3>
        </div>
        <div  id="mainFour">
            <h3>text4</h3>
        </div>
    </div>

我的 CSS:

/* HOVER 1 */

#mainOne:hover
width:748px;
height:600px;


#mainOne:hover + #mainTwo
width:248px;
height: 600px;


#mainOne:hover ~ #mainThree
height:200px;

#mainOne:hover ~ #mainFour
height:200px;


/* END HOVER 1 */

/* HOVER 2 */
#mainTwo:hover
width:748px;
height:600px;


#mainTwo:hover + #mainOne
width:248px;
height: 600px;

#mainTwo:hover + #mainThree
height:200px;

#mainTwo:hover ~ #mainFour
height:200px;


/* END HOVER 2 */

因此,当我将鼠标悬停在 mainOne 上时,一切都会发生变化,但是当我将鼠标悬停在 mainTwo 上时,只有 mainTwo 会发生变化并弄乱其他所有内容。我究竟做错了什么? 谢谢。

【问题讨论】:

【参考方案1】:

所有带有:hovermainTwo 规则都使用相邻的兄弟组合。

只有#mainTwo + #mainThree 不能匹配,因为#mainOne#mainFour 都不是#mainTwo 的下一个兄弟。

如果您使用通用兄弟组合器 (~),那么您也可以匹配 #mainFour

由于#mainOne precedes #mainTwo,你不能将它与依赖于#mainTwo存在的规则匹配。

【讨论】:

谢谢,我改变了组合器,但我仍然得到相同的结果。【参考方案2】:

CSS 只能 (currently) 定位 稍后 出现在 DOM 中的元素,因此 #mainTwo + #mainThree 可以工作,但 #mainTwo + #mainOne 不能。

要定位先前的兄弟姐妹,您必须将兄弟姐妹包装在另一个父元素中,然后根据该父元素的悬停设置先前的兄弟姐妹的样式。

div > div 
    border: 1px solid #000;
    padding: 0.5em 1em;
    width: 80%;
    margin: 0 auto;
    color: #f00;


#main:hover > div 
    width: 50%;


#main:hover > div:hover ~ div 
    width: 50%;


#main:hover > div:hover 
    width: 80%;

JS fiddle proof-of-concept

【讨论】:

我现在明白了问题所在,我注意到现在一切都缩小了,但 mainOne,因为它在 mainTwo 之前,但看起来这个解决方案对我来说有点太复杂了,所以我会采取我的时间来理解它。非常感谢。

以上是关于为啥通用兄弟组合器并不总是有效?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 QSplashscreen 并不总是有效?

为啥 constexpr 隐式转换并不总是有效?

为啥 JavaScript Intellisense 在 Visual Studio 2012 中并不总是有效?

在 Windows 资源管理器中选择文件并不总是有效

在材质 ui usestyles 中使用兄弟组合器

为啥 SizedBox 的存在会移动 Stack 中的兄弟姐妹?