position.mjs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { isClient } from "../browser.mjs";
  2. //#region ../../packages/utils/dom/position.ts
  3. const isInContainer = (el, container) => {
  4. if (!isClient || !el || !container) return false;
  5. const elRect = el.getBoundingClientRect();
  6. let containerRect;
  7. if (container instanceof Element) containerRect = container.getBoundingClientRect();
  8. else containerRect = {
  9. top: 0,
  10. right: window.innerWidth,
  11. bottom: window.innerHeight,
  12. left: 0
  13. };
  14. return elRect.top < containerRect.bottom && elRect.bottom > containerRect.top && elRect.right > containerRect.left && elRect.left < containerRect.right;
  15. };
  16. const getOffsetTop = (el) => {
  17. let offset = 0;
  18. let parent = el;
  19. while (parent) {
  20. offset += parent.offsetTop;
  21. parent = parent.offsetParent;
  22. }
  23. return offset;
  24. };
  25. const getOffsetTopDistance = (el, containerEl) => {
  26. return Math.abs(getOffsetTop(el) - getOffsetTop(containerEl));
  27. };
  28. const getClientXY = (event) => {
  29. let clientX;
  30. let clientY;
  31. if (event.type === "touchend") {
  32. clientY = event.changedTouches[0].clientY;
  33. clientX = event.changedTouches[0].clientX;
  34. } else if (event.type.startsWith("touch")) {
  35. clientY = event.touches[0].clientY;
  36. clientX = event.touches[0].clientX;
  37. } else {
  38. clientY = event.clientY;
  39. clientX = event.clientX;
  40. }
  41. return {
  42. clientX,
  43. clientY
  44. };
  45. };
  46. //#endregion
  47. export { getClientXY, getOffsetTop, getOffsetTopDistance, isInContainer };
  48. //# sourceMappingURL=position.mjs.map