JSFiddle - React, Tailwind, and code Playground
HTML
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" href="./styles.css">
</head>
<body>
<div id="window">
<img id="map" style="zoom: 0.5; transform: translate(0, 0);" src="https://www.tripsavvy.com/thmb/4ZAqNzgjRpAghhiVtjyMgdGHwc8=/3648x2052/smart/filters:no_upscale()/P4080411WEB-ab2cac6c987246f0b4d0b80bd42c6914.jpg" alt="">
</div>
<script type="text/javascript" src="./script.js"></script>
</body>
</html>
CSS
* {
margin: 0;
padding: 0;
}
body, html {
width: 100%;
height: 100vh;
background: #0f0f0f;
display: flex;
justify-content: center;
align-items: center;
}
#window {
width: 900px;
height: 600px;
overflow: hidden;
}
#map {
visibility: visible;
}
JavaScript
const _window = document.getElementById("window");
const map = document.getElementById("map")
let zoom = 0.5;
_window.onmousedown = (mouseDown) => {
let positionDown = getPositionCursor(mouseDown);
// Блокирую встроенный Drag'n Drop
document.ondragstart = () => { return false };
let coord = map.style.transform.match(/[0-9]*\.?[0-9]+/g);
_window.onmousemove = (mouseMove) => {
let positionMove = getPositionCursor(mouseMove);
let dX = positionMove.x - positionDown.x;
let dY = positionMove.y - positionDown.y;
map.style.transform = `translate(${+coord[0] + dX}px, ${+coord[1] + dY}px)`
};
window.onmouseup = (mouseUp) => {
_window.onmousemove = null;
_window.onmouseup = null;
document.ondragstart = null;
document.body.onselectstart = null;
};
};
function getPositionCursor(event) {
let fieldOffsetDinamic = _window.getBoundingClientRect();
return {
x: event.pageX / zoom - fieldOffsetDinamic.left,
y: event.pageY / zoom - fieldOffsetDinamic.top
};
};