scroll-padlock
Version:
Locks elements scroll handling scrollbar gaps and iOS Safari with CSS variables
61 lines (52 loc) • 1.86 kB
JavaScript
import {
WIDTH,
INNER_WIDTH,
HEIGHT,
INNER_HEIGHT,
CLIENT_WIDTH,
CLIENT_HEIGHT,
OUTER_WIDTH,
OUTER_HEIGHT,
SCROLL_WIDTH,
SCROLL_HEIGHT,
SCROLLBAR_WIDTH,
SCROLLBAR_HEIGHT
} from './constants.js';
/**
* Gets a given element or browser dimensions
* @param {HTMLElement} element The given element whose dimensions need to be retrieved
* @param {Window|HTMLElement} scroller The given scrollable used to retrieve some dimensions when the given element is global (page)
* @returns {Object} The given element dimensions as an object ({ top, left })
*/
export default (element, scroller) => {
// Implying global (page) element...
let outer = {
[]: scroller?.[INNER_WIDTH],
[]: scroller?.[INNER_HEIGHT]
};
// ...falling back to html element
if( !outer[WIDTH] && !outer[HEIGHT] ){
outer = element?.getBoundingClientRect() ?? {};
}
// Element area with scrollbars
const outerWidth = outer?.[WIDTH] ?? 0;
const outerHeight = outer?.[HEIGHT] ?? 0;
// Element area without scrollbars
const innerWidth = element?.[CLIENT_WIDTH] ?? 0;
const innerHeight = element?.[CLIENT_HEIGHT] ?? 0;
// Returns the final object
return {
// Element area with scrollbars
[]: outerWidth,
[]: outerHeight,
// Element area without scrollbars
[]: Math.min(outerWidth, innerWidth),
[]: Math.min(outerHeight, innerHeight),
// Element content area
[]: element?.[SCROLL_WIDTH] ?? 0,
[]: element?.[SCROLL_HEIGHT] ?? 0,
// Element scrollbar size
[]: Math.max(0, outerWidth - innerWidth),
[]: Math.max(0, outerHeight - innerHeight)
};
};