【问题标题】:Apply CSS to child DIV only仅将 CSS 应用于子 DIV
【发布时间】:2013-08-23 06:12:13
【问题描述】:

好的,假设我有一个类似的结构,如下所示:

<div comp-id='one'>
    <div comp-id='two'>
         <div comp-id='three'>
         ...
         </div>
    </div>
</div>

我想要做的就是对孩子应用悬停效果(在本例中是带有comp-id="three" 的那个)。


重要提示:我不想专门针对[comp-id="three"]。我想以 any 孩子为目标,不管是哪个comp-id 值。在现实世界的例子中,可能存在无限嵌套的[comp-id]ed divs。 我只需要最里面的孩子。

我想要达到的目标:

  • 用户将鼠标悬停在three上,然后只是突出显示three(不是one和two)
  • 用户将鼠标悬停在two 上,然后只是突出显示two(不是one - 当然也不是three)

我当前的 CSS 代码:

[comp-id]:hover {
    box-shadow: inset 0 0 0 2px red;
    -webkit-box-shadow: inset 0 0 0 2px red;
    -moz-box-shadow: inset 0 0 0 2px red;
    -o-box-shadow: inset 0 0 0 2px red;
}

但是,我当前的 CSS 突出显示了我不想要的所有内容。我可以想到一个基于 javascript 的解决方案。 CSS 呢?


警告:我不是 CSS 专家,所以这个可能真的很简单... :-)

【问题讨论】:

  • 你的 div 有定义的深度吗?然后您可以通过div div div:hover { ... } 访问它们,否则您可以使用.find() 选择器通过js 选择该div。
  • @DaKirsche 不,不幸的是没有预定义的深度。你能给我举个例子,说明在这种特殊情况下如何使用.find()?
  • 用 jQuery 找到最里面的孩子:stackoverflow.com/questions/4188933/…(在你的情况下是$('[comp-id]:not(:has([comp-id]))')。当嵌套深度没有预先确定时,我认为纯 CSS 是不可能的。
  • 现在它看起来像 stackoverflow.com/questions/10364511/… 的副本
  • @TecHunter 我已经设法回答了……我自己……哈哈。非常感谢,无论如何! :-)

标签: javascript jquery html css


【解决方案1】:

而且......好吧......感谢@BMH,这是有效的:

$('[comp-id]:not(.hover)').mousemove(function(e){
    $('[comp-id]').removeClass('hover');
    e.stopPropagation();
    $(this).addClass('hover');

});

【讨论】:

  • 我认为e.stopPropagation(); 作为第一行在事件函数中更好,但找不到我读过的地方
  • @TecHunter 嗯...有趣。我想我会听从你的建议。 :-)
【解决方案2】:

这是一个 jQuery 解决方案:

$('[comp-id]').mousemove(function(e){
    $(this).removeClass('hover');
    $(e.target).addClass('hover'); 
}).mouseleave(function(e){
    $(this).removeClass('hover');
});

http://jsfiddle.net/sMRMz/4/

【讨论】:

  • 好吧,如果我将鼠标悬停在3 上,则会突出显示 3。这是伟大的。但是,当我将鼠标悬停在 2 上时,它不是……1 也是如此……
  • 它就像您在进一步澄清之前所要求的那样工作。
  • 我已经更新了我的答案,经过多次修改,您的要求发生了显着变化。
  • 嗯,你的(最后一个)答案也没有没有解决了……谜语。但是,您已经极大地帮助了解决方案(我现在正在发布)。非常感谢! (因此,+1):-)
【解决方案3】:

在 jQuery 中尝试这样的操作:

CSS:

.hoverableClass:hover {
    box-shadow: inset 0 0 0 2px red;
    -webkit-box-shadow: inset 0 0 0 2px red;
    -moz-box-shadow: inset 0 0 0 2px red;
    -o-box-shadow: inset 0 0 0 2px red;
}

JS:

function deepSearch(parent){
    var b_ClassAdd = true;
    if (!parent){
        parent = $('body');
        b_ClassAdd = false;
    }

    var allDivChilds = parent.find('div[comp-id]');
    if ((!allDivChilds || allDivChilds.length == 0) && b_ClassAdd)
        parent.addClass('hoverableClass'); 
    else
        for (var i = 0; i < allDivChilds.length; i++)
            deepSearch($(allDivChilds[i]));
}

deepSearch();

此代码未经测试,只是一个解决方案的想法。

【讨论】:

  • $('[comp-id]:not(:has([comp-id]))').addClass('hoverableClass') ;)
  • 我明白你的建议的重点,这绝对很有趣。但是,这里有一个问题:假设我们只将最里面的孩子标记为hoverable。然后用户将鼠标悬停在其父级上,hoverable 是它的子级,而不是自身。所以我想我们应该让最里面的孩子悬停?这可行吗?
  • 该函数标记每个 div 的最里面的孩子。它将与 pawel 的注释代码相同。如果一个 div 内部没有另一个子元素,则选择具有属性 comp-id 的 div(父元素)并获取类 hoverableClass。
【解决方案4】:

您可以为此使用 '>' 子选择器来停止级联样式

[comp-id]:hover {
    box-shadow: inset 0 0 0 2px red;
    -webkit-box-shadow: inset 0 0 0 2px red;
   -moz-box-shadow: inset 0 0 0 2px red;
    -o-box-shadow: inset 0 0 0 2px red;
}

[comp-id]:hover > *{
  box-shadow: none;
    -webkit-box-shadow: none;
   -moz-box-shadow: none;
    -o-box-shadow: none;
}

【讨论】:

  • 嗯...我刚刚对其进行了测试,它似乎完全相反(= 仅突出显示父级)
  • 尝试交换样式,我想还需要一些调整。那么你可能会达到预期的效果
猜你喜欢
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多