用于显示后代的 CSS 选择器无法正常工作

Posted

技术标签:

【中文标题】用于显示后代的 CSS 选择器无法正常工作【英文标题】:CSS selector for showing descendants doesn't work properly 【发布时间】:2012-11-27 22:06:10 【问题描述】:

我的 html 是(只有标题)

<div id="msg_wrapper">
    <div class="msg_header media unread>
      <a class="pull-left"></a>
      <div class="media-body">
        <h4 class="media-heading">
        </h4>
      </div>
    </div>
    <div id="side" class="pull-right">
      <div id="sent_at">
        <div class="timeago" >
        </div>
      </div>
      <div id="msg_header_side">
        <div id="msg_header_icons">
        </div>
          </div>
        </div>
      </div>

css 是

    .media.unread:hover + #side  #msg_header_side
    visibility: visible;
    

    #sent_at 
        float:right;
    
    .msg_header
        position: relative;
        margin-bottom: 10px;
    

    #msg_header_side
        visibility: hidden;
    
    #msg_header_icons

        background-color: transparent;
        float: right;
    

    #side
        position: absolute;
        top: 0;
        right: 0;
    

    #msg_wrapper
        position: relative;
    

我创建了一个带有类似标签的jsfiddle,并添加了颜色来解释情况

蓝色 (#msg_header_side) 是一个带有选项的部分,当将鼠标悬停在黄色 (.msg_header) 的任何部分时应该出现的选项 问题是当前选择器(我能做的最好的)仅在鼠标光标为黄色时才显示蓝色。

像这样(屏幕截图没有捕捉到鼠标光标 - 它是黄色的):

当光标为红色时 (#side) - 蓝色消失

像这样(屏幕截图没有捕捉到鼠标光标 - 它是红色的):

我的选择器是.media.unread:hover + #side #msg_header_side 我的理解是“媒体类和悬停时未读并与 msg_header_side 作为子级将具有可见性:可见性。 效果不太好..

【问题讨论】:

.media.unread:hover + #side #msg_header_side 匹配 #msg_header_side 的 descandant 的 #side 紧跟在 .media.unread:hover 之前根据 pattern-matching 的兄弟姐妹。这不是你给出的定义。 那么有没有办法修复选择器? 【参考方案1】:

我不确定“+”号,但这应该是一些问题:

.media.unread:hover,
#side  #msg_header_side
visibility: visible;

【讨论】:

不,这是完全错误的。逗号指定第二部分是一个单独的选择器。这根本不是 OP 想要的。【参考方案2】:

您需要添加一个额外的选择器来匹配 #msg_header_side 作为 #side:hover 的除数

.media.unread:hover + #side #msg_header_side, #side:hover #msg_header_side

希望这是你想要的。

【讨论】:

这非常接近,但 #side:hover 也会显示 #msg_header_side。我需要在黄色和红色上显示蓝色(在 jsfiddle 上)。你的解决方案是黄色或红色。 @Foxedd - 因为#side 不是 .media 的 descandant,所以只要光标在 #side 上,.media 就会失去 :hover 状态。将#side 放入 .media 将解决您的问题。【参考方案3】:

我不太确定您要达到什么目的,但我认为您想采用黄色背景的 element1 和具有红色背景的 element2,如果您将两者都悬停,则应该出现蓝色的 element3。首先你应该意识到你的黄色元素没有包围红色元素,因为它们是兄弟元素,堆叠顺序告诉我们红色元素通常在它的前一个兄弟元素的顶部,这个兄弟元素必须是黄色的。通过输入红色元素,您将留下黄色元素和您的选择器:

原文:

.media.unread:hover + #side  #msg_header_side 
    visibility: visible;

告诉浏览器向我们显示具有#msg_header_side(blue) id 的元素,如果悬停带有类 .media.unread(yellow) 的#side(red) 同级元素,它必须是#side(red) 元素的子元素。

要告诉浏览器在红色元素也悬停时显示该元素,您必须将代码附加到第一行并进行如下更改:

改变:

.media.unread:hover + #side  #msg_header_side, #side:hover  #msg_header_side 
    visibility: visible;

如您所见,只有第一行被更改。

附:我为我写的一团糟感到抱歉:) 你也可以重新考虑你的选择器命名有这么多的类和 ID,它肯定会更好。

【讨论】:

以上是关于用于显示后代的 CSS 选择器无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

CSS基础知识二复合选择器元素显示模式背景三大特性注释

css后代选择器和子选择器的区别

在css中 比较 后代选择器和相邻选择器有啥区别 设计一个示例

css基础1

css选择器的1.5 子选择器

CSS系列之后代选择器子选择器和相邻兄弟选择器