防止 CSS :hover 样式传播

新手上路,请多包涵

在下面的示例中,当我将鼠标悬停在“X”按钮上时,列表项 hover 样式也被启用,我不希望这种情况发生。

按钮上的 hover 样式是否可以独立于 hover list-group-item 样式?诸如防止“悬停”传播之类的东西?

还有其他方法可以实现吗?也许以不同的方式组装所有这些 HTML/CSS/JS?

工作样本在这里

<ul class="list-group">
  <li class="list-group-item">
    Lalalalaiaia
                <button class="btn btn-default btn-xs pull-right remove-item">
      <span class="glyphicon glyphicon-remove"></span>
    </button>
  </li>
  <li class="list-group-item">
    Panananannaeue
                <button class="btn btn-default btn-xs pull-right remove-item">
      <span class="glyphicon glyphicon-remove"></span>
    </button>
  </li>
</ul>

CSS

 .list-group-item:hover {
  background: #fafafa;
  cursor: pointer;
}

JavaScript

   $('.list-group-item').on('click', function(){
    console.log('clicked item');
  });

  $('.remove-item').on('click', function(e){
    console.log('clicked remove-item btn');
    e.stopPropagation();
  });

更新

问题似乎是当鼠标悬停在内部 X 按钮时,鼠标实际上并没有离开“list-group-item”元素,因此它保持悬停状态。

I was able to solve it by manually dispatching mouseenter and mouseleave on the ‘list-group-item’ in the mouseleave and mouseenter ‘remove-item’ 按钮的事件,而不需要使用 ‘event.stopPropagation()‘(按钮单击处理程序除外)。

缺点是我需要一个 mouseenter 和一个 mouseleave 这两个元素的事件处理程序。我最好只使用 CSS,但这似乎是不可能的。

我只是不确定这是否是一个干净的解决方案,您怎么看?

工作样本在这里

CSS

 .list-group-item.mouseover {
  background: #fafafa;
  cursor: pointer;
}

.list-group-item .remove-item.mouseover {
  background: #aaf;
  cursor: pointer;
}

JavaScript

   // LIST-ITEM EVENT HANDLERS

  $('.list-group-item').on('mouseenter', function(e){
    $(this).addClass('mouseover');
  }).on('mouseleave', function(e){
    $(this).removeClass('mouseover');
  });

  $('.list-group-item').on('click', function(){
    console.log('clicked item');
  });

  // LIST-ITEM REMOVE BUTTON EVENT HANDLERS

  $('.remove-item').on('mouseenter', function(e){
    $(this).addClass('mouseover');
    $(this).parent().mouseleave();
  }).on('mouseleave', function(e){
    $(this).removeClass('mouseover');
    $(this).parent().mouseenter();
  });

  $('.remove-item').on('click', function(e){
    console.log('clicked remove-item btn');
    e.stopPropagation();
  });

原文由 zok 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 581
1 个回答

这不可能仅使用 CSS,除了@Pointy 描述的不太干净的方式。您可以使用 event.stopPropagation() 使用 javascript 执行此操作。所以你的悬停风格应该成为你在鼠标悬停时切换的类。

这个问题是 css 的副本:hover only affect top div of nest

原文由 Issam Zoli 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题