【问题标题】:Why is the element not disappearing when mouse leaves area?为什么鼠标离开区域时元素没有消失?
【发布时间】:2021-09-16 12:58:11
【问题描述】:

当我在 media-slider-wrap 内移动光标时,滑块分页会跟随光标,这就是我想要的。但是当鼠标离开 media-slider-wrap 时,slider-paging 应该立即消失,而是一直跟随鼠标。快速移动光标...

知道如何解决这个问题吗?

Codepen供参考

$(document).ready(function(){
  $(".slider").each(function () {
      _this = $(this);

      _this.mousemove(function(e){
          var offset = _this.offset();
          var rect = e.currentTarget.getBoundingClientRect();

          var x = (e.clientX - rect.left);
          var y = (e.clientY - rect.top);

          $(this).find('.slider-paging').show();
          $(this).find('.slider-paging').css("top", y).css("left", x);

      });
      _this.mouseleave(function(e){
          $(this).find('.slider-paging').hide();
      });

  });
});
.media-slider-wrap {
  width: fit-content;
}
.slider-paging {
  position: absolute;
  top: 0;
  left: 0;
  display:none;
}
.slider-image {
  height: 500px;
  width: 500px;
  background: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<section class="media-slider-wrap">
  <div class="slider">
     <div class="slider-image"></div>
     <div class="slider-paging">1/4</div>
  </div>
</section>

【问题讨论】:

  • 你想让.slider-paging在鼠标离开红色区域时消失?
  • 是的。如果您在离开该区域的那一刻快速移动鼠标,它就会消失,但如果您慢慢移出它,它会保持...
  • 你将mouseleave绑定在比红色区域大的.media-slider-wrap上,所以当你认为鼠标应该离开红色区域,但实际上并没有离开.media-slider-wrap,所以mouseleave不是触发。
  • 但是如果我更改父容器以匹配图像的大小,我仍然有确切的问题。查看更新的 sn-p/codepen
  • 你的 .slider div 仍然是全屏宽度,这使得 .media-slider-wrap 全屏宽度

标签: javascript html jquery css


【解决方案1】:

你没有为 .media-slider-wrap 设置位置

.media-slider-wrap {
  /* margin: 100px; */
  position: relative;
  width: fit-content;
  /* make it work with firefox */
  width: -moz-fit-content;
}

【讨论】:

    【解决方案2】:

    我从 codepen 修改了你的代码,我认为它的灵感来自 Why is the element not disappearing when mouse leaves area?,它现在可以工作了。

    $(document).ready(function () {
      $(".media-slider-wrap").each(function () {
        const _this = $(this);
        _this.find('.slider-image').mousemove(function (e) {
          var offset = _this.offset();
          var rect = e.currentTarget.getBoundingClientRect();
          var x = (e.clientX - rect.left);
          var y = (e.clientY - rect.top);
          const sliderPaging = _this.find('.slider-paging');
          const moveX = x > rect.width - sliderPaging.width() ? rect.width - sliderPaging.width() : x;
          const moveY = y > rect.height - sliderPaging.height() ? rect.height - sliderPaging.height() : y;
          sliderPaging.show();
          sliderPaging
            .css("top", Math.max(moveY, rect.top))
            .css("left", Math.max(moveX, rect.left));
        });
        _this.find('.slider-image').mouseleave(function (e) {
          _this.find('.slider-paging').hide();
        });
      });
    });
    .media-slider-wrap {
      width: fit-content;
      margin-top: 100px;
      margin-left: 100px;
    }
    
    .slider-paging {
      position: absolute;
      top: 0;
      left: 0;
      display: none;
    }
    
    .slider-image {
      height: 500px;
      width: 500px;
      background: red;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <section class="media-slider-wrap">
      <div class="slider-image"></div>
      <div class="slider-paging">1/4</div>
    </section>

    【讨论】:

    • 这看起来和我的答案完全一样 stackoverflow.com/questions/69201635/…
    • 我只是在问题中玩弄这个codepen:codepen.io/mattmcgilton/pen/abwVXGY我认为这是根据你的灵感修改的版本。
    • 可能是,但你答案中的代码和我的完全一样,没有变化
    • 不完全是,我将事件绑定更改为_this.find('.slider-image'),您的代码似乎无法按预期工作,我认为因为原始codepen取决于您的代码,我从来没有打算复制您的代码,对不起为了令人困惑,我将编辑我对您的回答。
    • 你能指出我提供的答案中的错误是什么吗?
    【解决方案3】:

    问题是您的“.slider-paging”元素随光标移动,这导致mouseleave 函数无法执行。您必须确保您的“.slider-paging”元素移动到您的红框边界。将".slider-paging"topleft 限制为矩形的边界。

    条件:左侧位置应该从矩形的左端移动到矩形的右端。同样,顶部位置应该从顶端移动到底端。

    这是我所做的修复。

    $(document).ready(function () {
      $(".media-slider-wrap").each(function () {
        const _this = $(this);
        _this.mousemove(function (e) {
          var offset = _this.offset();
          var rect = e.currentTarget.getBoundingClientRect();
          var x = (e.clientX - rect.left);
          var y = (e.clientY - rect.top);
          const sliderPaging = $(this).find('.slider-paging');
          const moveX = x > rect.width - sliderPaging.width() ? rect.width - sliderPaging.width() : x;
          const moveY = y > rect.height - sliderPaging.height() ? rect.height - sliderPaging.height() : y;
          sliderPaging.show();
          sliderPaging
            .css("top", Math.max(moveY, rect.top))
            .css("left", Math.max(moveX, rect.left));
        });
        _this.mouseleave(function (e) {
          $(this).find('.slider-paging').hide();
        });
      });
    });
    .media-slider-wrap {
      width: fit-content;
    }
    
    .slider-paging {
      position: absolute;
      top: 0;
      left: 0;
      display: none;
    }
    
    .slider-image {
      height: 500px;
      width: 500px;
      background: red;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <section class="media-slider-wrap">
      <div class="slider-image"></div>
      <div class="slider-paging">1/4</div>
    </section>

    【讨论】:

    • 这在将光标左右移出红色图像时有效,但我可以将光标向下移出图像并且仍然显示滑块分页
    • @monsaic123 x 轴逻辑也适用于 y 轴。使用相同的逻辑和相关维度限制top,我已经更新了答案。请检查
    • @Niteesh 当光标从左侧或顶部离开时,这仍然不会隐藏滑块分页
    • @monsaic123 我们还要检查左边界,即左边应该是当前光标位置的最大值和矩形的左端,与顶部类似
    • @monsaic123 我已经更新了答案,请看一下
    猜你喜欢
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多