position.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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 elRect.top < containerRect.bottom && elRect.bottom > containerRect.top && elRect.right > containerRect.left && elRect.left < containerRect.right
  17. }
  18. export const getOffsetTop = (el: HTMLElement) => {
  19. let offset = 0
  20. let parent = el
  21. while (parent) {
  22. offset += parent.offsetTop
  23. parent = parent.offsetParent as HTMLElement
  24. }
  25. return offset
  26. }
  27. export const getOffsetTopDistance = (el: HTMLElement, containerEl: HTMLElement) => {
  28. return Math.abs(getOffsetTop(el) - getOffsetTop(containerEl))
  29. }
  30. export const getClientXY = (event: MouseEvent | TouchEvent) => {
  31. let clientX: number
  32. let clientY: number
  33. if (event.type === 'touchend') {
  34. clientY = (event as TouchEvent).changedTouches[0].clientY
  35. clientX = (event as TouchEvent).changedTouches[0].clientX
  36. } else if (event.type.startsWith('touch')) {
  37. clientY = (event as TouchEvent).touches[0].clientY
  38. clientX = (event as TouchEvent).touches[0].clientX
  39. } else {
  40. clientY = (event as MouseEvent).clientY
  41. clientX = (event as MouseEvent).clientX
  42. }
  43. return {
  44. clientX,
  45. clientY,
  46. }
  47. }