Коротка відповідь
juniorВисоту елемента отримуємо через `element.offsetHeight`. Положення відносно документа – це `element.getBoundingClientRect().top + window.pageYOffset`. Приклад: `const el=document.querySelector('#box'); const h=el.offsetHeight; const pos=el.getBoundingClientRect().top+window.pageYOffset;`
Повне пояснення
Що це і навіщо
- offsetHeight – фізична висота елемента, включаючи padding, border і scrollbar (не margin). Використовується, коли потрібна реальна розмірність елемента у вікні.
- getBoundingClientRect() повертає об’єкт з координатами елемента відносно viewport. Додаючи
window.pageYOffset(scrollY), отримуємо координату відносно верхньої межі документа.
Ключові принципи
offsetHeight– синхронний доступ, не потребує рендеру.getBoundingClientRect()– повертає дробові значення, тому для точності можна округлити.pageYOffset(абоscrollY) – поточна вертикальна прокрутка.
Як це працює
- Визначаємо елемент через
document.querySelectorабо інший метод. - Отримуємо висоту:
element.offsetHeight→ число в пікселях. - Отримуємо позицію:
element.getBoundingClientRect().top→ відстань до верхньої межі viewport. - Коригуємо на прокрутку:
+ window.pageYOffset→ абсолютна позиція відносно документа.
Практика і реалізація (JS/TS)
const el = document.querySelector('#myBlock') as HTMLElement;
if (el) {
const height = el.offsetHeight; // 200
const topFromDoc = el.getBoundingClientRect().top + window.pageYOffset; // 350
}
- У TypeScript тип
HTMLElementгарантує доступ до властивостей.
Тестування
- Jest: можна мокати
getBoundingClientRectіpageYOffset.
jest.spyOn(window, 'pageYOffset', 'get').mockReturnValue(100);
const mockRect = { top: 50, left: 0, width: 100, height: 200 } as DOMRect;
jest.spyOn(el, 'getBoundingClientRect').mockReturnValue(mockRect);
const top = el.getBoundingClientRect().top + window.pageYOffset; // 150
- Playwright: перевіряємо реальну позицію після прокрутки.
Оптимізація
- Якщо потрібна лише висота, використовуйте
offsetHeight– мінімальна операція. - Для позиції можна кешувати результат, якщо елемент не змінюється під час прокрутки.
Часті помилки
- Використання
clientHeight– не враховує border. - Забудьте про
pageYOffset– отримаєте позицію відносно viewport, а не документа. - Не враховуєте
scrollTopу старих браузерах. - Використання
offsetTop– повертає позицію відносно батьківського елемента, а не документа. - Дробові значення – при порівнянні треба округлити.
- Проблеми з
display:none– висота буде 0. - Проблеми з
transform–getBoundingClientRect()враховує трансформації. - Проблеми з
position:fixed– позиція відносно viewport, тому треба враховувати прокрутку.
Дизайн‑рішення
- Для динамічних елементів, що змінюються в розмірі, використовуйте
ResizeObserver. - Для позиційних обчислень у реактивному UI – розгляньте
useLayoutEffectв React.
Підсумок
Отримання висоти та позиції елемента відносно документа вимагає двох простих властивостей: offsetHeight і сумарної прокрутки (pageYOffset). Це фундаментальний інструмент для розрахунків layout‑у, анімацій і lazy‑loading.