Перейти к содержимому

Координаты JavaScript

JavaScript — это язык программирования, используемый для того, чтобы делать веб-сайты интерактивными. Он может перемещать объекты на экране или реагировать на действия пользователя. Понимание координат — числовых значений, определяющих положение на экране, — необходимо для создания интерактивных веб-страниц.

Что такое координаты в JavaScript?

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

Типы координат

Координаты относительно клиентской области

Координаты относительно клиентской области (event.clientX и event.clientY) измеряют положение мыши относительно области просмотра (видимой части окна браузера), независимо от смещения прокрутки. Вот простой пример:


html
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Client-Side Coordinates Example</title>
    <style>
#container {
  width: 100%;
  height: 100%;
  background-color: grey;
  min-height: 40px;
}
    </style>
</head>
<body style="height: 2000px;">
    <div id="container">Click anywhere in the grey area to see Client-Side coordinates!</div>
    <script>
        const container = document.getElementById('container');
        function showCoords(event) {
            alert("Client-Side X: " + event.clientX + ", Y: " + event.clientY);
        }
        container.addEventListener('click', showCoords);
    </script>
</body>
</html>

Result

Координаты относительно страницы

Координаты относительно страницы измеряют положение мыши относительно всего документа, включая области с прокруткой. Обратите внимание, что event.pageX и event.pageY устарели; современный подход использует clientX/Y вместе с window.scrollX/Y. Вот как это работает:


html
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Page-Side Coordinates Example</title>
    <style>
#container {
  width: 100%;
  height: 100%;
  background-color: grey;
  min-height: 40px;
}
    </style>
</head>
<body style="height: 2000px;">
    <div id="container">Click anywhere in this area to see Page-Side coordinates!</div>
    <script>
        const container = document.getElementById('container');
        function showPageCoords(event) {
            // pageX/pageY are deprecated; use clientX/Y + scroll offsets
            const x = event.clientX + window.scrollX;
            const y = event.clientY + window.scrollY;
            alert("Page-Side X: " + x + ", Y: " + y);
        }
        container.addEventListener('click', showPageCoords);
    </script>
</body>
</html>

Result

Координаты экрана

Координаты экрана (event.screenX и event.screenY) измеряют положение мыши относительно всего экрана, а не только окна браузера. Это полезно для отслеживания положения курсора на нескольких мониторах или в разных приложениях.


Изменение положения элементов с помощью координат

Вы можете использовать координаты, чтобы перемещать элементы на веб-странице. Метод getBoundingClientRect() возвращает размер и положение элемента относительно области просмотра, что позволяет вычислить правильное смещение для перетаскивания. Вот как можно сделать квадрат, который можно перетаскивать:

Пример: перетаскиваемый HTML-элемент


html
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Draggable Element Example</title>
    <style>
        #draggable {
            width: 100px;
            height: 100px;
            background-color: red;
            position: absolute;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <div id="draggable"></div>
    <script>
        const elem = document.getElementById('draggable');
        let shiftX, shiftY;

        function onMouseDown(event) {
            shiftX = event.clientX - elem.getBoundingClientRect().left;
            shiftY = event.clientY - elem.getBoundingClientRect().top;

            function moveAt(pageX, pageY) {
                elem.style.left = pageX - shiftX + 'px';
                elem.style.top = pageY - shiftY + 'px';
            }

            function onMouseMove(event) {
                moveAt(event.clientX + window.scrollX, event.clientY + window.scrollY);
            }

            document.addEventListener('mousemove', onMouseMove);
            document.addEventListener('mouseup', function stopDrag() {
                document.removeEventListener('mousemove', onMouseMove);
                document.removeEventListener('mouseup', stopDrag);
                elem.removeEventListener('mousedown', onMouseDown);
            });
        }

        elem.addEventListener('mousedown', onMouseDown);
        elem.addEventListener('dragstart', function() { return false; });
    </script>
</body>
</html>

Result

примечание

Для лучшей производительности рассмотрите использование transform: translate() вместо left/top для анимаций, так как это позволяет избежать перерасчётов макета. Также для совместимости с мобильными устройствами добавьте обработчики событий touchstart, touchmove и touchend вместе с событиями мыши.

Продвинутые применения: использование координат для анимации

Вы также можете заставить элементы двигаться сами по себе на веб-странице. Это отлично подходит для анимаций. Вот пример:

Пример: анимируемый движущийся объект


html
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Animation Using Coordinates</title>
</head>
<body>
    <div id="animateMe" style="width: 50px; height: 50px; background: blue; position: absolute;"></div>
    <button id="stopBtn">Stop Animation</button>
    <script>
        const target = document.getElementById('animateMe');
        const stopBtn = document.getElementById('stopBtn');
        let pos = 0;
        let isRunning = true;
        let lastTime = performance.now();

        function animate(currentTime) {
            if (!isRunning) return;
            const delta = (currentTime - lastTime) / 16; // Normalize to ~60fps
            lastTime = currentTime;
            if (pos >= 350) {
                pos = 0;
            }
            pos += delta;
            target.style.left = pos + 'px';
            requestAnimationFrame(animate);
        }

        stopBtn.addEventListener('click', () => { isRunning = false; });
        requestAnimationFrame(animate);
    </script>
</body>
</html>

Result

информация

Хотя JavaScript предоставляет мощные возможности для создания динамичных и интерактивных анимаций, CSS-анимации часто лучше подходят для более простых анимаций. CSS-анимации могут обеспечивать более плавные переходы и обычно более эффективны с точки зрения производительности, поскольку обрабатываются напрямую движком рендеринга браузера и используют меньше ресурсов CPU. Это делает CSS-анимации идеальными для эффектов вроде переходов, затуханий и базовых перемещений, особенно когда важны высокая производительность и низкое потребление ресурсов.

Заключение

Изучение координат в JavaScript помогает делать на сайтах множество интересных и полезных вещей, например перемещать элементы или заставлять их реагировать на действия пользователей. Это руководство показало, как работать с разными типами координат и как использовать их для перемещения элементов на веб-странице. Продолжайте практиковаться и пробовать новое, чтобы стать ещё лучше!

Практика

Что представляют собой координаты клиентской области в JavaScript?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.