2025-12-10 12:02:17 +08:00

79 lines
2.4 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ensureViewBoundingRect = ensureViewBoundingRect;
exports.getPointRect = getPointRect;
exports.getRect = getRect;
exports.getParentNode = getParentNode;
exports.getScrollParent = getScrollParent;
let viewMeasurer = null;
function ensureViewBoundingRect() {
if (viewMeasurer === null) {
viewMeasurer = document.getElementById('v-binder-view-measurer');
if (viewMeasurer === null) {
viewMeasurer = document.createElement('div');
viewMeasurer.id = 'v-binder-view-measurer';
const { style } = viewMeasurer;
style.position = 'fixed';
style.left = '0';
style.right = '0';
style.top = '0';
style.bottom = '0';
style.pointerEvents = 'none';
style.visibility = 'hidden';
document.body.appendChild(viewMeasurer);
}
}
return viewMeasurer.getBoundingClientRect();
}
function getPointRect(x, y) {
const viewRect = ensureViewBoundingRect();
return {
top: y,
left: x,
height: 0,
width: 0,
right: viewRect.width - x,
bottom: viewRect.height - y
};
}
function getRect(el) {
const elRect = el.getBoundingClientRect();
const viewRect = ensureViewBoundingRect();
return {
left: elRect.left - viewRect.left,
top: elRect.top - viewRect.top,
bottom: viewRect.height + viewRect.top - elRect.bottom,
right: viewRect.width + viewRect.left - elRect.right,
width: elRect.width,
height: elRect.height
};
}
function getParentNode(node) {
// document type
if (node.nodeType === 9) {
return null;
}
return node.parentNode;
}
function getScrollParent(node) {
if (node === null)
return null;
const parentNode = getParentNode(node);
if (parentNode === null) {
return null;
}
// Document
if (parentNode.nodeType === 9) {
return document;
}
// Element
if (parentNode.nodeType === 1) {
// Firefox want us to check `-x` and `-y` variations as well
const { overflow, overflowX, overflowY } = getComputedStyle(parentNode);
if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {
return parentNode;
}
}
return getScrollParent(parentNode);
}