tdesign-mobile-vue
Version:
tdesign-mobile-vue
1 lines • 4.3 kB
Source Map (JSON)
{"version":3,"file":"getPosition.mjs","sources":["../../../../src/_common/js/utils/getPosition.ts"],"sourcesContent":["type Placement = 'top' | 'bottom' | 'left' | 'right' | 'mouse';\n\nconst getPosition = (\n targetEle: HTMLElement,\n contentEle: HTMLElement,\n placement: Partial<Placement>,\n clientX?: Number,\n clientY?: Number,\n): { left: number; top: number } => {\n const targetRect = targetEle.getBoundingClientRect() as DOMRect;\n const contentRect = contentEle.getBoundingClientRect() as DOMRect;\n\n const position = {\n top: document.documentElement.scrollTop,\n left: document.documentElement.scrollLeft,\n };\n\n if (targetRect && contentRect) {\n const dWidth = targetRect.width - contentRect.width;\n // eslint-disable-next-line default-case\n switch (placement) {\n case 'top':\n position.left += targetRect.left + dWidth / 2;\n position.top += targetRect.top - contentRect.height - 16;\n break;\n case 'bottom':\n position.left += targetRect.left + dWidth / 2;\n position.top += targetRect.top + targetRect.height;\n break;\n case 'mouse':\n position.left += Number(clientX);\n position.top += typeof clientY !== 'undefined'\n ? Number(clientY) + 16\n : targetRect.top + targetRect.height + 8;\n break;\n // 后续有需要可以再扩展\n }\n\n if (placement === 'mouse') {\n const edges = {\n top: document.documentElement.scrollTop,\n left: document.documentElement.scrollLeft,\n right: document.documentElement.scrollLeft + document.documentElement.clientWidth,\n bottom: document.documentElement.scrollTop + document.documentElement.clientHeight,\n };\n\n // 底部溢出时,定位到元素上方\n if (position.top > edges.bottom - contentRect.height) {\n position.top = document.documentElement.scrollTop + targetRect.top - contentRect.height - 8;\n }\n\n // 右侧溢出时,确保元素能完全展示\n if (position.left > edges.right - contentRect.width) {\n position.left = edges.right - contentRect.width;\n }\n }\n }\n\n return position;\n};\n\nexport default getPosition;\n"],"names":["getPosition","targetEle","contentEle","placement","clientX","clientY","targetRect","getBoundingClientRect","contentRect","position","top","document","documentElement","scrollTop","left","scrollLeft","dWidth","width","height","Number","edges","right","clientWidth","bottom","clientHeight"],"mappings":";;;;;;AAEA,IAAMA,cAAc,SAAdA,YACJC,SAAA,EACAC,UACA,EAAAC,SAAA,EACAC,SACAC,OACkC,EAAA;AAC5B,EAAA,IAAAC,UAAA,GAAaL,UAAUM,qBAAsB,EAAA,CAAA;AAC7C,EAAA,IAAAC,WAAA,GAAcN,WAAWK,qBAAsB,EAAA,CAAA;AAErD,EAAA,IAAME,QAAW,GAAA;AACfC,IAAAA,GAAA,EAAKC,SAASC,eAAgB,CAAAC,SAAA;AAC9BC,IAAAA,IAAA,EAAMH,SAASC,eAAgB,CAAAG,UAAAA;GACjC,CAAA;EAEA,IAAIT,cAAcE,WAAa,EAAA;IACvB,IAAAQ,MAAA,GAASV,UAAW,CAAAW,KAAA,GAAQT,WAAY,CAAAS,KAAA,CAAA;AAEtC,IAAA,QAAAd,SAAA;AACD,MAAA,KAAA,KAAA;QACMM,QAAA,CAAAK,IAAA,IAAQR,UAAW,CAAAQ,IAAA,GAAOE,MAAS,GAAA,CAAA,CAAA;QAC5CP,QAAA,CAASC,GAAO,IAAAJ,UAAA,CAAWI,GAAM,GAAAF,WAAA,CAAYU,MAAS,GAAA,EAAA,CAAA;AACtD,QAAA,MAAA;AACG,MAAA,KAAA,QAAA;QACMT,QAAA,CAAAK,IAAA,IAAQR,UAAW,CAAAQ,IAAA,GAAOE,MAAS,GAAA,CAAA,CAAA;QACnCP,QAAA,CAAAC,GAAA,IAAOJ,UAAW,CAAAI,GAAA,GAAMJ,UAAW,CAAAY,MAAA,CAAA;AAC5C,QAAA,MAAA;AACG,MAAA,KAAA,OAAA;AACMT,QAAAA,QAAA,CAAAK,IAAA,IAAQK,OAAOf,OAAO,CAAA,CAAA;QACtBK,QAAA,CAAAC,GAAA,IAAO,OAAOL,OAAA,KAAY,WAC/B,GAAAc,MAAA,CAAOd,OAAO,CAAA,GAAI,EAClB,GAAAC,UAAA,CAAWI,GAAM,GAAAJ,UAAA,CAAWY,MAAS,GAAA,CAAA,CAAA;AACzC,QAAA,MAAA;AAAA,KAAA;IAIJ,IAAIf,cAAc,OAAS,EAAA;AACzB,MAAA,IAAMiB,KAAQ,GAAA;AACZV,QAAAA,GAAA,EAAKC,SAASC,eAAgB,CAAAC,SAAA;AAC9BC,QAAAA,IAAA,EAAMH,SAASC,eAAgB,CAAAG,UAAA;QAC/BM,KAAO,EAAAV,QAAA,CAASC,eAAgB,CAAAG,UAAA,GAAaJ,SAASC,eAAgB,CAAAU,WAAA;QACtEC,MAAQ,EAAAZ,QAAA,CAASC,eAAgB,CAAAC,SAAA,GAAYF,SAASC,eAAgB,CAAAY,YAAAA;OACxE,CAAA;MAGA,IAAIf,QAAS,CAAAC,GAAA,GAAMU,KAAM,CAAAG,MAAA,GAASf,YAAYU,MAAQ,EAAA;AACpDT,QAAAA,QAAA,CAASC,MAAMC,QAAS,CAAAC,eAAA,CAAgBC,YAAYP,UAAW,CAAAI,GAAA,GAAMF,YAAYU,MAAS,GAAA,CAAA,CAAA;AAC5F,OAAA;MAGA,IAAIT,QAAS,CAAAK,IAAA,GAAOM,KAAM,CAAAC,KAAA,GAAQb,YAAYS,KAAO,EAAA;QAC1CR,QAAA,CAAAK,IAAA,GAAOM,KAAM,CAAAC,KAAA,GAAQb,WAAY,CAAAS,KAAA,CAAA;AAC5C,OAAA;AACF,KAAA;AACF,GAAA;AAEO,EAAA,OAAAR,QAAA,CAAA;AACT;;;;"}