dom_get-coords.js

/**
 * @module getCoords
 * @description Get an elements offset relative to viewport for top, left and bottom. Useful for
 * positioning fixed elements to a set position in the viewport when css position sticky isn't enough.
 *
 * @since 1.0.0
 *
 * @param {HTMLElement} element The element to get coordinates for.
 *
 * @return {object} An object containing top, left and bottom values for an elements position in viewport.
 *
 * @example
 * import { getCoords } from  "@gravityforms/utils";
 *
 * function Example() {
 *  const adminBar = document.getElementById( 'wpadminbar' );
 * 	const barOffset = adminBar ? adminBar.offsetHeight : 0;
 * 	const offset = getCoords( exampleHTMLElement );
 *
 * 	exampleHTMLElement.style.top = `${ offset.top - barOffset }px`;
 * 	exampleHTMLElement.style.left = `${ offset.left }px`;
 * }
 *
 */
export default function getCoords( element ) {
	const box = element.getBoundingClientRect();

	const body = document.body;
	const docEl = document.documentElement;

	const scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
	const scrollLeft =
		window.pageXOffset || docEl.scrollLeft || body.scrollLeft;

	const clientTop = docEl.clientTop || body.clientTop || 0;
	const clientLeft = docEl.clientLeft || body.clientLeft || 0;

	const top = box.top + scrollTop - clientTop;
	const left = box.left + scrollLeft - clientLeft;

	return {
		top: Math.round( top ),
		left: Math.round( left ),
		bottom: Math.round( box.bottom ),
	};
}