- jQuery метод .offset()
- Определение и применение
- jQuery синтаксис:
- Добавлен в версии jQuery
- Пример использования
- Координаты в документе
- Сравнение систем координат
- Получение координат
- Устаревший метод: offset*
- Координаты на экране screenX/screenY
- Итого
- Задачи
- Область видимости для документа
- Разместить заметку внутри элемента
- Window.pageYOffset
- Синтаксис
- Значение
- Пример
- JavaScript
- Результат
jQuery метод .offset()
Определение и применение
jQuery метод .offset() задает или возвращает значение координат для выбранных элементов (относительно документа).
При получении значений координат этот метод возвращает объект с двумя свойствами:
- позиция элемента от верхнего края документа в пикселях (top).
- позиция элемента от левого края документа в пикселях (left).
Если родительский элемент имеет статическое позиционирование (по умолчанию), то вложенный элемент вернет координаты относительно окна документа (первый случай на изображении), а не относительно родительского элемента. В отличии от метода .position() если родительский элемент имеет позиционирование отличное от статического (фиксированное, абсолютное, или относительное), то вложенный элемент также вернет координаты относительно окна документа (второй случай на изображении):
Пример использования jQuery метода .position().
Если Вам необходимо получить координаты элемента относительно окна документа независимо от того как позиционирован родительский элемент, то Вы можете воспользоваться jQuery методом .offset().
Более подробную информацию о позиционировании элементов вы можете получить в учебнике CSS в статье «Позиционирование элементов в CSS».
jQuery не поддерживает получение координат расположения скрытых элементов. Обратите внимание на отличие методов .position() и .offset(), если у элемента установлены внешние отступы (margin):
Отличие jQuery метода .position() и метода .offset().
Когда вы используете метод .offset() для установки значений, положение элемента определяется относительно документа, при этом если элемент к которому применяется позиционирование имеет статическое позиционирование ( static — по умолчанию), то jQuery устанавливает элементу встроенный стиль, определяющий, что элемент имеет относительное позиционирование (style = «position: relative «).
jQuery синтаксис:
Параметр | Описание |
---|---|
< top: value, left: value > | Объект, который содержит два ключа — top (позиция от верхнего края элемента в пикселях) и left (позиция от левого края элемента в пикселях). |
function (index, currentOffset) | Задает функцию, которая должна возвращать объект с новыми top и left свойствами (ключами).
|
Добавлен в версии jQuery
Пример использования
В этом примере с использованием jQuery метода .offset() мы получаем и выводим в консоль браузера:
- в первом случае объект с двумя ключами — позиции (относительно документа) от верхнего и левого края элемента
в пикселях.
Результат нашего примера:
Пример использование jQuery метода .offset() для получения координат
Рассмотрим пример в котором мы используем метод .offset(), чтобы установить значения координат для выбранного элемента:
В этом примере с использованием jQuery метода .offset() мы:
- выводим в консоль браузера информацию о текущих координатах элемента
в пикселях после установки новых значений.
Результат нашего примера:
Пример использование jQuery метода .offset() для установки координат
В следующем примере мы передадим в качестве параметра метода .offset() функцию:
В этом примере с использованием jQuery метода .offset() и функции, которая возвращает новый объект, содержащий новые значения координат, от верхнего и левого края документа (старое значение координат + 10), мы изменяем позицию элемента
при нажатии на кнопку.
Результат нашего примера:
Пример использования функции с методом .offset() для установки координат jQuery DOM методы
Координаты в документе
Материал на этой странице устарел, поэтому скрыт из оглавления сайта.
Более новая информация по этой теме находится на странице https://learn.javascript.ru/coordinates.
Система координат относительно страницы или, иначе говоря, относительно документа, начинается в левом-верхнем углу, но не окна, а именно страницы.
И координаты в ней означают позицию по отношению не к окну браузера, а к документу в целом.
Если провести аналогию с CSS, то координаты относительно окна – это position:fixed , а относительно документа – position:absolute (при позиционировании вне других элементов, естественно).
Мы будем называть координаты в ней pageX/pageY .
Они нужны в первую очередь для того, чтобы показывать элемент в определённом месте страницы, а не окна.
Сравнение систем координат
Когда страница не прокручена, точки начала координат относительно окна (clientX,clientY) и документа (pageX,pageY) совпадают:
Например, координаты элемента с надписью «STANDARDS» равны расстоянию от верхней/левой границы окна:
Прокрутим страницу, чтобы элемент был на самом верху:
Посмотрите на рисунок ниже, на нём – та же страница, только прокрученная, и тот же элемент «STANDARDS».
- Координата clientY изменилась. Она была 175 , а стала 0 , так как элемент находится вверху окна.
- Координата pageY осталась такой же, так как отсчитывается от левого-верхнего угла документа.
Итак, координаты pageX/pageY не меняются при прокрутке, в отличие от clientX/clientY .
Получение координат
К сожалению, готовой функции для получения координат элемента относительно страницы нет. Но её можно легко написать самим.
Эти две системы координат жёстко связаны: pageY = clientY + текущая вертикальная прокрутка .
Наша функция getCoords(elem) будет брать результат elem.getBoundingClientRect() и прибавлять текущую прокрутку документа.
Результат getCoords : объект с координатами
Если нужно поддерживать более старые IE, то вот альтернативный, самый кросс-браузерный вариант:
Разберём что и зачем, по шагам:
- Получаем прямоугольник.
- Считаем прокрутку страницы. Все браузеры, кроме IE8- поддерживают свойство pageXOffset/pageYOffset . В более старых IE, когда установлен DOCTYPE, прокрутку можно получить из documentElement , ну и наконец если DOCTYPE некорректен – использовать body .
- В IE документ может быть смещён относительно левого верхнего угла. Получим это смещение.
- Добавим прокрутку к координатам окна и вычтем смещение html/body , чтобы получить координаты нужного нам элемента.
Устаревший метод: offset*
Есть альтернативный способ нахождения координат – это пройти всю цепочку offsetParent от элемента вверх и сложить отступы offsetLeft/offsetTop .
Мы разбираем его здесь с учебной целью, так как он используется лишь в старых браузерах.
Вот функция, реализующая такой подход.
Казалось бы, код нормальный. И он как-то работает, но разные браузеры преподносят «сюрпризы», включая или выключая размер рамок и прокруток из offsetTop/Left , некорректно учитывая позиционирование. В итоге результат не всегда верен. Можно, конечно, разобрать эти проблемы и посчитать действительно аккуратно и правильно этим способом, но зачем? Ведь есть getBoundingClientRect .
Вы можете увидеть разницу между вычислением координат через offset* и getBoundingClientRect на примере.
В прямоугольнике ниже есть 3 вложенных DIV . Все они имеют border , кое-кто из них имеет position/margin/padding .
Кликните по внутреннему (жёлтому) элементу, чтобы увидеть результаты обоих методов: getOffsetSum и getCoords , а также реальные координаты курсора – event.pageX/pageY (мы обсудим их позже в статье Мышь: IE8-, исправление события).
При клике на любом месте жёлтого блока вы легко увидите разницу между getOffsetSum(elem) и getCoords(elem) .
Для того, чтобы узнать, какой же результат верный, кликните в левом-верхнем углу жёлтого блока, причём обратите внимание – кликать нужно не на жёлтом, а на чёрном, это рамка, она тоже входит в элемент. Будут видны точные координаты мыши, так что вы можете сравнить их с getOffsetSum/getCoords .
Пример клика в правильном месте (обратите внимание на разницу координат):
Именно getCoords всегда возвращает верное значение.
Координаты на экране screenX/screenY
Есть ещё одна система координат, которая используется очень редко, но для полноты картины необходимо её упомянуть.
Координаты относительно экрана screenX/screenY отсчитываются от его левого-верхнего угла. Имеется в виду именно весь экран, а не окно браузера.
Такие координаты могут быть полезны, например, при работе с мобильными устройствами или для открытия нового окна посередине экрана вызовом window.open.
Размеры экрана хранятся в глобальной переменной screen:
Координаты левого-верхнего угла браузера на экране хранятся в window.screenX, window.screenY (не поддерживаются IE8-):
Они могут быть и меньше нуля, если окно частично вне экрана.
Заметим, что общую информацию об экране и браузере получить можно, а вот координаты конкретного элемента на экране – нельзя, нет аналога getBoundingClientRect или иного метода для этого.
Итого
У любой точки в браузере есть координаты:
- Относительно окна window – elem.getBoundingClientRect() .
- Относительно документа document – добавляем прокрутку, во всех фреймворках есть готовая функция.
- Относительно экрана screen – можно узнать координаты браузера, но не элемента.
Иногда в старом коде можно встретить использование offsetTop/Left для подсчёта координат. Это очень старый и неправильный способ, не стоит его использовать.
Координаты будут нужны нам далее, при работе с событиями мыши (координаты клика) и элементами (перемещение).
Задачи
Область видимости для документа
Напишите функцию getDocumentScroll() , которая возвращает объект с информацией о текущей прокрутке и области видимости.
- top – координата верхней границы видимой части (относительно документа).
- bottom – координата нижней границы видимой части (относительно документа).
- height – полная высота документа, включая прокрутку.
В этой задаче учитываем только вертикальную прокрутку: горизонтальная делается аналогично, а нужна сильно реже.
- top – это pageYOffset .
- bottom – это pageYOffset плюс высота видимой части documentElement.clientHeight .
- height – полная высота документа, её вычисление дано в главе Размеры и прокрутка страницы.
Разместить заметку внутри элемента
Расширьте предыдущую задачу Покажите заметку около элемента (абсолютное позиционирование): научите функцию positionAt(anchor, position, elem) вставлять elem внутрь anchor .
Новые значения position :
- top-out , right-out , bottom-out – работают так же, как раньше, то есть вставляют elem над/справа/под anchor .
- top-in , right-in , bottom-in – вставляют elem внутрь anchor : к верхней границе/правой/нижней.
Window.pageYOffset
pageYOffset — свойство окна Window , доступное только для чтения. Это то же свойство, что и scrollY и, как таковое, оно тоже возвращает количество пикселей, на которое прокручен документ по вертикали (вниз или вверх). Значение свойства равное 0.0 говорит о том, что в данный момент верхний край документа Document совпадает с верхним краем области содержимого окна.
Есть незначительная разница в поддержке pageYOffset и scrollY , первый поддерживается лучше в старых браузерах, но если не затрагивать очень старые версии, то использовать можно любое свойство. Они идентичны.
Соответствующее свойство pageXOffset (en-US) , которое возвращает количество пикселей, на которое документ прокручен по горизонтали, это то же самое, что и scrollX .
Синтаксис
Значение
Количество пикселей, на которое документ Document прокручен вертикально в рамках окна Window , выражено числом с плавающей запятой. Оно рассчитывается с субпиксельной точностью и, таким образом, не обязательно будет целым числом. Значение равное 0.0 означает, что вертикальная прокрутка ещё не была совершена, и верхний край документа сейчас соответствует верхнему краю области содержимого окна.
Т.к. данное свойство соответствует Window.scrollY , обратитесь к его описанию за более детальной информацией о значении и использовании.
Пример
В данном примере создаётся элемент (en-US), и задаётся его содержимое, затем определённый элемент этого документа прокручивается в область рамки. Как только это произошло, выясняется положение вертикальной прокрутки с помощью значения pageYOffset у элемента contentWindow (en-US) в рамке.
HTML предельно прост и состоит из двух элементов: (en-US), содержащий документ, который мы будем прокручивать, и
JavaScript
Код JavaScript начинается с записи в переменные frame and info элементов , содержащего наш документ, и элемента
Имея целевой элемент, мы устанавливаем scrollTop scrollingElement (en-US) рамки от свойства offsetTop целевого элемента. Тем самым мы настраиваем положение вертикальной прокрутки документа рамки таким образом, чтобы оно было таким же как и у верхнего края целевого элемента.
При этом автоматически установится максимально возможное значение у позиции прокрутки при попытке прокрутить дальше конца документа. Это предотвратит выход за границы документа. Никто не хочет знать, что там. Там могут быть драконы.
Результат
Результат ниже. Обратите внимание на то, что содержимое документа уже прокручено до секции, под названием «Overview», а свойство pageYOffset имеет соответствующее значение.