鼠标位置缩放图片

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

思路

  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})
    `
}
相关推荐
Cache技术分享3 分钟前
386. Java IO API - 监控目录变化
前端·后端
Hooray10 分钟前
管理后台框架 AI 时代的版本答案,Fantastic-admin 6.0 它来了!
前端·前端框架·ai编程
2501_9136800018 分钟前
Vue3项目快速接入AI助手的终极方案 - 让你的应用智能升级
前端·vue.js·人工智能·ai·vue·开源软件
开开心心_Every19 分钟前
动图制作工具,拆分转视频动态照离线免费
运维·前端·人工智能·edge·pdf·散列表·启发式算法
饭后一颗花生米28 分钟前
2026 前端实战:AI 驱动下的性能优化与工程化升级
前端·人工智能·性能优化
YJlio35 分钟前
4月14日热点新闻解读:从金融数据到平台治理,一文看懂今天最值得关注的6个信号
java·前端·人工智能·金融·eclipse·电脑·eixv3
xjf771137 分钟前
AI重构前端项目指南
前端·ai·重构·编程
踩着两条虫41 分钟前
VTJ:应用场景展示
前端·vue.js·架构
恋恋风尘hhh1 小时前
Web 前端安全机制分析:以 Webpack 打包混淆为例
前端·安全·webpack
ywf12151 小时前
Spring aop 五种通知类型
java·前端·spring