xdesign-vue-next
Version:
XDesign Component for vue-next
1 lines • 1.84 kB
Source Map (JSON)
{"version":3,"file":"getRelativePosition.mjs","sources":["../../../src/guide/utils/getRelativePosition.ts"],"sourcesContent":["import { getElmCssPropValue, isFixed, getWindowScroll } from '../../utils/dom';\n\n/**\n * 获取元素相对于另一个元素的位置(或者说相对于 body)\n * 感谢 `meouw`: http://stackoverflow.com/a/442474/375966\n */\nexport default function getRelativePosition(elm: HTMLElement, relativeElm: HTMLElement = document.body) {\n const { scrollTop, scrollLeft } = getWindowScroll();\n const { top: elmTop, left: elmLeft } = elm.getBoundingClientRect();\n const { top: relElmTop, left: relElmLeft } = relativeElm.getBoundingClientRect();\n const relativeElmPosition = getElmCssPropValue(relativeElm, 'position');\n\n if (\n (relativeElm.tagName.toLowerCase() !== 'body' && relativeElmPosition === 'relative') ||\n relativeElmPosition === 'sticky'\n ) {\n return {\n top: elmTop - relElmTop,\n left: elmLeft - relElmLeft,\n };\n }\n\n if (isFixed(elm)) {\n return {\n top: elmTop,\n left: elmLeft,\n };\n }\n\n return {\n top: elmTop + scrollTop,\n left: elmLeft + scrollLeft,\n };\n}\n"],"names":["top","left"],"mappings":";;;;;;;;;;;;;;;;;;AAMA,SAAA,mBAAA,CAAA,GAAA,EAAA;AAAwG,EAAA,IAAA,WAAA,GAAA,SAAA,CAAA,MAAA,GAAA,CAAA,IAAA,SAAA,CAAA,CAAA,CAAA,KAAA,SAAA,GAAA,SAAA,CAAA,CAAA,CAAA,GAAA,QAAA,CAAA,IAAA,CAAA;AACtG,EAAA,IAAA,gBAAA,GAAA,eAAA,EAAA;;;AACA,EAAA,IAAA,qBAAA,GAAA,GAAA,CAAA,qBAAA,EAAA;;;AACA,EAAA,IAAA,qBAAA,GAAA,WAAA,CAAA,qBAAA,EAAA;;;AACM,EAAA,IAAA,mBAAA,GAAA,kBAAA,CAAA,WAAA,EAAA,UAAA,CAAA,CAAA;AAGH,EAAA,IAAA,WAAA,CAAA,OAAA,CAAA,WAAA,EAAA,KAAA,MAAA,IAAA,mBAAA,KAAA,UAAA,IAAA,mBAAA,KAAA,QAAA,EAAA;;;;;AAOH,GAAA;AAEI,EAAA,IAAA,OAAA,CAAA,GAAA,CAAA,EAAA;;AAEAA,MAAAA,GAAAA,EAAAA,MAAAA;AACAC,MAAAA,IAAAA,EAAAA,OAAAA;;AAEJ,GAAA;;;;;AAMF;;;;"}