Vue中辅助线跟随元素时位置偏移怎么解决?
在做可视化编辑器时,给元素添加辅助线提示,但拖拽元素时辅助线总是比元素实际位置偏移5像素,尝试过计算offsetParent和getBoundingClientRect都不对
<template>
<div
class="canvas"
@mousemove="updateGuide"
:style="{ transform: <code>scale(${scale})</code> }"
>
<div
v-for="item in items"
:style="item.style"
@drag="onDrag"
></div>
<div
v-if="guideX !== null"
class="horizontal-guide"
:style="{ left: guideX + 'px' }"
></div>
<div
v-if="guideY !== null"
class="vertical-guide"
:style="{ top: guideY + 'px' }"
></div>
</div>
</template>
已经用console.log对比过鼠标坐标和辅助线位置,发现x轴始终差5px,y轴差3px。检查过CSS定位方式都用了absolute,但父容器有scale变换可能影响计算?
transform: scale(),这会导致子元素的坐标计算出现偏差。鼠标事件的坐标是基于视口的绝对位置,但scale缩放后,元素的实际渲染位置和计算出来的位置就不一致了。解决办法有两种:
第一种简单粗暴,直接在设置辅助线位置时反向补偿缩放带来的偏移:
第二种方法稍微优雅点,避免手动算缩放,把canvas包在一个不带scale的外层容器里,所有坐标计算都在这个外层容器内进行。不过你现在的代码改起来可能要多动几行。
对了,5px和3px这个偏差其实就是scale导致的四舍五入误差,不用太纠结具体差多少,解决了根本原因就OK了。试试上面的代码,应该能搞定。