import { Ref } from "vue"; // 计算各个方向位置 const postionFns: any = { top(el: HTMLElement, popper: HTMLElement, innnerPosition: Ref, called: boolean) { let {top, left, bottom} = el.getBoundingClientRect() if ((top = top - popper.offsetHeight - 6) < 0 && bottom > popper.offsetHeight) { innnerPosition.value = 'bottom'; top = bottom; } return { top: `${top}px`, left: `${left - (popper.offsetWidth - el.offsetWidth) / 2}px` } }, bottom(el: HTMLElement, popper: HTMLElement, innnerPosition: Ref, called: boolean) { let { top, left, bottom } = el.getBoundingClientRect() if (window.innerHeight - bottom < popper.offsetHeight + 6) { innnerPosition.value = 'top'; bottom = top - popper.offsetHeight - 6; } return { top: `${bottom}px`, left: `${left - (popper.offsetWidth - el.offsetWidth) / 2}px` } }, left(el: HTMLElement, popper: HTMLElement, innnerPosition: Ref, called : boolean) { let {top, left, right} = el.getBoundingClientRect() left = left - popper.offsetWidth - 6; if (left < 0) { innnerPosition.value = 'right'; left = right; } return { top: `${top - (popper.offsetHeight - el.offsetHeight) / 2}px`, left: `${left}px` } }, right(el: HTMLElement, popper: HTMLElement, innnerPosition: Ref, called: boolean) { let { top, left, right } = el.getBoundingClientRect() if (window.innerWidth < right + popper.offsetWidth + 6) { innnerPosition.value = 'left'; right = left - popper.offsetWidth - 6; } return { top: `${top - (popper.offsetHeight - el.offsetHeight) / 2}px`, left: `${right}px` } } } export default postionFns;