| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- import { warnOnce } from 'motion-utils';
- import { updateScrollInfo } from './info.mjs';
- import { resolveOffsets } from './offsets/index.mjs';
- function measure(container, target = container, info) {
- /**
- * Find inset of target within scrollable container
- */
- info.x.targetOffset = 0;
- info.y.targetOffset = 0;
- if (target !== container) {
- let node = target;
- while (node && node !== container) {
- info.x.targetOffset += node.offsetLeft;
- info.y.targetOffset += node.offsetTop;
- node = node.offsetParent;
- }
- }
- info.x.targetLength =
- target === container ? target.scrollWidth : target.clientWidth;
- info.y.targetLength =
- target === container ? target.scrollHeight : target.clientHeight;
- info.x.containerLength = container.clientWidth;
- info.y.containerLength = container.clientHeight;
- /**
- * In development mode ensure scroll containers aren't position: static as this makes
- * it difficult to measure their relative positions.
- */
- if (process.env.NODE_ENV !== "production") {
- if (container && target && target !== container) {
- warnOnce(getComputedStyle(container).position !== "static", "Please ensure that the container has a non-static position, like 'relative', 'fixed', or 'absolute' to ensure scroll offset is calculated correctly.");
- }
- }
- }
- function createOnScrollHandler(element, onScroll, info, options = {}) {
- return {
- measure: () => measure(element, options.target, info),
- update: (time) => {
- updateScrollInfo(element, info, time);
- if (options.offset || options.target) {
- resolveOffsets(element, info, options);
- }
- },
- notify: () => onScroll(info),
- };
- }
- export { createOnScrollHandler };
|