shineout
Version:
Shein 前端组件库
108 lines (84 loc) • 3.44 kB
JavaScript
;
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;