Масштабирование в браузере портит позицию курсора - PullRequest
0 голосов
/ 03 апреля 2020

Я хочу показать увеличенное изображение на холсте, когда вы наводите курсор на изображение. Таким образом, у меня есть тег <img>, который установлен на 100% ширины и высоты.

Это код, который я написал -

<!DOCTYPE html>
<html>
<head>
    <title>sdfsdf</title>
</head>

<style type="text/css">
    * {
        padding: 0px;
        height: 0px;
    }

    .overlay {
        position: fixed;
        z-index: 1000000000;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        display: block;
        cursor: crosshair;
        overflow: hidden;
        background: black;
    }

    .overlay img {
        width: 100%;
        height: 100%;
    }

    canvas {
        position: absolute;
        bottom: 0;
        right: 0;
        width: 180px;
        height: 140px;
        border: 1px solid red;
    }

</style>

<body>

    <div class="overlay">
        <img src="test.png" id="img"/>
        <canvas id="canvas"><canvas>
    </div>

</body>

<script type="text/javascript">

    const scale = 10;

    const canvas = document.getElementById("canvas");
    const img = document.getElementById("img");
    canvas.width = 180;
    canvas.height = 140;
    const context = canvas.getContext('2d');
    context.imageSmoothingEnabled = false;

    let mx = 0, my = 0;
    img.addEventListener("mousemove", event => 
    {
        mx = event.clientX;
        my = event.clientY;
    });

    const image = new Image();

    function loop()
    {
        context.clearRect(0, 0, canvas.width, canvas.height);

        const imgX = - mx * scale + canvas.width / 2;
        const imgY = - my * scale + canvas.height / 2;
        const imageWidth = image.width * scale;
        const imageHeight = image.height * scale;

        context.drawImage(image, 
            imgX, 
            imgY, 
            imageWidth, 
            imageHeight);

        requestAnimationFrame(loop);
    }


    image.onload = () =>
    {
        requestAnimationFrame(loop);
    }
    image.src = "test.png";

</script>

</html>

Это прекрасно работает, и изображение центрируется на холсте. Но это нарушается, когда страница увеличивается / уменьшается, изображение никогда не центрируется, и возникает странное смещение. Я попробовал кучу вещей, чтобы компенсировать смещение, но ни один из них не должен работать идеально.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...