jQuery:具有鼠标事件的偏移位置

时间:2019-01-08 11:25:35

标签: jquery offset mousemove

我目前正在将断块程序编码为jQuery练习,并且我的球拍存在问题,当我将运动场留在左侧时,球拍会改变位置。

我是所有鼠标事件的新手,我尝试了许多在stackoverflow或Internet上找到的解决方案和想法,甚至更改了我的整个代码,但是我发现拥有正确位置的唯一方法是:使用mouseleave事件创建条件以更正偏移量。但是我不喜欢它,因为如果鼠标位于我之前没有的运动场之上或之下,它将引起更多的位置问题。

这可能是第二部分不起作用,但我不知道如何更改它。

racket.left = Math.min(canvasWidth - racket.width, Math.max(2, e.offsetX));

请参阅JSFiddle以了解我的意思:https://jsfiddle.net/Shilok/29wu6gj8/1/

我想要的行为与右边相同:当球拍触碰到任一侧并且鼠标不在运动场内时,球拍会停留在它所在的位置(粘在侧面!)

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您还需要几件事

  1. 您使用的事件的offsetX取决于您将鼠标悬停在哪个元素上。您应该使用pageX对其进行规范化,而不是总是返回相对于整个文档而言的左侧。
  2. 您应将Math.min包裹在Math.max中,以使其不低于0。
  3. 您需要考虑.canvas本身的偏移量。
  4. 您还应该重新计算窗口的resize事件上的偏移量

var canvasWidth, racket, canvasOffset;

$(document).ready(init);

function init() {
  $(window).resize(calculate).trigger('resize');
  $(window).on('mousemove', moveRacket);
}

function calculate() {
  canvasWidth = $('.canvas').width();
  racket = {
    width: $(".racket").width()
  };
  canvasOffset = $('.canvas').offset()
}

function moveRacket(e) {
  var minLeft = Math.max(0, e.pageX - canvasOffset.left - racket.width / 2),
    maxLeft = canvasWidth - racket.width;

  racket.left = Math.max(Math.min(maxLeft, minLeft), 0);
  $('.racket').css('left', racket.left + 'px');
}
html {
  width: 100%;
  height: 100%;
}

body {
  display: flex;
  justify-content: center;
}

.canvas {
  position: absolute;
  background: green;
  width: 500px;
  height: 200px;
}

.racket {
  position: absolute;
  width: 100px;
  height: 14px;
  bottom: 12px;
  left: 0;
  background: black;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="canvas">
  <div class="racket"></div>
</div>


更新了https://jsfiddle.net/0p9ke2wa/的小提琴