element-plus
Version:
A Component Library for Vue 3
1 lines • 7.73 kB
Source Map (JSON)
{"version":3,"file":"scroll.mjs","sources":["../../../../../packages/utils/dom/scroll.ts"],"sourcesContent":["import { isClient } from '../browser'\nimport { easeInOutCubic } from '../easings'\nimport { isFunction, isWindow } from '../types'\nimport { cAF, rAF } from '../raf'\nimport { getStyle } from './style'\n\nexport const isScroll = (el: HTMLElement, isVertical?: boolean): boolean => {\n if (!isClient) return false\n\n const key = (\n {\n undefined: 'overflow',\n true: 'overflow-y',\n false: 'overflow-x',\n } as const\n )[String(isVertical)]!\n const overflow = getStyle(el, key)\n return ['scroll', 'auto', 'overlay'].some((s) => overflow.includes(s))\n}\n\nexport const getScrollContainer = (\n el: HTMLElement,\n isVertical?: boolean\n): Window | HTMLElement | undefined => {\n if (!isClient) return\n\n let parent: HTMLElement = el\n while (parent) {\n if ([window, document, document.documentElement].includes(parent))\n return window\n\n if (isScroll(parent, isVertical)) return parent\n\n parent = parent.parentNode as HTMLElement\n }\n\n return parent\n}\n\nlet scrollBarWidth: number\nexport const getScrollBarWidth = (namespace: string): number => {\n if (!isClient) return 0\n if (scrollBarWidth !== undefined) return scrollBarWidth\n\n const outer = document.createElement('div')\n outer.className = `${namespace}-scrollbar__wrap`\n outer.style.visibility = 'hidden'\n outer.style.width = '100px'\n outer.style.position = 'absolute'\n outer.style.top = '-9999px'\n document.body.appendChild(outer)\n\n const widthNoScroll = outer.offsetWidth\n outer.style.overflow = 'scroll'\n\n const inner = document.createElement('div')\n inner.style.width = '100%'\n outer.appendChild(inner)\n\n const widthWithScroll = inner.offsetWidth\n outer.parentNode?.removeChild(outer)\n scrollBarWidth = widthNoScroll - widthWithScroll\n\n return scrollBarWidth\n}\n\n/**\n * Scroll with in the container element, positioning the **selected** element at the top\n * of the container\n */\nexport function scrollIntoView(\n container: HTMLElement,\n selected: HTMLElement\n): void {\n if (!isClient) return\n\n if (!selected) {\n container.scrollTop = 0\n return\n }\n\n const offsetParents: HTMLElement[] = []\n let pointer = selected.offsetParent\n while (\n pointer !== null &&\n container !== pointer &&\n container.contains(pointer)\n ) {\n offsetParents.push(pointer as HTMLElement)\n pointer = (pointer as HTMLElement).offsetParent\n }\n const top =\n selected.offsetTop +\n offsetParents.reduce((prev, curr) => prev + curr.offsetTop, 0)\n const bottom = top + selected.offsetHeight\n const viewRectTop = container.scrollTop\n const viewRectBottom = viewRectTop + container.clientHeight\n\n if (top < viewRectTop) {\n container.scrollTop = top\n } else if (bottom > viewRectBottom) {\n container.scrollTop = bottom - container.clientHeight\n }\n}\n\nexport function animateScrollTo(\n container: HTMLElement | Window,\n from: number,\n to: number,\n duration: number,\n callback?: unknown\n) {\n const startTime = Date.now()\n\n let handle: number | undefined\n const scroll = () => {\n const timestamp = Date.now()\n const time = timestamp - startTime\n const nextScrollTop = easeInOutCubic(\n time > duration ? duration : time,\n from,\n to,\n duration\n )\n\n if (isWindow(container)) {\n container.scrollTo(window.pageXOffset, nextScrollTop)\n } else {\n container.scrollTop = nextScrollTop\n }\n if (time < duration) {\n handle = rAF(scroll)\n } else if (isFunction(callback)) {\n callback()\n }\n }\n\n scroll()\n\n return () => {\n handle && cAF(handle)\n }\n}\n\nexport const getScrollElement = (\n target: HTMLElement,\n container: HTMLElement | Window\n) => {\n if (isWindow(container)) {\n return target.ownerDocument.documentElement\n }\n return container\n}\n\nexport const getScrollTop = (container: HTMLElement | Window) => {\n if (isWindow(container)) {\n return window.scrollY\n }\n return container.scrollTop\n}\n"],"names":[],"mappings":";;;;;;;AAMO,MAAM,QAAA,GAAW,CAAC,EAAA,EAAiB,UAAA,KAAkC;AAC1E,EAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AAEtB,EAAA,MAAM,GAAA,GACJ;AAAA,IACE,SAAA,EAAW,UAAA;AAAA,IACX,IAAA,EAAM,YAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT,CACA,MAAA,CAAO,UAAU,CAAC,CAAA;AACpB,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,EAAA,EAAI,GAAG,CAAA;AACjC,EAAA,OAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,QAAA,CAAS,QAAA,CAAS,CAAC,CAAC,CAAA;AACvE;AAEO,MAAM,kBAAA,GAAqB,CAChC,EAAA,EACA,UAAA,KACqC;AACrC,EAAA,IAAI,CAAC,QAAA,EAAU;AAEf,EAAA,IAAI,MAAA,GAAsB,EAAA;AAC1B,EAAA,OAAO,MAAA,EAAQ;AACb,IAAA,IAAI,CAAC,MAAA,EAAQ,QAAA,EAAU,SAAS,eAAe,CAAA,CAAE,SAAS,MAAM,CAAA;AAC9D,MAAA,OAAO,MAAA;AAET,IAAA,IAAI,QAAA,CAAS,MAAA,EAAQ,UAAU,CAAA,EAAG,OAAO,MAAA;AAEzC,IAAA,MAAA,GAAS,MAAA,CAAO,UAAA;AAAA,EAClB;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,IAAI,cAAA;AACG,MAAM,iBAAA,GAAoB,CAAC,SAAA,KAA8B;AAxChE,EAAA,IAAA,EAAA;AAyCE,EAAA,IAAI,CAAC,UAAU,OAAO,CAAA;AACtB,EAAA,IAAI,cAAA,KAAmB,QAAW,OAAO,cAAA;AAEzC,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,EAAA,KAAA,CAAM,SAAA,GAAY,GAAG,SAAS,CAAA,gBAAA,CAAA;AAC9B,EAAA,KAAA,CAAM,MAAM,UAAA,GAAa,QAAA;AACzB,EAAA,KAAA,CAAM,MAAM,KAAA,GAAQ,OAAA;AACpB,EAAA,KAAA,CAAM,MAAM,QAAA,GAAW,UAAA;AACvB,EAAA,KAAA,CAAM,MAAM,GAAA,GAAM,SAAA;AAClB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAE/B,EAAA,MAAM,gBAAgB,KAAA,CAAM,WAAA;AAC5B,EAAA,KAAA,CAAM,MAAM,QAAA,GAAW,QAAA;AAEvB,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,EAAA,KAAA,CAAM,MAAM,KAAA,GAAQ,MAAA;AACpB,EAAA,KAAA,CAAM,YAAY,KAAK,CAAA;AAEvB,EAAA,MAAM,kBAAkB,KAAA,CAAM,WAAA;AAC9B,EAAA,CAAA,EAAA,GAAA,KAAA,CAAM,UAAA,KAAN,mBAAkB,WAAA,CAAY,KAAA,CAAA;AAC9B,EAAA,cAAA,GAAiB,aAAA,GAAgB,eAAA;AAEjC,EAAA,OAAO,cAAA;AACT;AAMO,SAAS,cAAA,CACd,WACA,QAAA,EACM;AACN,EAAA,IAAI,CAAC,QAAA,EAAU;AAEf,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,SAAA,CAAU,SAAA,GAAY,CAAA;AACtB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,gBAA+B,EAAC;AACtC,EAAA,IAAI,UAAU,QAAA,CAAS,YAAA;AACvB,EAAA,OACE,YAAY,IAAA,IACZ,SAAA,KAAc,WACd,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,EAC1B;AACA,IAAA,aAAA,CAAc,KAAK,OAAsB,CAAA;AACzC,IAAA,OAAA,GAAW,OAAA,CAAwB,YAAA;AAAA,EACrC;AACA,EAAA,MAAM,GAAA,GACJ,QAAA,CAAS,SAAA,GACT,aAAA,CAAc,MAAA,CAAO,CAAC,IAAA,EAAM,IAAA,KAAS,IAAA,GAAO,IAAA,CAAK,SAAA,EAAW,CAAC,CAAA;AAC/D,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,YAAA;AAC9B,EAAA,MAAM,cAAc,SAAA,CAAU,SAAA;AAC9B,EAAA,MAAM,cAAA,GAAiB,cAAc,SAAA,CAAU,YAAA;AAE/C,EAAA,IAAI,MAAM,WAAA,EAAa;AACrB,IAAA,SAAA,CAAU,SAAA,GAAY,GAAA;AAAA,EACxB,CAAA,MAAA,IAAW,SAAS,cAAA,EAAgB;AAClC,IAAA,SAAA,CAAU,SAAA,GAAY,SAAS,SAAA,CAAU,YAAA;AAAA,EAC3C;AACF;AAEO,SAAS,eAAA,CACd,SAAA,EACA,IAAA,EACA,EAAA,EACA,UACA,QAAA,EACA;AACA,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,EAAA,IAAI,MAAA;AACJ,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,OAAO,SAAA,GAAY,SAAA;AACzB,IAAA,MAAM,aAAA,GAAgB,cAAA;AAAA,MACpB,IAAA,GAAO,WAAW,QAAA,GAAW,IAAA;AAAA,MAC7B,IAAA;AAAA,MACA,EAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,SAAA,CAAU,QAAA,CAAS,MAAA,CAAO,WAAA,EAAa,aAAa,CAAA;AAAA,IACtD,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,SAAA,GAAY,aAAA;AAAA,IACxB;AACA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,MAAA,GAAS,IAAI,MAAM,CAAA;AAAA,IACrB,CAAA,MAAA,IAAW,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC/B,MAAA,QAAA,EAAS;AAAA,IACX;AAAA,EACF,CAAA;AAEA,EAAA,MAAA,EAAO;AAEP,EAAA,OAAO,MAAM;AACX,IAAA,MAAA,IAAU,IAAI,MAAM,CAAA;AAAA,EACtB,CAAA;AACF;AAEO,MAAM,gBAAA,GAAmB,CAC9B,MAAA,EACA,SAAA,KACG;AACH,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,OAAO,OAAO,aAAA,CAAc,eAAA;AAAA,EAC9B;AACA,EAAA,OAAO,SAAA;AACT;AAEO,MAAM,YAAA,GAAe,CAAC,SAAA,KAAoC;AAC/D,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,OAAO,MAAA,CAAO,OAAA;AAAA,EAChB;AACA,EAAA,OAAO,SAAA,CAAU,SAAA;AACnB;;;;"}