You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
2.0 KiB

  1. import getBoundingClientRect from "./getBoundingClientRect.js";
  2. import getNodeScroll from "./getNodeScroll.js";
  3. import getNodeName from "./getNodeName.js";
  4. import { isHTMLElement } from "./instanceOf.js";
  5. import getWindowScrollBarX from "./getWindowScrollBarX.js";
  6. import getDocumentElement from "./getDocumentElement.js";
  7. import isScrollParent from "./isScrollParent.js";
  8. import { round } from "../utils/math.js";
  9. function isElementScaled(element) {
  10. var rect = element.getBoundingClientRect();
  11. var scaleX = round(rect.width) / element.offsetWidth || 1;
  12. var scaleY = round(rect.height) / element.offsetHeight || 1;
  13. return scaleX !== 1 || scaleY !== 1;
  14. } // Returns the composite rect of an element relative to its offsetParent.
  15. // Composite means it takes into account transforms as well as layout.
  16. export default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
  17. if (isFixed === void 0) {
  18. isFixed = false;
  19. }
  20. var isOffsetParentAnElement = isHTMLElement(offsetParent);
  21. var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);
  22. var documentElement = getDocumentElement(offsetParent);
  23. var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled);
  24. var scroll = {
  25. scrollLeft: 0,
  26. scrollTop: 0
  27. };
  28. var offsets = {
  29. x: 0,
  30. y: 0
  31. };
  32. if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
  33. if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078
  34. isScrollParent(documentElement)) {
  35. scroll = getNodeScroll(offsetParent);
  36. }
  37. if (isHTMLElement(offsetParent)) {
  38. offsets = getBoundingClientRect(offsetParent, true);
  39. offsets.x += offsetParent.clientLeft;
  40. offsets.y += offsetParent.clientTop;
  41. } else if (documentElement) {
  42. offsets.x = getWindowScrollBarX(documentElement);
  43. }
  44. }
  45. return {
  46. x: rect.left + scroll.scrollLeft - offsets.x,
  47. y: rect.top + scroll.scrollTop - offsets.y,
  48. width: rect.width,
  49. height: rect.height
  50. };
  51. }