40 lines
1 KiB
JavaScript
40 lines
1 KiB
JavaScript
function get_best_coords_for_popup(_options) {
|
|
const viewport_width = document.body.getBoundingClientRect().width;
|
|
const viewport_height = document.body.getBoundingClientRect().height;
|
|
|
|
const options = {
|
|
offset: {
|
|
x: 0,
|
|
y: 0,
|
|
},
|
|
popup: {
|
|
width: 200,
|
|
height: 200,
|
|
},
|
|
..._options,
|
|
};
|
|
|
|
const target = options.target ?? {
|
|
x:
|
|
options.target_element?.getBoundingClientRect().left ??
|
|
viewport_width / 2 - options.popup.width / 2,
|
|
y:
|
|
options.target_element?.getBoundingClientRect().top ??
|
|
viewport_height / 2 - options.popup.height / 2,
|
|
};
|
|
|
|
const best_coords = {
|
|
x: target.x + options.offset.x,
|
|
y: target.y + options.offset.y,
|
|
};
|
|
|
|
if (target.x + options.offset.x + options.popup.width + options.offset.x > viewport_width) {
|
|
best_coords.x = Math.max(0, target.x - options.popup.width + options.offset.x);
|
|
}
|
|
|
|
if (target.y + options.offset.y + options.popup.height + options.offset.y > viewport_height) {
|
|
best_coords.y = Math.max(0, target.y - options.popup.height + options.offset.y);
|
|
}
|
|
|
|
return best_coords;
|
|
}
|