【问题标题】:CSS/JQuery Hover Affect Only Hovered Element and Not ParentCSS/JQuery 悬停只影响悬停元素而不影响父元素
【发布时间】:2013-08-01 15:06:13
【问题描述】:

我有一个嵌套项目列表,每个项目都有自己的编辑链接。

<ul>
<li>Coffee</li>
<li>
    Fruits <a href="#" class="editLink">Edit</a>
    <ul>
        <li>Banana <a href="#" class="editLink">Edit</a></li>
        <li>Orange <a href="#" class="editLink">Edit</a></li>
        <li>
            Apple <a href="#" class="editLink">Edit</a>
            <ul>
                <li>Fuji <a href="#" class="editLink">Edit</a></li>
                <li>Red Delicious <a href="#" class="editLink">Edit</a></li>
                <li>Golden <a href="#" class="editLink">Edit</a></li>
            </ul>
        </li>
    </ul>
</li>
<li>
    Drinks <a href="#" class="editLink">Edit</a>
    <ul>
        <li>Coke <a href="#" class="editLink">Edit</a></li>
        <li>Pepsi <a href="#" class="editLink">Edit</a></li>
    </ul>
</li>
<li>Something <a href="#" class="editLink">Edit</a></li>
</ul>

我只希望在将鼠标悬停在列表元素上时显示编辑链接。 目前,当我将鼠标悬停在子元素上时,父元素也会受到影响。

$('li').hover(
    function(){
        $(this).find('.editLink').show();
    },
    function(){
        $(this).find('.editLink').hide();   
    }
);

我有以下 CSS 使编辑链接最初隐藏

.editLink{
    display:none;
}

如何使只有悬停的元素显示编辑链接而不显示其他元素? 似乎隐藏部分很好,但显示部分会影响所有嵌套的父母。 以下是实际示例:http://jsfiddle.net/D7yWm/

【问题讨论】:

  • 您可以使用 mouseenter 和 mouseleave 事件,并在子级中使用它们,以免将事件传播给父级。

标签: jquery css hover


【解决方案1】:

试试这个。它使用直接子选择器 (http://jsfiddle.net/D7yWm/4/):

$(document).ready(function(){
    $('li').hover(
        function(ev){
            var li = $(this);
            li.parents('li').find('>.editLink').hide();
            if ( ! li.find('li > .editLink:visible').length ) {
                li.find('>.editLink').show();
            }
        },
        function(){
            var li = $(this);
            li.find('>.editLink').hide();
            li.parents('li:first').find('>.editLink').show();
        }
    );
});

如果您希望它仅本地化为文本,则必须将文本包装在 &lt;span&gt; 或其他东西中并使用它。

ul {
    list-style-position: inside;
}

如果这对您不起作用,您可能需要考虑另一种添加项目符号的方法。或者以此为起点来解决剩下的问题……

【讨论】:

  • 似乎几乎可以工作。如果你从上到下悬停它就可以了。但是如果你从下到上悬停,当悬停最后一个子元素时,父母会受到影响
  • 几乎......奇怪的是,如果你将鼠标悬停在子弹上,父母会受到影响
  • 更新了 CSS 以将项目符号位置移动到里面,尽管我没有看到你的问题(使用 Chrome)。
  • 我认为问题在于,当您将鼠标悬停在任何子元素上的项目符号左侧时,从技术上讲,您是在将鼠标悬停在父元素上,这就是显示父编辑链接的时候。
  • 这就是为什么我提到如果你想要特定的跨度就必须使用它的原因。要么从&lt;ul&gt; 中删除填充/边距,然后将填充添加到&lt;li&gt;s。像这样:jsfiddle.net/D7yWm/5
【解决方案2】:

您需要停止在处理程序中传播事件

$(document).ready(function(){
  $('li').hover(
      function(e){
         e.stopPropagation();
           $(this).find('.editLink').show();
      },
      function(){
           $(this).find('.editLink').hide();   
      }
   );
});

【讨论】:

  • 这几乎可以工作,除非当父级悬停时,它会悬停所有子级。
【解决方案3】:

如果您希望父母的.editlink 在您从他们转移到他们的孩子之后隐藏,那么您可以使用这个:

$('li').hover(
    function(e){
        e.stopPropagation();
        $(this).parents('li').trigger('mouseleave');
        $(this).children('.editLink').show();
    },
    function(e){
        e.stopPropagation();
        $(this).parents('li').trigger('mouseleave');
        $(this).children('.editLink').hide();
    }
);

DEMO

【讨论】:

  • 咖啡的编辑链接没有出现。由于某种原因,父编辑链接只出现了一半。我将它们从上到下和从下到上悬停。
  • 有效,除非您将鼠标从子项悬停到其父项
  • 咖啡没有编辑链接。我会调查那个孩子->父母的事情,希望能解决它
  • 不能那样做,因为当您从孩子转到父母时,您不会再次将父母悬停(您已经在其中),并且您已经触发了 mouseleave父母。
【解决方案4】:

这与您的问题并不完全相同,但它可能对其他人有所帮助。这个想法是在不影响下面父母的情况下突出显示顶部悬停的孩子:http://jsfiddle.net/skibulk/mcq6Lvw3/6/

$("div").hover(
    function (e) {
        e.stopPropagation();
        $(this).addClass('active').parents().removeClass('active');
    },
    function (e) {
        $(this).removeClass('active').parent().addClass('active');
    }
);

【讨论】:

    【解决方案5】:

    由于&lt;li&gt; 相互嵌套,因此当您将鼠标悬停在孩子上时,父母仍处于“悬停”状态。为了防止显示所有父链接,您可以遍历所有父 &lt;li&gt; 并隐藏父链接。此外,使用.children() 仅选择直接子代,而不是嵌套子代。

    $(document).ready(function(){
        $('li').hover(
            function(){
                $(this).parents('li').each(function(){$(this).children('.editLink').hide();});
                $(this).children('.editLink').show();
            },
            function(){
                $(this).find('.editLink').hide();   
            }
        );
    });
    

    这是一个有效的jsfiddle

    【讨论】:

    • 这几乎奏效了。当您从上到下悬停时,它似乎起作用。但是如果你从下到上悬停,父级仍然会受到影响。
    猜你喜欢
    • 1970-01-01
    • 2021-06-19
    • 2023-03-14
    • 1970-01-01
    • 2015-10-27
    • 2021-01-15
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    相关资源
    最近更新 更多