You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.5 KiB
52 lines
1.5 KiB
// @flow
|
|
import type { ClientRectObject, VirtualElement } from '../types';
|
|
import { isElement, isHTMLElement } from './instanceOf';
|
|
import { round } from '../utils/math';
|
|
import getWindow from './getWindow';
|
|
import isLayoutViewport from './isLayoutViewport';
|
|
|
|
export default function getBoundingClientRect(
|
|
element: Element | VirtualElement,
|
|
includeScale: boolean = false,
|
|
isFixedStrategy: boolean = false
|
|
): ClientRectObject {
|
|
const clientRect = element.getBoundingClientRect();
|
|
let scaleX = 1;
|
|
let scaleY = 1;
|
|
|
|
if (includeScale && isHTMLElement(element)) {
|
|
scaleX =
|
|
(element: HTMLElement).offsetWidth > 0
|
|
? round(clientRect.width) / (element: HTMLElement).offsetWidth || 1
|
|
: 1;
|
|
scaleY =
|
|
(element: HTMLElement).offsetHeight > 0
|
|
? round(clientRect.height) / (element: HTMLElement).offsetHeight || 1
|
|
: 1;
|
|
}
|
|
|
|
const { visualViewport } = isElement(element) ? getWindow(element) : window;
|
|
const addVisualOffsets = !isLayoutViewport() && isFixedStrategy;
|
|
|
|
const x =
|
|
(clientRect.left +
|
|
(addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) /
|
|
scaleX;
|
|
const y =
|
|
(clientRect.top +
|
|
(addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) /
|
|
scaleY;
|
|
const width = clientRect.width / scaleX;
|
|
const height = clientRect.height / scaleY;
|
|
|
|
return {
|
|
width,
|
|
height,
|
|
top: y,
|
|
right: x + width,
|
|
bottom: y + height,
|
|
left: x,
|
|
x,
|
|
y,
|
|
};
|
|
}
|