Как реализовать зум к курсору мышки?
Хочу реализовать зум к курсору мышки, используя аффинные трансформации. Написал, вот такой код:
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>