Web Dev Solutions

Catalin Mititiuc

import { default as getComputedTransformMatrix } from './utils'; function zoomIn(deltaY) { return deltaY < 0; } function getScale(deltaY, factor) { const outMult = 1 - factor; const inMult = 1 + factor / outMult return zoomIn(deltaY) ? inMult : outMult; } function getTranslateMatrix(el, clientX, clientY) { const inverseScreenCTM = el.getScreenCTM().inverse(); const translateMtx = new DOMMatrix(); const pointer = new DOMPoint(clientX, clientY) const { x, y } = pointer.matrixTransform(inverseScreenCTM); return translateMtx.translate(x, y); } function setTransform(el, computedMtx, translateMtx, scale) { const transformMtx = computedMtx.multiply(translateMtx).scale(scale).multiply(translateMtx.inverse()); el.style.transform = transformMtx; } export default function (el, factor = 0.1) { return e => { e.preventDefault(); const computedMtx = getComputedTransformMatrix(el); const scale = getScale(e.deltaY, factor); const translateMtx = getTranslateMatrix(el, e.clientX, e.clientY); setTransform(el, computedMtx, translateMtx, scale); } }