UNPKG

shineout

Version:

Shein 前端组件库

108 lines (84 loc) 3.44 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.getPosition = void 0; var _objectSpread3 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread")); var _document = require("./document"); var posKeys = ['left', 'top', 'bottom', 'right']; var getPosition = function getPosition(position, el, container) { if (container === void 0) { container = document.body; } var rect = el.getBoundingClientRect(); var containerRect = { top: 0, left: 0, bottom: 0, right: 0 }; if (container.tagName === 'BODY') container = undefined; if (container) containerRect = container.getBoundingClientRect(); var scrollTop = container ? 0 : _document.docScroll.top; var scrollLeft = container ? 0 : _document.docScroll.left; var pos = {}; switch (position) { case 'top-left': pos.left = scrollLeft + rect.left - containerRect.left; pos.top = scrollTop + rect.top - containerRect.top; break; case 'top': pos.left = scrollLeft + rect.left - containerRect.left + rect.width / 2; pos.top = scrollTop + rect.top - containerRect.top; break; case 'top-right': pos.right = (containerRect.right || _document.docSize.width) - rect.right - scrollLeft; pos.top = scrollTop + rect.top - containerRect.top; break; case 'left-top': pos.left = scrollLeft + rect.left - containerRect.left; pos.top = scrollTop + rect.top - containerRect.top; break; case 'left': pos.left = scrollLeft + rect.left - containerRect.left; pos.top = scrollTop + rect.top - containerRect.top + rect.height / 2; break; case 'left-bottom': pos.left = scrollLeft + rect.left - containerRect.left; pos.top = scrollTop + rect.bottom - containerRect.bottom; break; case 'right-top': pos.left = scrollLeft + rect.left - containerRect.left + rect.width; pos.top = scrollTop + rect.top - containerRect.top; break; case 'right': pos.left = scrollLeft + rect.left - containerRect.left + rect.width; pos.top = scrollTop + rect.top - containerRect.top + rect.height / 2; break; case 'right-bottom': pos.left = scrollLeft + rect.left - containerRect.left + rect.width; pos.top = scrollTop + rect.bottom - containerRect.bottom; break; case 'bottom-left': pos.left = scrollLeft + rect.left - containerRect.left; pos.top = scrollTop + rect.top - containerRect.top + rect.height; break; case 'bottom': pos.left = scrollLeft + rect.left - containerRect.left + rect.width / 2; pos.top = scrollTop + rect.top - containerRect.top + rect.height; break; case 'bottom-right': pos.right = (containerRect.right || _document.docSize.width) - rect.right - scrollLeft; pos.top = scrollTop + rect.top - containerRect.top + rect.height; break; case 'cover': pos.left = scrollLeft + rect.left - containerRect.left; pos.top = scrollTop + rect.top - containerRect.top; break; default: } return posKeys.reduce(function (data, key) { var _objectSpread2; return (0, _objectSpread3.default)({}, data, (_objectSpread2 = {}, _objectSpread2[key] = typeof pos[key] === 'number' ? Math.round(pos[key]) + "px" : 'auto', _objectSpread2)); }, {}); }; exports.getPosition = getPosition;