js получить координаты
Для получения координат в JavaScript существует несколько способов, в зависимости от того, что именно требуется получить: координаты курсора на странице или географические координаты местоположения пользователя.
Разберем случай для получения координат курсора: Для этого можно использовать событие mousemove и свойства объекта event , которые позволяют получить координаты указателя мыши относительно окна браузера или относительно элемента на странице.
document.addEventListener('mousemove', (event) => // координата X относительно окна браузера const mouseX = event.clientX; // координата Y относительно окна браузера const mouseY = event.clientY; // координата X относительно элемента, на котором произошло событие const elementX = event.offsetX; // координата Y относительно элемента, на котором произошло событие const elementY = event.offsetY; console.log(`Координаты мыши: X = $mouseX>, Y = $mouseY>`); console.log( `Координаты относительно элемента: X = $elementX>, Y = $elementY>` ); >);
Размер и координаты элемента
В JavaScript иногда нужно узнать размеры элемента. Использовать для этого CSS свойства неудобно, потому что они не всегда содержат нужную информацию. Для этих целей используются свойства DOM объектов. Они содержат размеры элементов в пикселях. Но они позволяют только получить размеры. Если нужно их изменить, то меняются CSS свойства элемента.
Свойства offsetHeight и offsetWidth содержат общие высоту и ширину элемента вместе с рамкой.
Для примера создадим страницу с таким блоком:
Текст в блоке
Получим размеры этого блока:
let div = document.querySelector('div'); console.log('Высота блока ' + div.offsetHeight); console.log('Ширина блока ' + div.offsetWidth);
Свойства clientHeight и clientWidth содержат размеры блока без рамки. Они включают содержимое и внутренние отступы.

Эти свойства показывают реальный размер содержимого. Они не всегда соответствуют CSS свойствам элемента. Если элемент имеет полосу прокрутки, то она занимает определённое место внутри содержимого и не входит в свойства clientHeight и clientWidth .
Получим размеры контента для созданного ранее блока:
console.log('Высота содержимого ' + div.clientHeight); console.log('Ширина содержимого ' + div.clientWidth);
Координаты элемента
Координаты элементов в JavaScript расчитываются в пикселях и отмеряются от верхнего левого угла. Для получения координат относительно окна браузера используется метод getBoundingClientRect() . Он возвращает объект, содержащий координаты элемента. Объект имеет такие свойства:
top — координата Y верхнего края элемента
left — координата X левого края элемента
bottom — координата Y нижнего края элемента
right — координата X правого края элемента
Эти координаты похожи на те, которые задаются при фиксированном позиционировании элемента. Однако, между ними есть важное отличие. Левые и верхние координаты определяются одинаково, поэтому совпадают. А вот нижние и правые координаты определяются по-разному. При позиционировании правая координата отсчитывается от правого края окна. А при определении координат правая координата отсчитывается от левого края окна. То же самое относится и к нижней координате. При позиционировании отсчёт производится от нижнего края окна, а при определении координат отсчёт производится от верхнего края окна.
Если страница уже прокручена, и элемент находится выше или левее окна браузера, то координаты могу иметь отрицательные значения.
Не забывайте, что в большинстве браузеров страница имеет отступы от границ окна. Если эти отступы не отменены, то даже первый элемент на странице сначала имеет не нулевые координаты.
Определим координаты блока:
let coord = div.getBoundingClientRect(); console.log('Левый край '+coord.left); console.log('Верхний край '+coord.top);
Коприрование материалов сайта возможно только с согласия администрации
2017 — 2023 © basecourse.ru Все права защищены
Координаты
Когда нужно расположить объект в произвольном месте на странице, нужно не перепутать верх и низ.
Время чтения: 6 мин
Открыть/закрыть навигацию по статье
- Кратко
- Как пишется
- Как понять
- Смещение относительно окна браузера
- Смещение относительно документа
- На практике
- Егор Огарков советует
Контрибьюторы:
Обновлено 12 сентября 2022
Кратко
Чтобы перемещать и позиционировать элементы на экране в браузере имеется система координат. Оси координат начинаются в левом верхнем углу экрана и идут вправо для оси x и вниз для оси y.
Позиционирование с помощью координат может быть относительно окна браузера или относительно отдельного элемента. Всего существует две системы координат: одна начинается от угла HTML-страницы (документа), а вторая от угла окна браузера. С помощью первой можно определять как элемент расположен относительно всей страницы, а с помощью второй – как элемент расположен относительно окна браузера и того что там находится. Объекты события мыши и тач-события содержат координаты места на экране и в документе, где событие произошло: page X / page Y – для документа, client X / client Y – для экрана.
Координатами элемента является расстояние в пикселях от осей системы координат до его левого верхнего угла. С помощью метода элемента get Bounding Client Rect ( ) можно получить подробные данные о координатах элемента и его размере.
Как пишется
document.addEventListener('click', event => console.log('Позиция x относительно документа', event.pageX) console.log('Позиция y относительно документа', event.pageY) console.log('Позиция x относительно экрана', event.clientX) console.log('Позиция y относительно экрана', event.clientY)>, false) // const rect = element.getBoundingClientRect()document.addEventListener('click', event => console.log('Позиция x относительно документа', event.pageX) console.log('Позиция y относительно документа', event.pageY) console.log('Позиция x относительно экрана', event.clientX) console.log('Позиция y относительно экрана', event.clientY) >, false) // const rect = element.getBoundingClientRect()Как понять
Система координат в браузере аналогична плоской системе координат из школьной алгебры. Есть две оси: ось y и ось x, на этой плоскости располагаются все элементы сайта. Единственным отличием от классической системы координат является то, что положительное направление оси y в браузере повёрнуто вниз. Это значит, что элементы с положительным значением по оси y будут находиться внизу относительно оси x, а с отрицательным – наверху.
Позиция элемента задаётся числом пикселей от начала системы координат по соответствующей оси.
Начало системы координат можно отсчитывать относительно окна браузера, либо относительно всего документа. Когда страница не прокручена, то начала этих осей совпадают в левом верхнем углу окна. Если прокручивать страницу вниз, то соответственно начало координат документа останется таким же, а начало оси координат окна будет смещаться. Такое разделение может быть полезно для разных задач, например можно анимировать элементы, только когда они попадают на экран, считая координаты относительно документа. А можно давать перетаскивать какой-либо элемент, но только в пределах окна браузера.
На рисунках page X и page Y – оси системы координат относительно документа, а client X и client Y – оси системы координат относительно окна браузера. Соответственно page X Offset и page Y Offset – это смещение относительно всего документа, а client X Offset и client Y Offset – относительно окна. На практике используются очень похожие названия, потому для текущих примеров будем использовать их.
Ниже схема осей координат, когда страница не прокручена. В таком состоянии оси совпадают, и координаты элементов относительно окна и относительно документа будут совпадать.

Но если прокрутить страницу (например вниз), но ситуация изменится. Начало документа уйдёт наверх, а значит и начало осей координат. Оси координат окна теперь будут начинаться там, где мы остановим прокрутку.

Стоит обратить внимание на то, что координаты – это расстояние от осей до его верхнего левого угла. Потому стрелки на схеме начинаются от угла элемента с текстом Button.
Смещение относительно окна браузера
В объекте события мыши из полей client X / client Y можно узнать в каком месте относительно системы координат окна произошло событие, например клик.
Если нужно узнать как элемент расположен относительно окна, то в этом поможет метод get Bounding Client Rect ( ) . Вызов этого метода возвращает объект с полями x , y , top , left , right , bottom , width и height , то есть полная информация о геометрии элемента. В полях x и y содержатся координаты элемента.
Позиционирование относительно окна гораздо проще понять, если посмотреть, как располагается элемент с position : fixed . Элемент с этим свойством будет находиться в окне в одних и те же координатах, вне зависимости от того насколько прокручен документ.
Смещение относительно документа
Если нужно получить данные, в каком месте документа произошло событие, то это можно узнать из полей page X / page Y в объекте события.
Информацию о том, как элемент расположен относительно документа нельзя узнать из какого-то свойства или метода, её необходимо вычислять самостоятельно. Самым простым способом это можно сделать сложив координаты относительно окна из метода get Bounding Client Rect ( ) со смещением самого окна относительно документа. Смещение окна браузера можно узнать из полей window . page X Offset и window . page Y Offset – это число пикселей на которое прокручен документ по горизонтали и вертикали.
const rect = element.getBoundingClientRect() console.log('Смещение X относительно документа:', rect.x + pageXOffset)console.log('Смещение Y относительно документа:', rect.y + pageYOffset)const rect = element.getBoundingClientRect() console.log('Смещение X относительно документа:', rect.x + pageXOffset) console.log('Смещение Y относительно документа:', rect.y + pageYOffset)Позиционирование относительно документа так же можно понять, если посмотреть как располагается элемент с position : absolute . При прокрутке окна этот элемент будет смещаться вместе с ним.
Наглядно как работают оси, и как располагаются элементы можно посмотреть в демо. В начальном состоянии положения осей и элементов, которые расположены относительно них совпадают. Оси относительно экрана сделаны крупнее, чтобы их было видно всегда. Если прокрутить страницу по вертикали или горизонтали будет видно как оси относительно экрана остаются на месте, а оси относительно документа уходят вместе с движением прокрутки.
На практике
Егор Огарков советует
С помощью значения координат можно узнавать какой элемент находится в окне по этим координатам. Метод document . element From Point ( ) возвращает элемент по переданным ему координатам.
const x = 100const y = 200 const foundElement = document.elementFromPoint(x, y)const x = 100 const y = 200 const foundElement = document.elementFromPoint(x, y)Метод вернёт самый глубоко вложенный элемент в DOM-дереве по этим координатам, который может оказаться не тем, что вам нужен.
Координаты чаще всего используются для создания поведения перетаскивания элементов по экрану. Используя client X / client Y или page X / page Y из события можно менять координаты самого элемента.
Координаты
Чтобы передвигать элементы по экрану, нам следует познакомиться с системами координат.
Большинство соответствующих методов JavaScript работают в одной из двух указанных ниже систем координат:
- Относительно окна браузера – как position:fixed , отсчёт идёт от верхнего левого угла окна.
- мы будем обозначать эти координаты как clientX/clientY , причина выбора таких имён будет ясна позже, когда мы изучим свойства событий.
- Относительно документа – как position:absolute на уровне документа, отсчёт идёт от верхнего левого угла документа.
- мы будем обозначать эти координаты как pageX/pageY .
Когда страница полностью прокручена в самое начало, то верхний левый угол окна совпадает с левым верхним углом документа, при этом обе этих системы координат тоже совпадают. Но если происходит прокрутка, то координаты элементов в контексте окна меняются, так как они двигаются, но в то же время их координаты относительно документа остаются такими же.
На приведённой картинке взята точка в документе и показаны её координаты до прокрутки (слева) и после (справа):
При прокрутке документа:
- pageY – координата точки относительно документа осталась без изменений, так как отсчёт по-прежнему ведётся от верхней границы документа (сейчас она прокручена наверх).
- clientY – координата точки относительно окна изменилась (стрелка на рисунке стала короче), так как точка стала ближе к верхней границе окна.
Координаты относительно окна: getBoundingClientRect
Метод elem.getBoundingClientRect() возвращает координаты в контексте окна для минимального по размеру прямоугольника, который заключает в себе элемент elem , в виде объекта встроенного класса DOMRect.
Основные свойства объекта типа DOMRect :
- x/y – X/Y-координаты начала прямоугольника относительно окна,
- width/height – ширина/высота прямоугольника (могут быть отрицательными).
Дополнительные, «зависимые», свойства:
- top/bottom – Y-координата верхней/нижней границы прямоугольника,
- left/right – X-координата левой/правой границы прямоугольника.
Кликните на кнопку, чтобы увидеть её координаты относительно окна:
Если вы прокрутите страницу, то расположение кнопки в окне поменяется, и, соответственно, её координаты в контексте окна тоже (при вертикальной прокрутке – y/top/bottom ).
Вот картинка с результатами вызова elem.getBoundingClientRect() :
Как вы видите, x/y и width/height уже точно задают прямоугольник. Остальные свойства могут быть легко вычислены на их основе:
- left = x
- top = y
- right = x + width
- bottom = y + height
- Координаты могут считаться с десятичной частью, например 10.5 . Это нормально, ведь браузер использует дроби в своих внутренних вычислениях. Мы не обязаны округлять значения при установке style.left/top .
- Координаты могут быть отрицательными. Например, если страница прокручена так, что элемент elem ушёл вверх за пределы окна, то вызов elem.getBoundingClientRect().top вернёт отрицательное значение.
Зачем вообще нужны зависимые свойства? Для чего существуют top/left , если есть x/y ?
С математической точки зрения, прямоугольник однозначно задаётся начальной точкой (x,y) и вектором направления (width,height) .
Так что дополнительные зависимые свойства существуют лишь для удобства.
Что же касается top/left , то они на самом деле не всегда равны x/y . Технически, значения width/height могут быть отрицательными. Это позволяет задать «направленный» прямоугольник, например, для выделения мышью с отмеченным началом и концом.
То есть, отрицательные значения width/height означают, что прямоугольник «растет» влево-вверх из правого угла.
Вот прямоугольник с отрицательными width и height (например, width=-200 , height=-100 ):
Как вы видите, свойства left/top при этом не равны x/y .
Впрочем, на практике результат вызова elem.getBoundingClientRect() всегда возвращает положительные значения для ширины/высоты. Здесь мы упомянули отрицательные width/height лишь для того, чтобы вы поняли, зачем существуют эти с виду дублирующие свойства.
Internet Explorer и Edge: не поддерживают x/y
Internet Explorer и Edge не поддерживают свойства x/y по историческим причинам.
Таким образом, мы можем либо сделать полифил (добавив соответствующие геттеры в DomRect.prototype ), либо использовать top/left , так как это всегда одно и то же при положительных width/height , в частности – в результате вызова elem.getBoundingClientRect() .
Координаты right/bottom отличаются от одноимённых CSS-свойств
Есть очевидное сходство между координатами относительно окна и CSS position:fixed .
Но в CSS свойство right означает расстояние от правого края, и свойство bottom означает расстояние от нижнего края окна браузера.
Если взглянуть на картинку выше, то видно, что в JavaScript это не так. Все координаты в контексте окна считаются от верхнего левого угла, включая right/bottom .
elementFromPoint(x, y)
Вызов document.elementFromPoint(x, y) возвращает самый глубоко вложенный элемент в окне, находящийся по координатам (x, y) .
let elem = document.elementFromPoint(x, y);Например, код ниже выделяет с помощью стилей и выводит имя тега элемента, который сейчас в центре окна браузера:
let centerX = document.documentElement.clientWidth / 2; let centerY = document.documentElement.clientHeight / 2; let elem = document.elementFromPoint(centerX, centerY); elem.style.background = "red"; alert(elem.tagName);Поскольку используются координаты в контексте окна, то элемент может быть разным, в зависимости от того, какая сейчас прокрутка.
Для координат за пределами окна метод elementFromPoint возвращает null
Метод document.elementFromPoint(x,y) работает, только если координаты (x,y) относятся к видимой части содержимого окна.
Если любая из координат представляет собой отрицательное число или превышает размеры окна, то возвращается null .
Вот типичная ошибка, которая может произойти, если в коде нет соответствующей проверки:
let elem = document.elementFromPoint(x, y); // если координаты ведут за пределы окна, то elem = null elem.style.background = ''; // Ошибка!Применение для fixed позиционирования
Чаще всего нам нужны координаты для позиционирования чего-либо.
Чтобы показать что-то около нужного элемента, мы можем вызвать getBoundingClientRect , чтобы получить его координаты, а затем использовать CSS-свойство position вместе с left/top (или right/bottom ).
Например, функция createMessageUnder(elem, html) ниже показывает сообщение под элементом elem :
let elem = document.getElementById("coords-show-mark"); function createMessageUnder(elem, html) < // создаём элемент, который будет содержать сообщение let message = document.createElement('div'); // для стилей лучше было бы использовать css-класс здесь message.style.cssText = "position:fixed; color: red"; // устанавливаем координаты элементу, не забываем про "px"! let coords = elem.getBoundingClientRect(); message.style.left = coords.left + "px"; message.style.top = coords.bottom + "px"; message.innerHTML = html; return message; >// Использование: // добавим сообщение на страницу на 5 секунд let message = createMessageUnder(elem, 'Hello, world!'); document.body.append(message); setTimeout(() => message.remove(), 5000);Кликните кнопку, чтобы увидеть пример в действии:
Кнопка с сообщение появится под ней
Код можно изменить, чтобы показывать сообщение слева, справа, снизу, применять к нему CSS-анимации и так далее. Это просто, так как в нашем распоряжении имеются все координаты и размеры элемента.
Но обратите внимание на одну важную деталь: при прокрутке страницы сообщение уплывает от кнопки.
Причина весьма очевидна: сообщение позиционируется с помощью position:fixed , поэтому оно остаётся всегда на том же самом месте в окне при прокрутке страницы.
Чтобы изменить это, нам нужно использовать другую систему координат, где сообщение позиционировалось бы относительно документа, и свойство position:absolute .
Координаты относительно документа
В такой системе координат отсчёт ведётся от левого верхнего угла документа, не окна.
В CSS координаты относительно окна браузера соответствуют свойству position:fixed , а координаты относительно документа – свойству position:absolute на самом верхнем уровне вложенности.
Мы можем воспользоваться свойствами position:absolute и top/left , чтобы привязать что-нибудь к конкретному месту в документе. При этом прокрутка страницы не имеет значения. Но сначала нужно получить верные координаты.
Не существует стандартного метода, который возвращал бы координаты элемента относительно документа, но мы можем написать его сами.
Две системы координат связаны следующими формулами:
- pageY = clientY + высота вертикально прокрученной части документа.
- pageX = clientX + ширина горизонтально прокрученной части документа.
Функция getCoords(elem) берёт координаты в контексте окна с помощью elem.getBoundingClientRect() и добавляет к ним значение соответствующей прокрутки:
// получаем координаты элемента в контексте документа function getCoords(elem) < let box = elem.getBoundingClientRect(); return < top: box.top + window.pageYOffset, right: box.right + window.pageXOffset, bottom: box.bottom + window.pageYOffset, left: box.left + window.pageXOffset >; >Если бы в примере выше мы использовали её вместе с position:absolute , то при прокрутке сообщение оставалось бы рядом с элементом.
Модифицированная функция createMessageUnder :
function createMessageUnder(elem, html)
Итого
Любая точка на странице имеет координаты:
- Относительно окна браузера – elem.getBoundingClientRect() .
- Относительно документа – elem.getBoundingClientRect() плюс текущая прокрутка страницы.
Координаты в контексте окна подходят для использования с position:fixed , а координаты относительно документа – для использования с position:absolute .
Каждая из систем координат имеет свои преимущества и недостатки. Иногда будет лучше применить одну, а иногда – другую, как это и происходит с позиционированием в CSS, где мы выбираем между absolute и fixed .
Задачи
Найдите координаты точек относительно окна браузера
важность: 5
В ифрейме ниже располагается документ с зелёным «полем».
Используйте JavaScript, чтобы найти координаты углов, обозначенных стрелками.
В документе уже реализована функциональность, когда при клике на любом месте показываются соответствующие координаты.
Ваш код должен при помощи DOM получить четыре пары координат:
- верхний левый, внешний угол (это просто).
- нижний правый, внешний угол (тоже просто).
- верхний левый, внутренний угол (чуть сложнее).
- нижний правый, внутренний угол (есть несколько способов, выберите один).
Координаты, вычисленные вами, должны совпадать с теми, которые возвращаются по клику мыши.
P.S. Код должен работать, если у элемента другие размеры или есть рамка, без привязки к конкретным числам.
Внешние углы
Внешние углы
Координаты внешних углов – это как раз то, что возвращает функция elem.getBoundingClientRect().
Координаты верхнего левого внешнего угла будут в переменной answer1 и нижнего правого – в answer2 :
let coords = elem.getBoundingClientRect(); let answer1 = [coords.left, coords.top]; let answer2 = [coords.right, coords.bottom];Верхний левый внутренний угол
Верхний левый внутренний угол
Тут значения отличаются на ширину рамки. Надёжный способ получить интересующее значение – это использовать clientLeft/clientTop :
let answer3 = [coords.left + field.clientLeft, coords.top + field.clientTop];Нижний правый внутренний угол
Нижний правый внутренний угол
В нашем случае нужно вычесть размеры рамки из внешних координат.
Это может быть сделано с помощью CSS:
let answer4 = [ coords.right - parseInt(getComputedStyle(field).borderRightWidth), coords.bottom - parseInt(getComputedStyle(field).borderBottomWidth) ];Другим вариантом решения было бы добавление clientWidth/clientHeight к координатам верхнего левого угла. Так даже было бы лучше.
let answer4 = [ coords.left + elem.clientLeft + elem.clientWidth, coords.top + elem.clientTop + elem.clientHeight ];Покажите заметку рядом с элементом
важность: 5
Создайте функцию positionAt(anchor, position, elem) , которая позиционирует элемент elem в зависимости от значения свойства position рядом с элементом anchor .
Аргумент position – строка с одним из 3 значений:
- «top» – расположить elem прямо над anchor
- «right» – расположить elem непосредственно справа от anchor
- «bottom» – расположить elem прямо под anchor
Она используется внутри функции showNote(anchor, position, html) , которая уже есть в исходном коде задачи. Она создаёт и показывает элемент-«заметку» с текстом html на заданной позиции position рядом с элементом anchor .
В этой задаче нам нужно только аккуратно вычислить координаты. Смотрите код для изучения деталей реализации.
Обратите внимание, что элементы должны уже быть в документе перед чтением offsetHeight и других свойств. Спрятанный ( display:none ) элемент или элемент вне документа не имеют размеров.
Покажите заметку около элемента (абсолютное позиционирование)
важность: 5
Измените код решения предыдущего задания так, чтобы элемент заметки использовал свойство position:absolute вместо position:fixed .
Это предотвратит расхождение элементов при прокрутке страницы.
Используйте решение предыдущего задания для начала. Чтобы проверить решение в условиях с прокруткой, добавьте стиль элементу .
Решение достаточно простое:
- Используйте position:absolute в CSS вместо position:fixed для элемента с классом .note .
- Используйте функцию getCoords() из главы Координаты, чтобы получить координаты относительно документа.
Расположите заметку внутри элемента (абсолютное позиционирование)
важность: 5
Усовершенствуйте решение предыдущего задания Покажите заметку около элемента (абсолютное позиционирование): научите функцию positionAt(anchor, position, elem) вставлять elem внутрь anchor .
Новые значения для аргумента position :
- top-out , right-out , bottom-out – работают так же, как раньше, они вставляют elem сверху/справа/снизу anchor .
- top-in , right-in , bottom-in – вставляют elem внутрь anchor : приклеивают его к верхнему/правому/нижнему краю.
// показывает заметку поверх цитаты positionAt(blockquote, "top-out", note); // показывает заметку внутри цитаты вблизи верхнего края элемента positionAt(blockquote, "top-in", note);
