Как реализовать зум к курсору мышки?

Хочу реализовать зум к курсору мышки, используя аффинные трансформации. Написал, вот такой код:

const screen = document.getElementById("screen");
const world = document.getElementById("world");

const m = new DOMMatrix([1, 0, 0, 1, 0, 0]);
const p = new DOMPoint();

const OnZoom = function(e) {
  const zoom = 1 + (0.02 * Math.sign(e.deltaY));
  const rect = world.getBoundingClientRect();
  
  p.x = e.clientX - rect.x;
  p.y = e.clientY - rect.y;
  
  //m.scaleSelf(zoom, zoom, 1, p1.x, p1.y);
  
  m.translateSelf(p.x, p.y);
  m.scaleSelf(zoom, zoom);
  m.translateSelf(-p.x, -p.y);
  
  world.style.transform = m.toString();
};

screen.addEventListener("mousewheel", OnZoom);

и он кое-как работает. Но если увести курсор мышки в правый нижний угол, то зум явно начинает работать не так как положено. У блока с id="world" в CSS стоит свойcтво transform-origin: 0 0;. Подскажите пожалуйста, что я упускаю?

const screen = document.getElementById("screen");
const world = document.getElementById("world");

const m = new DOMMatrix([1, 0, 0, 1, 0, 0]);
const p = new DOMPoint();

const OnZoom = function(e) {
  const zoom = 1 + (0.02 * Math.sign(e.deltaY));
  const rect = world.getBoundingClientRect();
  
  p.x = e.clientX - rect.x;
  p.y = e.clientY - rect.y;
  
  //m.scaleSelf(zoom, zoom, 1, p1.x, p1.y);
  
  m.translateSelf(p.x, p.y);
  m.scaleSelf(zoom, zoom);
  m.translateSelf(-p.x, -p.y);
  
  world.style.transform = m.toString();
};

screen.addEventListener("mousewheel", OnZoom);
html, body {
  width: 100vw;
  height: 100vh;
  margin: 0;
  overflow: hidden;
}

.screen {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  overflow: hidden;
  background-color: #fcc;
}

.world {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  transform-origin: 0 0;
  background-color: #cfc;
  background-size: 20px 20px;
  background-image:
    linear-gradient(to right, grey 1px, transparent 1px),
    linear-gradient(to bottom, grey 1px, transparent 1px);
}

.test {
  position: absolute;
  width: 100px;
  height: 100px;
  border-radius: 50%;
  background-color: #ccf;
}

.t1 {
  top: 0;
  left: 0;
}

.t2 {
  right: 0;
  bottom: 0;
}
<div id="screen" class="screen">
  <div id="world" class="world">
    <div class="test t1"></div>
    <div class="test t2"></div>
  </div>
</div>


Ответы (0 шт):