【问题标题】:Selecting only immediately hovered element in CSS for nested elements仅在 CSS 中为嵌套元素选择立即悬停的元素
【发布时间】:2016-10-17 23:31:07
【问题描述】:

我有一组嵌套的 cmets。我的目标是分别悬停每条评论时显示“回复”选项。这意味着我不希望我悬停的评论的父/兄弟/子显示“回复”选项。

我发现的唯一类似问题是:Can I control CSS selection for :hover on nested elements? 我什至不确定他的需求是否相同,而且小提琴似乎不起作用。

我准备了一个fiddle,所以你最好明白我的意思:

.comment {
  padding: 10px;
  border: 1px solid black;
  margin-top: 10px;
}
.text {} .comment:hover > .reply {
  display: inline-block;
}
.reply {
  display: none;
}
.children-comments {
  margin-left: 50px;
  margin-top: 10px;
}
<div class="comment">
  <a class="text">wohoo</a>
  <a class="reply">reply</a>
  <div class="children-comments">
    <div class="comment">
      <a class="text">wohoo</a>
      <a class="reply">reply</a>
      <div class="children-comments">

      </div>
    </div>
    <div class="comment">
      <a class="text">wohoo</a>
      <a class="reply">reply</a>
      <div class="children-comments">
        <div class="comment">
          <a class="text">wohoo</a>
          <a class="reply">reply</a>
          <div class="children-comments">
            <div class="comment">
              <a class="text">wohoo</a>
              <a class="reply">reply</a>
              <div class="children-comments">

              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
    <div class="comment">
      <a class="text">wohoo</a>
      <a class="reply">reply</a>
      <div class="children-comments">

      </div>
    </div>
  </div>
</div>

请注意,在选择器中使用&gt; 确实可以忽略兄弟元素,但它仍然会选择父元素。换句话说,无论您悬停哪个评论,它们的父级都将始终显示“回复”选项。

这完全可以用 CSS 来完成吗?我对 js 解决方案持开放态度,但如果有纯 CSS 解决方案,我会非常高兴。

【问题讨论】:

  • 完成了,我不想用无用的样板来混淆这个问题,但点明白了:)
  • 你仍然可以这样做。只需使用 sn-ps 并检查默认隐藏选项。这样你的代码就会有问题,除非展开,否则样板文件不会出现:)

标签: javascript html css css-selectors


【解决方案1】:

您最好的选择是稍微更改标记并添加一个包装器:

<div class="comment">
  <div class="content">   <!-- Here -->
    <a class="text">wohoo</a>
    <a class="reply">reply</a>
  </div>

通过为内容添加 div 包装器,您可以使用 .content:hover &gt; .reply 单独定位 cmets

例子:

.comment {
  padding: 10px;
  border: 1px solid black;
  margin-top: 10px;
}

.text {}

.content:hover > .reply {
  display: inline-block;
}

.reply {
  display: none;
}

.children-comments {
  margin-left: 50px;
  margin-top: 10px;
}
<div class="comment">
  <div class="content">
    <a class="text">wohoo</a>
    <a class="reply">reply</a>
  </div>
  <div class="children-comments">
    <div class="comment">
      <div class="content">
        <a class="text">wohoo</a>
        <a class="reply">reply</a>
      </div>
      <div class="children-comments">
        <div class="comment">
          <div class="content">
            <a class="text">wohoo</a>
            <a class="reply">reply</a>
          </div>
        </div>
        <div class="children-comments">
          <div class="comment">
            <div class="content">
              <a class="text">wohoo</a>
              <a class="reply">reply</a>
            </div>
            <div class="children-comments">
              <div class="comment">
                <div class="content">
                  <a class="text">wohoo</a>
                  <a class="reply">reply</a>
                </div>
                <div class="children-comments">

                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
      <div class="comment">
        <div class="content">

          <a class="text">wohoo</a>
          <a class="reply">reply</a>
          <div class="children-comments">
          </div>
        </div>
      </div>
    </div>
  </div>

内容包装器将扩展到评论的实际内容区域(这是最有意义的)。

但是,您也可以使用定位样式使包装器扩展到整个评论块(不仅仅是评论的内容)。例如:

/* OPTIONAL - These style changes make the content
 * wrapper cover the entire comment block.
 */
.comment {
  padding: 10px;
  border: 1px solid black;
  margin-top: 10px;
  position:relative;
}

.comment .content {
  width:100%;
  height:100%;
  position:absolute;
  top:0;
  left:0;
}

这取决于你想要的行为。

(jsFiddle example)

【讨论】:

  • 我正在尝试获取链接以在小提琴中使用您的解决方案。我找不到那里的链接。感谢您的回答!
  • 太棒了,实际上我的原始标记中已经存在“附加”div 太棒了! :) 谢谢!
  • @mezod 您可以使用我的答案运行 sn-p,或者,您可以使用这个小提琴:jsfiddle.net/fcyfscu8
【解决方案2】:

改变你的标记,而不是悬停父.comment,你可以悬停相邻的兄弟(使用+.text(因为它总是在那里)

.comment {
  padding: 10px;
  border: 1px solid black;
  margin-top: 10px;
}
.text {
  display:inline-block
}
.text:hover + .reply {
  display: inline-block;
}
.reply {
  display: none;
}
.children-comments {
  margin-left: 50px;
  margin-top: 10px;
}
<div class="comment">
  <a class="text"> wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo </a>
  <a class="reply">reply</a>
  <div class="children-comments">
    <div class="comment">
      <a class="text">wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo </a>
      <a class="reply">reply</a>
      <div class="children-comments">

      </div>
    </div>
    <div class="comment">
      <a class="text">wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo </a>
      <a class="reply">reply</a>
      <div class="children-comments">
        <div class="comment">
          <a class="text"> wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo </a>
          <a class="reply">reply</a>
          <div class="children-comments">
            <div class="comment">
              <a class="text"> wohoo wohoo wohoo wohoo  </a>
              <a class="reply">reply</a>
              <div class="children-comments">

              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
    <div class="comment">
      <a class="text"> wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo  wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo </a>
      <a class="reply">reply</a>
      <div class="children-comments">

      </div>
    </div>
  </div>
</div>

【讨论】:

  • 感谢您的回答。这确实是一个非常聪明的选择。对我来说不幸的是,我真正的标记并不是那么“简单”,而且这个解决方案不会像我期望的那样工作。但是你的方法给了我很多见解和想法,所以感谢你花时间回复:)
  • 所以下次显示完整代码,以更好地帮助您,否则我们只会为您的实际问题提供糟糕的见解。
  • 我认为这里没有必要粗鲁。我发布了一个简化版本,因为我正在使用 css 选择器寻找一个相对独立于标记的解决方案。再次感谢您的宝贵时间。
  • 我不是故意粗鲁的,对不起,如果对你来说听起来很粗鲁:) 只是想帮助你理解最好有真正的代码有一个正确的答案:)
猜你喜欢
  • 2018-05-03
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 2014-05-30
  • 2021-01-13
  • 1970-01-01
  • 2021-12-10
相关资源
最近更新 更多