Dom7 — это легковесная и мощная библиотека для работы с DOM в JavaScript, часто используемая вместе с фреймворком Framework7, но полностью независимая и подходящая для любых проектов. Одной из ключевых возможностей Dom7 является удобная работа с позиционированием элементов и вычисление их offset — координат относительно документа и родительских элементов.
offset() и
position()Dom7 предоставляет два основных метода для получения позиции
элемента: offset() и position().
offset() возвращает объект с
координатами элемента относительно всего документа,
включая прокрутку страницы:
const el = $('.my-element');
const elOffset = el.offset();
console.log(elOffset); // { top: 120, left: 300 }
top — расстояние от верхней границы документа до
верхней границы элемента.left — расстояние от левого края документа до левого
края элемента.position() возвращает координаты
относительно практически ближайшего позиционированного
предка (элемента с position: relative,
absolute или fixed):
const elPosition = el.position();
console.log(elPosition); // { top: 50, left: 20 }
offset(), так как игнорирует прокрутку
документа.Dom7 позволяет динамически изменять позицию
элементов, управляя CSS-свойствами top,
left, right, bottom:
el.css({
top: '100px',
left: '200px'
});
Можно комбинировать с position() для позиционирования
элемента относительно родителя:
const parentOffset = $('.parent').offset();
el.css({
top: parentOffset.top + 20 + 'px',
left: parentOffset.left + 10 + 'px'
});
Такой подход полезен при создании всплывающих окон, подсказок или кастомных модальных компонентов.
При работе с прокручиваемыми контейнерами важно учитывать scrollTop и scrollLeft родителя:
const scrollTop = $('.scroll-container').scrollTop();
const scrollLeft = $('.scroll-container').scrollLeft();
const relativeTop = el.offset().top - scrollTop;
const relativeLeft = el.offset().left - scrollLeft;
Это позволяет корректно вычислять видимую позицию элемента на экране, независимо от текущей прокрутки.
outerWidth(), outerHeight(),
innerWidth(), innerHeight()Для точного позиционирования элементов часто требуется учитывать их размеры:
const width = el.outerWidth(true); // Включает margin
const height = el.outerHeight(true); // Включает margin
innerWidth() и innerHeight() возвращают
размеры контента + padding.outerWidth() и outerHeight() возвращают
размеры контента + padding + border, а при передаче
true — ещё и margin.Метод offset() часто сравнивают с нативным
getBoundingClientRect():
const rect = el[0].getBoundingClientRect();
console.log(rect.top, rect.left);
getBoundingClientRect() возвращает координаты
относительно видимой области окна.offset() возвращает координаты относительно
документа, включая прокрутку.offset()
предпочтительнее.Использование Dom7 позволяет создавать гибкие UI-компоненты, такие как подсказки, тултипы и модальные окна. Пример динамического выравнивания тултипа относительно кнопки:
const button = $('.button');
const tooltip = $('.tooltip');
const btnOffset = button.offset();
tooltip.css({
top: btnOffset.top + button.outerHeight() + 'px',
left: btnOffset.left + 'px'
});
Здесь позиция тултипа рассчитывается на основе размеров и положения кнопки, обеспечивая корректное отображение независимо от прокрутки документа.
При анимации элементов важна точная работа с offset и
position:
el.animate({ top: '+=50px', left: '+=30px' }, 300);
offset() и
css() для постепенного смещения.offset() для координат относительно
документа.position() для координат внутри
позиционированного контейнера.outerWidth() и
outerHeight() при динамическом позиционировании.offset, position и css.Эти инструменты Dom7 позволяют реализовать сложные интерфейсы, где важны точные координаты и адаптивное позиционирование элементов на странице.