鼠标位置缩放图片

这几天有空研究了一下图片定点缩放。做的过程中才发现很多坑,记录一下。

思路

  1. 首先要定放缩坐标原点,这里有容器原点与图片中心点两个坐标系,任取其一即可,以下采用的是图片中心点。
  2. 基本实现思路是将图片先移动到某个位置,放缩前后鼠标位置能刚好重叠。
  3. 计算关键变量:
js 复制代码
    ratio: 当前放缩倍数 / 上一次放缩倍数
    xOffset,yOffset: 放缩后坐标点 - 放缩前坐标点,需注意坐标系转化
  1. 缩放后计算变量并应用于transform 。

(code.juejin.cn/pen/7304582...)

一、确定放缩坐标系

1.使用容器坐标系

需更改图片css属性transform-origin: 0 0,计算偏移时需将鼠标坐标转为以图片左上角坐标系为准的数据。

js 复制代码
const changeToBoxOrigin = (x, y) => {
    let imgRect = imgDom.getBoundingClientRect();
    let imgCenterX = imgRect.left; // 如容器不在左上角,得减去容器坐标
    let imgCenterY = imgRect.top;
    return { x: x - imgCenterX, y: y - imgCenterY}
}

2.使用图片中心点

计算偏移时将坐标系转为以图片中心点为准的数据。

js 复制代码
const changeToImageOrigin = (x, y) => {
    let imgRect = imgDom.getBoundingClientRect();
    let imgCenterX = imgRect.left + imgRect.width / 2; // 如容器不在左上角,得减去容器坐标
    let imgCenterY = imgRect.top + imgRect.height / 2;
    return { x: x - imgCenterX, y: y - imgCenterY}
}

二、确定本次移动偏移量

暂时抛开偏移变化。以图片中心点缩放。 则水平方向的偏移距离是x2-x1,x2 = x1 * ratio,由此推理水平方向偏移量xOffset = x1 * (ratio - 1) 同理可得出yOffset = y1 * (ratio - 1)。

那么x1,x2坐标如何获取呢。从mouseEvent中可以获取鼠标相对于容器的坐标x, y,经由坐标转化函数changeToImageOrigin即可获取到x1,y1。

三、组合数据并应用

这里需注意transform变化顺序,先平移,后缩放

js 复制代码
const scale = ref(1)
const _offset = [0, 0]
const _scale = (s, event) => {
    let x = event.x, y = event.y;
    let { x: x1, y: y1 } = changeToImageOrigin(x, y);
    let ratio = s / scale.value;
    let xOffset = x1 * (ratio - 1);
    let yOffset = y1 * (ratio - 1);
    scale.value = s;
    
    // 设置style
    imgDom.style = `
        transform: translate(${_offset[0] + xOffset}px, ${_offset[1] + yOffset}px) scale(${s})
    `
}
相关推荐
_xaboy几秒前
FormCreate 设计器 v6.3 正式发布:AI 表单助理3.0登场!
前端·vue.js·低代码·开源·表单设计器
胡志辉1 分钟前
邮件中点击“加载图片”,你的IP地址已经被泄漏
前端·后端·安全
openKaka_13 分钟前
reconcileChildren 深入:React 如何根据 ReactElement 构建子 Fiber
前端·javascript·react.js
三翼鸟数字化技术团队29 分钟前
事件循环原来这么简单!
前端
gf132111130 分钟前
python_【更新已发送的消息卡片】
java·前端·python
一点一木40 分钟前
2026 终端 AI 编码 Agent 六大工具深度横评
前端·人工智能·claude
Highcharts.js1 小时前
Highcharts React v5升级三问|最大的升级方向是什么?需要注意什么?有什么优化?
前端·javascript·react.js·前端框架·highcharts·大数据渲染·前端性能
马玉霞1 小时前
vue web端页面组件展示
前端·vue.js
代码煮茶1 小时前
Vue3 权限系统实战 | 从 0 搭建完整 RBAC 权限管理
前端·javascript·vue.js
IT_陈寒1 小时前
用了Vue的动态组件之后,我被坑得找不着北
前端·人工智能·后端