UNPKG

tav-ui

Version:
1 lines 12.6 kB
{"version":3,"file":"domUtils2.mjs","sources":["../../../../../packages/utils/domUtils.ts"],"sourcesContent":["import { upperFirst } from 'lodash-es'\nimport type { FunctionArgs } from '@vueuse/core'\n\nexport interface ViewportOffsetResult {\n left: number\n top: number\n right: number\n bottom: number\n rightIncludeBody: number\n bottomIncludeBody: number\n}\n\ninterface Fn<T = any, R = T> {\n (...arg: T[]): R\n}\n\nexport function getBoundingClientRect(element: Element): DOMRect | number {\n if (!element || !element.getBoundingClientRect) return 0\n\n return element.getBoundingClientRect()\n}\n\nfunction trim(string: string) {\n return (string || '').replace(/^[\\s\\uFEFF]+|[\\s\\uFEFF]+$/g, '')\n}\n\n/* istanbul ignore next */\nexport function hasClass(el: Element, cls: string) {\n if (!el || !cls) return false\n if (cls.includes(' ')) throw new Error('className should not contain space.')\n if (el.classList) return el.classList.contains(cls)\n else return ` ${el.className} `.includes(` ${cls} `)\n}\n\n/* istanbul ignore next */\nexport function addClass(el: Element, cls: string) {\n if (!el) return\n let curClass = el.className\n const classes = (cls || '').split(' ')\n\n for (let i = 0, j = classes.length; i < j; i++) {\n const clsName = classes[i]\n if (!clsName) continue\n\n if (el.classList) el.classList.add(clsName)\n else if (!hasClass(el, clsName)) curClass += ` ${clsName}`\n }\n if (!el.classList) el.className = curClass\n}\n\n/* istanbul ignore next */\nexport function removeClass(el: Element, cls: string) {\n if (!el || !cls) return\n const classes = cls.split(' ')\n let curClass = ` ${el.className} `\n\n for (let i = 0, j = classes.length; i < j; i++) {\n const clsName = classes[i]\n if (!clsName) continue\n\n if (el.classList) el.classList.remove(clsName)\n else if (hasClass(el, clsName)) curClass = curClass.replace(` ${clsName} `, ' ')\n }\n if (!el.classList) el.className = trim(curClass)\n}\n/**\n * Get the left and top offset of the current element\n * left: the distance between the leftmost element and the left side of the document\n * top: the distance from the top of the element to the top of the document\n * right: the distance from the far right of the element to the right of the document\n * bottom: the distance from the bottom of the element to the bottom of the document\n * rightIncludeBody: the distance between the leftmost element and the right side of the document\n * bottomIncludeBody: the distance from the bottom of the element to the bottom of the document\n *\n * @description:\n */\nexport function getViewportOffset(element: Element): ViewportOffsetResult {\n const doc = document.documentElement\n const docScrollLeft = doc.scrollLeft\n const docScrollTop = doc.scrollTop\n const docClientLeft = doc.clientLeft\n const docClientTop = doc.clientTop\n\n const pageXOffset = window.pageXOffset\n const pageYOffset = window.pageYOffset\n\n const box = getBoundingClientRect(element)\n\n const { left: retLeft, top: rectTop, width: rectWidth, height: rectHeight } = box as DOMRect\n\n const scrollLeft = (pageXOffset || docScrollLeft) - (docClientLeft || 0)\n const scrollTop = (pageYOffset || docScrollTop) - (docClientTop || 0)\n const offsetLeft = retLeft + pageXOffset\n const offsetTop = rectTop + pageYOffset\n\n const left = offsetLeft - scrollLeft\n const top = offsetTop - scrollTop\n\n const clientWidth = window.document.documentElement.clientWidth\n const clientHeight = window.document.documentElement.clientHeight\n return {\n left,\n top,\n right: clientWidth - rectWidth - left,\n bottom: clientHeight - rectHeight - top,\n rightIncludeBody: clientWidth - left, // 包含自身\n bottomIncludeBody: clientHeight - top, // 包含自身\n }\n}\n\nexport function hackCss(attr: string, value: string) {\n const prefix: string[] = ['webkit', 'Moz', 'ms', 'OT']\n\n const styleObj: any = {}\n prefix.forEach((item) => {\n styleObj[`${item}${upperFirst(attr)}`] = value\n })\n return {\n ...styleObj,\n [attr]: value,\n }\n}\n\n/* istanbul ignore next */\nexport function on(\n element: Element | HTMLElement | Document | Window,\n event: string,\n handler: EventListenerOrEventListenerObject\n): void {\n if (element && event && handler) element.addEventListener(event, handler, false)\n}\n\n/* istanbul ignore next */\nexport function off(\n element: Element | HTMLElement | Document | Window,\n event: string,\n handler: Fn\n): void {\n if (element && event && handler) element.removeEventListener(event, handler, false)\n}\n\n/* istanbul ignore next */\nexport function once(el: HTMLElement, event: string, fn: EventListener): void {\n const listener = function (this: any, ...args: any) {\n if (fn) fn.apply(this, args)\n\n off(el, event, listener)\n }\n on(el, event, listener)\n}\n\nexport function useRafThrottle<T extends FunctionArgs>(fn: T): any {\n let locked = false\n return function (...args: any) {\n if (locked) return\n locked = true\n window.requestAnimationFrame(() => {\n // @ts-ignore\n fn.apply(this, args)\n locked = false\n })\n }\n}\n\nfunction doubleRequestAnimationFrame(callback: (...args) => any) {\n requestAnimationFrame(() => {\n requestAnimationFrame(callback)\n })\n}\n\nexport function componentRendered(callback?: (...args) => any) {\n if (callback && typeof callback === 'function') {\n doubleRequestAnimationFrame(callback)\n } else {\n return new Promise((resolve) => {\n doubleRequestAnimationFrame(resolve)\n })\n }\n}\n\nexport function parentsUntil(el, selector, filter): HTMLDivElement[] {\n const result: HTMLDivElement[] = []\n const matchesSelector =\n el.matches || el.webkitMatchesSelector || el.mozMatchesSelector || el.msMatchesSelector\n\n // match start from parent\n el = el.parentElement\n while (el && !matchesSelector.call(el, selector)) {\n if (!filter) result.push(el)\n else if (matchesSelector.call(el, filter)) result.push(el)\n\n el = el.parentElement\n }\n return result\n}\n\nexport function closest(el, selector): HTMLDivElement | null {\n const matchesSelector =\n el.matches || el.webkitMatchesSelector || el.mozMatchesSelector || el.msMatchesSelector\n\n while (el) {\n if (matchesSelector.call(el, selector)) return el\n else el = el.parentElement\n }\n return null\n}\n"],"names":[],"mappings":"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"}