我目前正在将断块程序编码为jQuery练习,并且我的球拍存在问题,当我将运动场留在左侧时,球拍会改变位置。
我是所有鼠标事件的新手,我尝试了许多在stackoverflow或Internet上找到的解决方案和想法,甚至更改了我的整个代码,但是我发现拥有正确位置的唯一方法是:使用mouseleave事件创建条件以更正偏移量。但是我不喜欢它,因为如果鼠标位于我之前没有的运动场之上或之下,它将引起更多的位置问题。
这可能是第二部分不起作用,但我不知道如何更改它。
racket.left = Math.min(canvasWidth - racket.width, Math.max(2, e.offsetX));
请参阅JSFiddle以了解我的意思:https://jsfiddle.net/Shilok/29wu6gj8/1/
我想要的行为与右边相同:当球拍触碰到任一侧并且鼠标不在运动场内时,球拍会停留在它所在的位置(粘在侧面!)
有什么想法吗?
答案 0 :(得分:0)
您还需要几件事
pageX
对其进行规范化,而不是总是返回相对于整个文档而言的左侧。Math.min
包裹在Math.max
中,以使其不低于0。.canvas
本身的偏移量。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>