我在另一个div中有一个div,当用户将鼠标悬停在父节点上时,内部div跟随鼠标位置。但是,当鼠标位于父母的边缘时,孩子的边界超出了父母的范围。我想这样做,所以孩子div的边界总是被父母包围。
我对我到目前为止所做的事情做了一个小提琴:https://jsfiddle.net/0ahqoycg
我正在考虑的一个解决方案是检查内部div top
属性是否与外部top
的某个长度有关,如果是停止鼠标位置跟踪,同样适用于左,右和底部。
有谁能告诉我,是否有一个好方法可以让孩子的父母的边界保持在其父母身边?
答案 0 :(得分:2)
.offset()
,.width()
和.height()
进行计算
允许的坐标。mouseover
个事件。//fine tune tweaks
的2个部分用于缓解最后几个部分
在超越位置越过边界之前错过的事件
边界限制。
var innerDiv = $('#inner');
var outerDiv = $('#outer');
var outDim = outerDiv.offset();
outDim.right = (outDim.left + outerDiv.width());
outDim.bottom = (outDim.top + outerDiv.height());
$(document).on('mousemove', function(e) {
var x = (e.clientX) - 15;
var y = (e.clientY) - 15;
var x_allowed = x >= outDim.left && x <= (outDim.right - innerDiv.width());
var y_allowed = y >= outDim.top && y <= (outDim.bottom - innerDiv.height());
if (y_allowed) {
innerDiv.css({
top: y + 'px',
});
} else {
//fine tune tweaks
if (y >= outDim.top) {
innerDiv.css({
top: (outDim.bottom - innerDiv.height()) + 'px',
});
}
if (y <= (outDim.bottom - innerDiv.height())) {
innerDiv.css({
top: outDim.top + 'px',
});
}
}
if (x_allowed) {
innerDiv.css({
left: x + 'px'
});
} else {
//fine tune tweaks
if (x >= outDim.left) {
innerDiv.css({
left: outDim.right - innerDiv.width() + 'px',
});
}
if (x <= (outDim.right - innerDiv.width())) {
innerDiv.css({
left: outDim.left + 'px',
});
}
}
});
#wrap {
height: 200px;
width: 200px;
border: 2px solid black;
}
#outer {
height: 100px;
width: 100px;
border: 2px solid blue;
margin: 0 auto;
}
#inner {
height: 40px;
width: 40px;
border: 2px solid red;
position: absolute;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="wrap">
<div id="outer">
<div id="inner">
</div>
</div>
</div>
答案 1 :(得分:1)
有些事情......
var innerDiv = $('#inner');
var outerDiv = $('#outer');
innerDivWidth = innerDiv.outerWidth();
innerDivHeight = innerDiv.outerHeight();
var offset = outerDiv.offset();
var l = offset.left + 15;
var t = offset.top + 15;
var h = outerDiv.outerHeight();
var w = outerDiv.outerWidth();
var maxx = l + w - innerDivWidth;
var maxy = t + h - innerDivHeight;
$(document).on('mousemove', function(e) {
if(e.clientY <= maxy && e.clientY >= t) {
$('#inner').css({
top: (e.clientY - 15) + 'px'
});
}
if(e.clientX <= maxx && e.clientX >= l) {
$('#inner').css({
left: (e.clientX - 15) + 'px'
});
}
});
要记住的一件事是,您应该在触发事件时执行代码,非常精简。特别是因为像mousemove
这样的事件每秒可以被发射数百次。
摘自Jquery Doc。
请记住,每当鼠标触发mousemove事件 指针移动,即使对于一个像素。这意味着数百个事件 可以在很短的时间内生成。如果处理程序有 做任何重要的处理,或者如果有多个处理程序 事件存在,这可能会严重影响浏览器的性能。 因此,重要的是优化鼠标移动处理程序 可能的,并且一旦不再需要它们就解开它们。