javascript - Hammer.js on pinchmove keep the centre of zoom in the centre of screen
问题描述
i am working an a superwide panorama image and really love your library. Everything is detected perfectly. But i have the following problem: My image is a table made of 82 tiles(images) exported with gimp. Now if i zoom, the more i zoom-in the more the centre of the image moves left so that when i am at max zoomfactor i am seeing e totally different image.
And one more thing is a bit irritating: when i zoom-in it is very fidgety.
var imageElement = document.getElementById('zoomme');
const minScale = 1;
const maxScale = 4;
const imageElementWidth = imageElement.offsetWidth;
const imageElementHeight = imageElement.offsetHeight;
let imageElementScale = 1;
let rangeMaxX = 0;
let rangeMinX = 0;
let rangeMaxY = 0;
let rangeMinY = 0;
const updateRange = () => {
const rangeX = Math.max(0, Math.round(imageElementWidth * imageElementScale) - imageElementWidth);
const rangeY = Math.max(0, Math.round(imageElementHeight * imageElementScale) - imageElementHeight);
rangeMaxX = Math.round(rangeX / 2);
rangeMinX = Math.round(0 - rangeMaxX);
rangeMaxY = Math.round(rangeY / 2);
rangeMinY = Math.round(0 - rangeMaxY);
};
const updateImage = (deltaX, deltaY) => {
const imageElementCurrentX = Math.min(Math.max(rangeMinX, deltaX), rangeMaxX) * 2;
const imageElementCurrentY = Math.min(Math.max(rangeMinY, deltaY), rangeMaxY) * 2;
const transform = `translate3d(${imageElementCurrentX}px, ${imageElementCurrentY}px, 0) scale(${imageElementScale})`;
imageElement.style.transform = transform;
imageElement.style.WebkitTransform = transform;
imageElement.style.zIndex = "9999";
};
const resetImage = () => {
imageElement.style.transform = "";
imageElement.style.WebkitTransform = "";
imageElement.style.zIndex = "";
};
const hammertime = new Hammer.Manager(imageElement, {
touchAction: "auto",
recognizers: [
[Hammer.Pinch, { enable: true }]
]
});
hammertime.get('pinch').set({ threshold: 0.05 });
hammertime.on('pinchstart', event => {
console.log('pinchstart', event);
});
hammertime.on('pinchmove', event => {
console.log('pinchmove', event);
imageElementScale = Math.min(Math.max(minScale, event.scale), maxScale);
updateRange();
updateImage(event.deltaX, event.deltaY);
});
hammertime.on('pinchend', event => {
console.log('pinchend', event);
resetImage();
});
解决方案
推荐阅读
- elasticsearch - Elasticsearch Query DSL:字段的长度,如果字段存在
- python - 使用数据库存储信息的计算机之间的通信
- javascript - Wordpress 初学者 - 自定义标题 javascript 和导航菜单集成
- python - 对象列表中列表的列表理解
- c - 在窗口中显示字符串表
- python - 为什么在索引空列表列表时python会更改每个列表?
- java - 双向链表的各种删除方法不起作用 (java)(deleteEven(); deleteMultiple())
- python - 在 CSV 文件中打印预测结果
- c# - .net 5.0 模型映射器故障排除
- reactjs - React TypeError:无法读取未定义的属性“结果”