position.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { isClient } from '@vueuse/core';
  2. export const isInContainer = (el?: Element, container?: Element | Window): boolean => {
  3. if (!isClient || !el || !container) return false;
  4. const elRect = el.getBoundingClientRect();
  5. let containerRect: Pick<DOMRect, 'top' | 'bottom' | 'left' | 'right'>;
  6. if (container instanceof Element) {
  7. containerRect = container.getBoundingClientRect();
  8. } else {
  9. containerRect = {
  10. top: 0,
  11. right: window.innerWidth,
  12. bottom: window.innerHeight,
  13. left: 0,
  14. };
  15. }
  16. return (
  17. elRect.top < containerRect.bottom &&
  18. elRect.bottom > containerRect.top &&
  19. elRect.right > containerRect.left &&
  20. elRect.left < containerRect.right
  21. );
  22. };
  23. export const getOffsetTop = (el: HTMLElement) => {
  24. let offset = 0;
  25. let parent = el;
  26. while (parent) {
  27. offset += parent.offsetTop;
  28. parent = parent.offsetParent as HTMLElement;
  29. }
  30. return offset;
  31. };
  32. export const getOffsetTopDistance = (el: HTMLElement, containerEl: HTMLElement) => {
  33. return Math.abs(getOffsetTop(el) - getOffsetTop(containerEl));
  34. };
  35. export const getClientXY = (event: MouseEvent | TouchEvent) => {
  36. let clientX: number;
  37. let clientY: number;
  38. if (event.type === 'touchend') {
  39. clientY = (event as TouchEvent).changedTouches[0].clientY;
  40. clientX = (event as TouchEvent).changedTouches[0].clientX;
  41. } else if (event.type.startsWith('touch')) {
  42. clientY = (event as TouchEvent).touches[0].clientY;
  43. clientX = (event as TouchEvent).touches[0].clientX;
  44. } else {
  45. clientY = (event as MouseEvent).clientY;
  46. clientX = (event as MouseEvent).clientX;
  47. }
  48. return {
  49. clientX,
  50. clientY,
  51. };
  52. };