dfcreative/mucss

View on GitHub
offset.js

Summary

Maintainability
A
3 hrs
Test Coverage
/**
 * 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;
};