position-indicator
Version:
position indicator library
1 lines • 6.34 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["export type eventType = 'init' | 'scroll' | 'resize' | 'heightChange'\n\nexport interface Memory {\n prevPosition?: number | null\n}\n\nexport interface CallbackParams {\n position: number\n prevPosition: number\n hasUpdated: boolean\n eventType: eventType\n hasScroll: boolean\n eventDate: number\n}\n\nexport interface PositionIndicatorInstance {\n init: () => void\n destroy: () => void\n}\n\nexport interface Options {\n onInit?: (data: CallbackParams) => {} | void\n onUpdate: (data: CallbackParams) => {} | void\n useResizeListener?: boolean\n useResizeObserver?: boolean\n}\n\ninterface Events {\n onScroll?: () => void\n onResize?: () => void\n onHeightChange?: () => void\n resizeObserver?: ResizeObserver\n}\n\nlet _getFullDocumentHeight = () =>\n Math.max(document.body.scrollHeight, document.documentElement.scrollHeight)\n\nlet _getViewPortHeight = () => window.innerHeight\n\nlet _getScrollYPosition = () => window.pageYOffset\n\nlet _hasScroll = () => _getFullDocumentHeight() > _getViewPortHeight()\n\nlet _clamp = (value: number, min: number, max: number) =>\n Math.min(Math.max(value, min), max)\n\nlet _onUpdate = (eventType: eventType, memory: Memory): CallbackParams => {\n let fullDocumentHeight = _getFullDocumentHeight()\n let viewPortHeight = _getViewPortHeight()\n let scrollYPosition = _getScrollYPosition()\n\n let relative = fullDocumentHeight - viewPortHeight\n let position = _clamp(scrollYPosition / (relative || 1), 0, 1)\n let prevPosition = memory.prevPosition\n memory.prevPosition = position\n return {\n position,\n prevPosition,\n hasUpdated: position !== prevPosition,\n eventType,\n hasScroll: _hasScroll(),\n eventDate: Date.now(),\n }\n}\n\nlet _init = (\n {\n onInit: initCallback,\n onUpdate: updateCallback,\n useResizeListener = true,\n useResizeObserver = true,\n }: Options,\n events: Events,\n memory: Memory,\n) => {\n events.onScroll = () => {\n if (updateCallback) {\n updateCallback(_onUpdate('scroll', memory))\n }\n }\n if (useResizeListener) {\n events.onResize = () => {\n if (updateCallback) {\n updateCallback(_onUpdate('resize', memory))\n }\n }\n }\n\n if (useResizeObserver) {\n events.onHeightChange = () => {\n if (updateCallback) {\n updateCallback(_onUpdate('heightChange', memory))\n }\n }\n\n if (typeof ResizeObserver !== 'undefined') {\n events.resizeObserver = new ResizeObserver(events.onHeightChange)\n events.resizeObserver.observe(document.body)\n }\n }\n\n /**\n * Throttling for event is not used.\n * Because it has the same effect same as rAF.\n * https://stackoverflow.com/a/44779316/815507\n */\n window.addEventListener('scroll', events.onScroll)\n window.addEventListener('resize', events.onResize)\n\n initCallback && initCallback(_onUpdate('init', memory))\n}\n\nlet _destroy = (events: Events) => {\n events.onScroll && window.removeEventListener('scroll', events.onScroll)\n events.onResize && window.removeEventListener('resize', events.onResize)\n events.resizeObserver && events.resizeObserver.unobserve(document.body)\n}\n\nexport const createPositionIndicator = (\n options: Options,\n): PositionIndicatorInstance => {\n let events: Events = {\n onScroll: null,\n onResize: null,\n onHeightChange: null,\n resizeObserver: null,\n }\n let memory: Memory = {}\n\n return {\n init: () => _init(options, events, memory),\n destroy: () => {\n _destroy(events)\n events = {}\n memory = {}\n },\n }\n}\n"],"names":[],"mappings":"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"}