# all files / lib/utilities/ scrollUtilities.js

19.35% Statements 6/31
0% Branches 0/17
0% Functions 0/2
19.35% Lines 6/31

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    1×
    1×

    1×

    1×

    1×

    1×

     "use strict";
    var _scrollbarWidth;
    exports.DATA_IS_SCROLLABLE_ATTRIBUTE = 'data-is-scrollable';
    /** Calculates the width of a scrollbar for the browser/os. */
    function getScrollbarWidth() {
        if (_scrollbarWidth === undefined) {
            var scrollDiv = document.createElement('div');
            scrollDiv.style.setProperty('width', '100px');
            scrollDiv.style.setProperty('height', '100px');
            scrollDiv.style.setProperty('overflow', 'scroll');
            scrollDiv.style.setProperty('position', 'absolute');
            scrollDiv.style.setProperty('top', '-9999px');
            document.body.appendChild(scrollDiv);
            // Get the scrollbar width
            _scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
            // Delete the DIV
            document.body.removeChild(scrollDiv);
        }
        return _scrollbarWidth;
    }
    exports.getScrollbarWidth = getScrollbarWidth;
    /**
     * Traverses up the DOM for the element with the data-is-scrollable=true attribute, or returns
     * document.body.
     */
    function findScrollableParent(startingElement) {
        var el = startingElement;
        // First do a quick scan for the scrollable attribute.
        while (el && el !== document.body) {
            if (el.getAttribute(exports.DATA_IS_SCROLLABLE_ATTRIBUTE) === 'true') {
                return el;
            }
            el = el.parentElement;
        }
        // If we haven't found it, the use the slower method: compute styles to evaluate if overflow is set.
        el = startingElement;
        while (el && el !== document.body) {
            if (el.getAttribute(exports.DATA_IS_SCROLLABLE_ATTRIBUTE) !== 'false') {
                var styles = getComputedStyle(el);
                var overflowY = styles ? styles.getPropertyValue('overflow-y') : '';
                if (overflowY && (overflowY === 'scroll' || overflowY === 'auto')) {
                    return el;
                }
            }
            el = el.parentElement;
        }
        return el;
    }
    exports.findScrollableParent = findScrollableParent;

    //# sourceMappingURL=scrollUtilities.js.map