为了账号安全,请及时绑定邮箱和手机立即绑定

附加到光标然后返回到原始位置

附加到光标然后返回到原始位置

婷婷同学_ 2023-04-01 17:22:46
我试图做到这一点,以便在将鼠标悬停在一个 div 上时,该 div 的子项附加到光标上,当您离开该 div 时,该子项返回到其原始位置。这是我到目前为止所拥有的:$('div').each(function() {          var img = $(this).find( "figure" );    var offset = img.offset();    var originLeft = offset.left;    var originTop = offset.top;    $('div').mousemove(function(e) {            img.addClass('active');        img.css({              transform: 'translateX(' + (e.pageX - originLeft/2 ) + 'px) translateY(' + (e.pageY - originTop) + 'px)'            });    }).mouseleave(function() {            img.removeClass('active');        img.css({              transform: 'translateX(0) translateY(0)'            });    });});div {     height: 250px;    width: 250px;    background: #eee;}div:nth-child(2) {  background: #ccc;}figure {  display: block;  height: 50px;  width: 50px;  background: blue;  margin: 0;  transition: transform 500ms ease;}.active {   transition: none; }<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script><div>    <figure></figure></div><div>    <figure></figure></div>问题是,如果页面上有多个事件,它就不起作用,而且 mouseleave 事件似乎有问题:有时它需要一秒钟或者在返回到原始位置之前有一些闪烁。
查看完整描述

2 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

使用 mouseenter 添加 mousemove 侦听器并在 mouseleave 中将其删除可以解决大部分问题。另一部分是,如果图像离开容器时鼠标正下方,则鼠标仍在 child 上方。


相对于鼠标向图像位置添加一些额外的偏移量有助于消除其余的错误


$('div').on('mouseenter', function() {

  var img = $(this).find("figure");

  var offset = img.offset();

  var originLeft = offset.left;

  var originTop = offset.top;

  // only listen to move on this instance

  $(this).mousemove(function(e) {

    img.addClass('active').css({

      transform: 'translateX(' + (e.pageX - originLeft / 2) + 'px) translateY(' + (e.pageY+10  - originTop) + 'px)'

    });

  })


}).on('mouseleave', function() {

  // remove the mousemove listener

  $(this).off('mousemove').find("figure").removeClass('active').css({

    transform: 'translateX(0) translateY(0)'

  });

});

div {

  height: 150px;

  width: 150px;

  background: #eee;

  margin-bottom: 30px

}


div:nth-child(2) {

  background: #ccc;

}


figure {

  display: block;

  height: 50px;

  width: 50px;

  background: blue;

  margin: 0;

  transition: transform 500ms ease;

}


.active {

  transition: none;

}

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div>

  <figure></figure>

</div>



<div>

  <figure></figure>

</div>


查看完整回答
反对 回复 2023-04-01
?
炎炎设计

TA贡献1808条经验 获得超4个赞

您的问题在这一行:


$('div').mousemove(function(e) {

将其更改为:


$(this).on('mousemove', function(e) {

那是因为您需要解决每个循环中您所在的当前 div 元素:


$('div').each(function() {

片段:


$('div').each(function() {

  var img = $(this).find( "figure" );

  var offset = img.offset();

  var originLeft = offset.left;

  var originTop = offset.top;

  $(this).on('mousemove', function(e) {

      img.addClass('active');

      img.css({

          transform: 'translateX(' + (e.pageX - originLeft/2 ) + 'px) translateY(' + (e.pageY - originTop) + 'px)'

      });

  }).on('mouseout', function(e) {

      img.removeClass('active');

      img.css({

          transform: 'translateX(0) translateY(0)'

      });

  });

});

div {

    height: 250px;

    width: 250px;

    background: #eee;

}


div:nth-child(2) {

    background: #ccc;

}


figure {

    display: block;

    height: 50px;

    width: 50px;

    background: blue;

    margin: 0;

    transition: transform 500ms ease;

}

.active {

    transition: none;

}

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


<div>

    <figure></figure>

</div>



<div>

    <figure></figure>

</div>


查看完整回答
反对 回复 2023-04-01
  • 2 回答
  • 0 关注
  • 258 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信