position.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import { computeStyle, computeStyleInt } from './css';
  2. import { isElement } from './elem';
  3. export function offset(elem) {
  4. const rect = elem.getBoundingClientRect();
  5. const win = elem.ownerDocument.defaultView;
  6. return {
  7. top: rect.top + win.pageYOffset,
  8. left: rect.left + win.pageXOffset,
  9. };
  10. }
  11. export function width(elem) {
  12. const rect = elem.getBoundingClientRect();
  13. return rect.width;
  14. }
  15. export function height(elem) {
  16. const rect = elem.getBoundingClientRect();
  17. return rect.height;
  18. }
  19. export function position(elem) {
  20. const isFixed = computeStyle(elem, 'position') === 'fixed';
  21. let offsetValue;
  22. if (isFixed) {
  23. const rect = elem.getBoundingClientRect();
  24. offsetValue = { left: rect.left, top: rect.top };
  25. }
  26. else {
  27. offsetValue = offset(elem);
  28. }
  29. if (!isFixed) {
  30. const doc = elem.ownerDocument;
  31. let offsetParent = elem.offsetParent || doc.documentElement;
  32. while ((offsetParent === doc.body || offsetParent === doc.documentElement) &&
  33. computeStyle(offsetParent, 'position') === 'static') {
  34. offsetParent = offsetParent.parentNode;
  35. }
  36. if (offsetParent !== elem && isElement(offsetParent)) {
  37. const parentOffset = offset(offsetParent);
  38. offsetValue.top -=
  39. parentOffset.top + computeStyleInt(offsetParent, 'borderTopWidth');
  40. offsetValue.left -=
  41. parentOffset.left + computeStyleInt(offsetParent, 'borderLeftWidth');
  42. }
  43. }
  44. return {
  45. top: offsetValue.top - computeStyleInt(elem, 'marginTop'),
  46. left: offsetValue.left - computeStyleInt(elem, 'marginLeft'),
  47. };
  48. }
  49. //# sourceMappingURL=position.js.map