offset.js
/**
* Calculate absolute offsets of an element, relative to the document.
*
* @module mucss/offsets
*
*/
var win = window;
var doc = document;
var Rect = require('./rect');
var hasScroll = require('./has-scroll');
var scrollbar = require('./scrollbar');
var isFixedEl = require('./is-fixed');
var getTranslate = require('./translate');
/**
* Return absolute offsets of any target passed
*
* @param {Element|window} el A target. Pass window to calculate viewport offsets
* @return {Object} Offsets object with trbl.
*/
module.exports = offsets;
function offsets (el) {
if (!el) throw Error('Bad argument');
//calc client rect
var cRect, result;
//return vp offsets
if (el === win) {
result = Rect(
win.pageXOffset,
win.pageYOffset
);
result.width = win.innerWidth - (hasScroll.y() ? scrollbar : 0),
result.height = win.innerHeight - (hasScroll.x() ? scrollbar : 0)
result.right = result.left + result.width;
result.bottom = result.top + result.height;
return result;
}
//return absolute offsets if document requested
else if (el === doc) {
var res = offsets(doc.documentElement);
res.bottom = Math.max(window.innerHeight, res.bottom);
res.right = Math.max(window.innerWidth, res.right);
res.height = Math.max(window.innerHeight, res.height);
res.width = Math.max(window.innerHeight, res.width);
if (hasScroll.y(doc.documentElement)) res.right -= scrollbar;
if (hasScroll.x(doc.documentElement)) res.bottom -= scrollbar;
return res;
}
//FIXME: why not every element has getBoundingClientRect method?
try {
cRect = el.getBoundingClientRect();
} catch (e) {
cRect = Rect(
el.clientLeft,
el.clientTop
);
}
//whether element is or is in fixed
var isFixed = isFixedEl(el);
var xOffset = isFixed ? 0 : win.pageXOffset;
var yOffset = isFixed ? 0 : win.pageYOffset;
result = Rect(
cRect.left + xOffset,
cRect.top + yOffset,
cRect.left + xOffset + el.offsetWidth,
cRect.top + yOffset + el.offsetHeight
);
return result;
};