4 回答

TA贡献1815条经验 获得超13个赞
e.offsetX 确定是相对于窗口的距离么?
应该是相对于鼠标位置元素上层父级定位为相对或绝对的元素距离 没找到就相对于body
感觉你这offsetX在 相对于网状框和相对于div盒子来回切换了 所以在变

TA贡献2011条经验 获得超2个赞
offsetX,offsetY是鼠标相对于事件源元素的X,Y坐标
(事件源:当前操作的那个元素就是事件源)
而此时在div中的还有img和span,都会成为事件源,它就GG了,不知道以哪个为参考。
怎么办~~!把@mousemove事件改为@mousemove.self,再把img删掉(此时鼠标事件只针对div,不删掉的话,鼠标移到img上不会触发div的鼠标事件),然后就会发现“正常”了
但是!这也是有缺陷的,当鼠标在遮罩上小幅度移动的时候,遮罩并不会跟着走,因为span(遮罩)也会阻止鼠标事件的触发!(大幅度移动的时候鼠标接触div,span才会跟过去)
所以~鼠标跟随移动还是使用下面这种方法吧,给你写了例子,仅供参考,边缘判断还需要你自己写一下哦,
<div class='box'
ref='box'
@mousemove="handleMousemove">
<img src="xxx" />
<span class='mask'
:style="{left: isLeft, top: isTop}"></span>
</div>
handleMousemove() {
// 图片离body的距离
const boxL = this.$refs.box.offsetLeft
const boxT = this.$refs.box.offsetTop
// 75为半透明遮罩高度(宽度)的一半(假设它为正方形)
this.isLeft = event.clientX - boxL - 75 + 'px'
this.isTop = event.clientY - boxT - 75 + 'px'
}
另外,希望你能知其然也知其所以然~(* ̄︶ ̄)

TA贡献1829条经验 获得超6个赞
修改后的表述有问题。mousemove 是冒泡的,所以相当于接收到不同 target 发送来的事件,所以当你使用 offsetX offsetY 这种跟元素相关的属性,定位就会变化。于是,浮层就跑掉了,然后鼠标又回到原始图片上面,定位恢复,浮层又回来。如此反复。
解决方案有两个:
使用 MouseEvent.x 这种元素无关的属性,配合 div.getBoundingClientRect() 计算位置
禁掉不想触发事件的元素,比如 <span>,方法参考下面
span {
pointer-events: none;
}
关于 pointer-events。

TA贡献1784条经验 获得超8个赞
问题已经解决,我的思路是再单拉出来一个div,宽度和高度都与图片窗口div一样,鼠标移动事件在单拉出来的div上设置。代码如下
模板
<div
class="goods_description_pic"
@mouseenter="showcheckeddetailelement=true"
@mouseleave="showcheckeddetailelement=false">
<img
class="productimg"
:src="productinformation.productimg">
<span
v-show="showcheckeddetailelement"
@mouseenter="showcheckeddetailelement=true"
class="goods_description_detailed_see"
:style="{ left: followcheckedx+'px', top: followcheckedy+'px'}"></span>
<div
class="detial_see_wrap"
@mousemove="checkeddetailproduct($event)">
</div>
</div>
js
methods: {
checkeddetailproduct (e){
this.followcheckedx = e.offsetX -75;
this.followcheckedy = e.offsetY - 75;
/* 边缘判断*/
if(this.followcheckedx>=150){
this.followcheckedx=150;
}
if(this.followcheckedy>=150){
this.followcheckedy=150;
}
if(this.followcheckedx<0){
this.followcheckedx=0;
}
if(this.followcheckedy<0){
this.followcheckedy=0;
}
}
}
添加回答
举报