4 回答

TA貢獻1815條經(jīng)驗 獲得超13個贊
e.offsetX 確定是相對于窗口的距離么?
應(yīng)該是相對于鼠標位置元素上層父級定位為相對或絕對的元素距離 沒找到就相對于body
感覺你這offsetX在 相對于網(wǎng)狀框和相對于div盒子來回切換了 所以在變

TA貢獻2011條經(jīng)驗 獲得超2個贊
offsetX,offsetY是鼠標相對于事件源元素的X,Y坐標
(事件源:當(dāng)前操作的那個元素就是事件源)
而此時在div中的還有img和span,都會成為事件源,它就GG了,不知道以哪個為參考。
怎么辦~~!把@mousemove事件改為@mousemove.self,再把img刪掉(此時鼠標事件只針對div,不刪掉的話,鼠標移到img上不會觸發(fā)div的鼠標事件),然后就會發(fā)現(xiàn)“正?!绷?/p>
但是!這也是有缺陷的,當(dāng)鼠標在遮罩上小幅度移動的時候,遮罩并不會跟著走,因為span(遮罩)也會阻止鼠標事件的觸發(fā)!(大幅度移動的時候鼠標接觸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為半透明遮罩高度(寬度)的一半(假設(shè)它為正方形)
this.isLeft = event.clientX - boxL - 75 + 'px'
this.isTop = event.clientY - boxT - 75 + 'px'
}
另外,希望你能知其然也知其所以然~(* ̄︶ ̄)

TA貢獻1829條經(jīng)驗 獲得超6個贊
修改后的表述有問題。mousemove 是冒泡的,所以相當(dāng)于接收到不同 target 發(fā)送來的事件,所以當(dāng)你使用 offsetX offsetY 這種跟元素相關(guān)的屬性,定位就會變化。于是,浮層就跑掉了,然后鼠標又回到原始圖片上面,定位恢復(fù),浮層又回來。如此反復(fù)。
解決方案有兩個:
使用 MouseEvent.x 這種元素?zé)o關(guān)的屬性,配合 div.getBoundingClientRect() 計算位置
禁掉不想觸發(fā)事件的元素,比如 <span>,方法參考下面
span {
pointer-events: none;
}
關(guān)于 pointer-events。

TA貢獻1784條經(jīng)驗 獲得超8個贊
問題已經(jīng)解決,我的思路是再單拉出來一個div,寬度和高度都與圖片窗口div一樣,鼠標移動事件在單拉出來的div上設(shè)置。代碼如下
模板
<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;
}
}
}
添加回答
舉報