Библиотека Cash предоставляет лёгкий и компактный инструмент для работы с DOM, аналогичный jQuery, но с современным подходом. Одной из ключевых задач при работе с DOM является определение положения элементов на странице. Особенно важна работа с координатами относительно viewport, то есть области видимой части страницы, независимо от прокрутки.
.offset()Метод .offset() возвращает координаты элемента
относительно всей страницы, включая прокрутку. Для
вычисления позиции относительно viewport используется
сочетание с текущей прокруткой страницы.
Пример получения координат:
const el = $('#element');
const offset = el.offset();
console.log(offset.top, offset.left);
offset() возвращает объект с двумя свойствами:
top — расстояние от верхнего края документа до верхнего
края элемента.left — расстояние от левого края документа до левого
края элемента.Чтобы получить координаты относительно viewport:
const viewportTop = offset.top - window.scrollY;
const viewportLeft = offset.left - window.scrollX;
Объяснение: window.scrollY и
window.scrollX показывают текущее смещение страницы по
вертикали и горизонтали. Вычитая их из координат элемента, получаем
положение элемента относительно видимой области.
.position()Метод .position() в Cash возвращает координаты элемента
относительно его offset parent, то есть ближайшего
предка с установленным позиционированием (relative,
absolute или fixed).
Пример использования:
const position = el.position();
console.log(position.top, position.left);
Особенности:
.getBoundingClientRect()Для точного вычисления координат элемента относительно
viewport в Cash используется стандартный DOM-метод
getBoundingClientRect(). Cash предоставляет доступ к
нативным элементам через индексированный объект:
const rect = el[0].getBoundingClientRect();
console.log(rect.top, rect.left, rect.width, rect.height);
Возвращаемый объект содержит:
top, left — расстояние от верхнего/левого
края viewport до элемента.bottom, right — положение нижнего и
правого края элемента.width, height — размеры элемента.getBoundingClientRect() является наиболее надёжным
способом получения точных координат относительно видимой
области, поскольку автоматически учитывает:
| Метод | Относительно | Учитывает прокрутку | Применение |
|---|---|---|---|
.offset() |
Документа | Нет (необходимо вычитать scroll) |
Расчёт позиции на странице, скролл-подсчёты |
.position() |
Offset parent | Нет | Позиционирование внутри контейнера |
getBoundingClientRect() |
Viewport | Да | Точная позиция для анимаций, всплывающих подсказок, фиксации элементов |
Фиксация элемента при прокрутке:
const el = $('#header');
const rect = el[0].getBoundingClientRect();
window.addEventListener('scroll', () => {
if (rect.top < 0) {
el.css({ position: 'fixed', top: '0' });
} else {
el.css({ position: '', top: '' });
}
});
Определение, виден ли элемент на экране:
function isInViewport(element) {
const rect = element[0].getBoundingClientRect();
return (
rect.top >= 0 &&
rect.left >= 0 &&
rect.bottom <= window.innerHeight &&
rect.right <= window.innerWidth
);
}
console.log(isInViewport($('#section')));
Центрирование элемента относительно viewport:
const el = $('#modal');
const rect = el[0].getBoundingClientRect();
el.css({
position: 'fixed',
top: `calc(50vh - ${rect.height / 2}px)`,
left: `calc(50vw - ${rect.width / 2}px)`
});
.offset() — координаты относительно документа,
требуется коррекция прокрутки для viewport..position() — координаты относительно
позиционированного родителя, не учитывает прокрутку.getBoundingClientRect() — координаты относительно
viewport, точные и удобные для динамических интерфейсов.Использование этих методов позволяет создавать сложные интерфейсы, фиксировать элементы, вычислять видимость на экране и управлять анимацией, сохраняя контроль над положением относительно видимой части страницы.