页面按 0.8 缩放显示,点图片中间位置,预览层放大后焦点偏了 120px,人物的脸跑到屏幕外,未缩放时正常。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,预览用 clientX 减去容器的 getBoundingClientRect 计算位置,rect 是视觉坐标,缩放后的布局尺寸不同,比例算错。页面 scale 变化后也没有重新取参数。
碰到「图片预览坐标」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。报错里带路径的,先去看那个路径在不在、权限对不对。
const r = img.getBoundingClientRect();
const x = (e.clientX - r.left) / r.width;
overlay.style.transformOrigin = `${x * 100}% 50%`;
同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
具体做法是,位置计算统一用 getBoundingClientRect 的比例;把 scale 从 innerWidth 与 visualViewport.width 的比值读出来参与换算;预览层用 fixed 定位 不继承页面缩放;在 0.8 和 1 两种缩放下各点四个角。
最后用这个标准收尾,缩放状态下点图片四个角,预览放大后的焦点都在点击位置附近,偏差小于 10px。
