Hammer.js на пинчмове держите центр увеличения в центре экрана

#javascript #hammer.js #pinchzoom

Вопрос:

я работаю над сверхшироким панорамным изображением и очень люблю вашу библиотеку. Все обнаруживается идеально. Но у меня есть следующая проблема: мое изображение представляет собой таблицу, состоящую из 82 плиток(изображений), экспортированных с помощью gimp. Теперь, если я увеличиваю масштаб, чем больше я увеличиваю, тем больше центр изображения смещается влево, так что, когда я нахожусь на максимальном зумфакторе, я вижу совершенно другое изображение.

И еще одна вещь немного раздражает: когда я увеличиваю изображение, оно становится очень беспокойным.

 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();
});