dom-helpers-extra
Version:
Related extension of dom-helpers
59 lines (49 loc) • 1.52 kB
JavaScript
import getOffset from "dom-helpers/offset";
import css from "dom-helpers/css";
import position from "dom-helpers/position";
function offset(node, coords) {
if (!coords) {
return getOffset(node);
}
var curPosition,
curLeft,
curCSSTop,
curTop,
curOffset,
curCSSLeft,
calculatePosition,
positionState = css(node, "position"),
props = {};
var targetPos = {}; // Set position first, in-case top/left are set even on static elem
if (positionState === "static") {
node.style.position = "relative";
}
curOffset = getOffset(node);
curCSSTop = css(node, "top");
curCSSLeft = css(node, "left");
calculatePosition = (positionState === "absolute" || positionState === "fixed") && (curCSSTop + curCSSLeft).indexOf("auto") > -1; // Need to be able to calculate position if either
// top or left is auto and position is either absolute or fixed
if (calculatePosition) {
curPosition = position(node);
curTop = curPosition.top;
curLeft = curPosition.left;
} else {
curTop = parseFloat(curCSSTop) || 0;
curLeft = parseFloat(curCSSLeft) || 0;
}
if (coords.top != null) {
targetPos.top = coords.top - curOffset.top + curTop;
props.top = targetPos.top + "px";
}
if (coords.left != null) {
targetPos.left = coords.left - curOffset.left + curLeft;
props.left = targetPos.left + "px";
}
if (coords.using) {
coords.using(targetPos);
} else {
css(node, props);
}
return;
}
export default offset;