改变相对于鼠标指针的位置
changing position relative to mouse pointer
我找了很多类似的问题,但都无法解决我的问题。 这里我只从我的代码中粘贴了一个列表项。我需要在 list
项目上的 mousemove
事件上创建一个 span
,并在鼠标移动时从其父级设置其 left-offset。因为我从来没有尝试过任何这样的事情,所以我对代码进行了很多实验来达到这个目的-
document.querySelector("li a").addEventListener("mousemove",(event)=> {
let span;
let alreadyHasSpan = event.target.hasChildNodes().length > 1; //default length=1
if(!alreadyHasSpan) {
span = $(`<span class="a-effect"></span>`);
span.appendTo(event.target);
}
let targetLeftPos = event.target.getBoundingClientRect().left;
span.css("left",`${event.clientX-targetLeftPos}px`);
$(this).mouseleave(function () {
span.remove();
});
}, false);
a {
position: relative;
}
.a-effect {
position: absolute; left: 0;
height: 100%;
width: 2%;
background: black;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<li class="nav-item active">
<a href="/" class="nav-link">Product</a>
</li>
在我的浏览器上,span
移动但后面有 尾随符号 -
除了尾随符号外,span
也经常漏掉。在这个问题的片段上,显示问题更糟糕。
这是什么问题,我该如何解决?
我不是 100% 确定您要将 span 元素放在哪里,但是您的代码中存在一些问题,我会先更正这些问题。那么元素的位置就比较容易改变了。
首先,您将 span 元素附加到 mousemove 函数中,并在每次事件触发时检查 span 是否已经存在。将其更改为使用 mouseenter
事件创建 span
。
其次,您每次移动鼠标时都会为 link 添加一个新的 mouseleave 处理程序。与以前一样,在 mousemove
事件之外创建该处理程序。
关于你的元素的位置,我不确定你希望它appear/follow你的鼠标在哪里,但你可以很容易地调整我的 [=] 中的 offsetX
和 offsetY
变量18=] 函数以适应您的需要。
请记住,在定位元素时,计算是基于 a
元素的位置。
function moveSpan( e ) {
let $el = $(e.target);
let xPos = e.pageX;
let yPos = e.pageY;
let offsetX = $el.width() / 2;
let offsetY = $el.height() / 2;
let $span = $el.find('span');
$span.css({
'left': (xPos - offsetX) + 'px',
'top': (yPos - offsetY) + 'px'
});
}
$('li a').on('mouseenter', function( e ) {
let span = $('<span />').addClass('a-effect');
$(this).append( span );
moveSpan( e );
}).on('mousemove', function( e ) {
moveSpan( e );
}).on('mouseleave', function( e ) {
$(this).find('span').remove();
});
ul {
list-style-type: none;
}
a {
position: relative;
}
.a-effect {
position: absolute;
height: 100%;
width: 10px;
background: black;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
<li class="nav-item active">
<a href="/" class="nav-link">Product</a>
</li>
</ul>
根据您的问题,问题是每次鼠标移动时您都会添加一个新的跨度。我猜你只想在鼠标进入时添加它,并在鼠标离开时将其删除。
我已尽量保留您的代码,只更改导致您出现问题的代码。
document.querySelector("li a").addEventListener("mouseenter", (event) => {
let span;
let alreadyHasSpan = event.target.childNodes.length > 1; //default length=1
if (!alreadyHasSpan) {
span = $(`<span class="a-effect"></span>`);
span.appendTo(event.target);
}
});
document.querySelector("li a").addEventListener("mousemove", (event) => {
let targetLeftPos = event.target.getBoundingClientRect().left;
if (event.target.childNodes.length > 1) {
let span = event.target.childNodes[1];
$(span).css("left", `${event.clientX-targetLeftPos}px`);
}
});
document.querySelector("li a").addEventListener("mouseleave", (event) => {
if (event.target.childNodes.length > 1) {
let span = event.target.childNodes[1];
span.remove();
}
});
a {
position: relative;
}
.a-effect {
position: absolute;
left: 0;
height: 100%;
width: 2%;
background: black;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<li class="nav-item active">
<a href="/" class="nav-link">Product</a>
</li>
我找了很多类似的问题,但都无法解决我的问题。 这里我只从我的代码中粘贴了一个列表项。我需要在 list
项目上的 mousemove
事件上创建一个 span
,并在鼠标移动时从其父级设置其 left-offset。因为我从来没有尝试过任何这样的事情,所以我对代码进行了很多实验来达到这个目的-
document.querySelector("li a").addEventListener("mousemove",(event)=> {
let span;
let alreadyHasSpan = event.target.hasChildNodes().length > 1; //default length=1
if(!alreadyHasSpan) {
span = $(`<span class="a-effect"></span>`);
span.appendTo(event.target);
}
let targetLeftPos = event.target.getBoundingClientRect().left;
span.css("left",`${event.clientX-targetLeftPos}px`);
$(this).mouseleave(function () {
span.remove();
});
}, false);
a {
position: relative;
}
.a-effect {
position: absolute; left: 0;
height: 100%;
width: 2%;
background: black;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<li class="nav-item active">
<a href="/" class="nav-link">Product</a>
</li>
在我的浏览器上,span
移动但后面有 尾随符号 -
除了尾随符号外,span
也经常漏掉。在这个问题的片段上,显示问题更糟糕。
这是什么问题,我该如何解决?
我不是 100% 确定您要将 span 元素放在哪里,但是您的代码中存在一些问题,我会先更正这些问题。那么元素的位置就比较容易改变了。
首先,您将 span 元素附加到 mousemove 函数中,并在每次事件触发时检查 span 是否已经存在。将其更改为使用 mouseenter
事件创建 span
。
其次,您每次移动鼠标时都会为 link 添加一个新的 mouseleave 处理程序。与以前一样,在 mousemove
事件之外创建该处理程序。
关于你的元素的位置,我不确定你希望它appear/follow你的鼠标在哪里,但你可以很容易地调整我的 [=] 中的 offsetX
和 offsetY
变量18=] 函数以适应您的需要。
请记住,在定位元素时,计算是基于 a
元素的位置。
function moveSpan( e ) {
let $el = $(e.target);
let xPos = e.pageX;
let yPos = e.pageY;
let offsetX = $el.width() / 2;
let offsetY = $el.height() / 2;
let $span = $el.find('span');
$span.css({
'left': (xPos - offsetX) + 'px',
'top': (yPos - offsetY) + 'px'
});
}
$('li a').on('mouseenter', function( e ) {
let span = $('<span />').addClass('a-effect');
$(this).append( span );
moveSpan( e );
}).on('mousemove', function( e ) {
moveSpan( e );
}).on('mouseleave', function( e ) {
$(this).find('span').remove();
});
ul {
list-style-type: none;
}
a {
position: relative;
}
.a-effect {
position: absolute;
height: 100%;
width: 10px;
background: black;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
<li class="nav-item active">
<a href="/" class="nav-link">Product</a>
</li>
</ul>
根据您的问题,问题是每次鼠标移动时您都会添加一个新的跨度。我猜你只想在鼠标进入时添加它,并在鼠标离开时将其删除。
我已尽量保留您的代码,只更改导致您出现问题的代码。
document.querySelector("li a").addEventListener("mouseenter", (event) => {
let span;
let alreadyHasSpan = event.target.childNodes.length > 1; //default length=1
if (!alreadyHasSpan) {
span = $(`<span class="a-effect"></span>`);
span.appendTo(event.target);
}
});
document.querySelector("li a").addEventListener("mousemove", (event) => {
let targetLeftPos = event.target.getBoundingClientRect().left;
if (event.target.childNodes.length > 1) {
let span = event.target.childNodes[1];
$(span).css("left", `${event.clientX-targetLeftPos}px`);
}
});
document.querySelector("li a").addEventListener("mouseleave", (event) => {
if (event.target.childNodes.length > 1) {
let span = event.target.childNodes[1];
span.remove();
}
});
a {
position: relative;
}
.a-effect {
position: absolute;
left: 0;
height: 100%;
width: 2%;
background: black;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<li class="nav-item active">
<a href="/" class="nav-link">Product</a>
</li>