mirror of
https://github.com/siyuan-note/siyuan.git
synced 2026-01-13 12:18:50 +01:00
36 lines
1.5 KiB
TypeScript
36 lines
1.5 KiB
TypeScript
|
|
import {Constants} from "../constants";
|
|||
|
|
|
|||
|
|
export const setPosition = (element: HTMLElement, x: number, y: number, targetHeight = 0, targetLeft = 0) => {
|
|||
|
|
element.style.top = y + "px";
|
|||
|
|
element.style.left = x + "px";
|
|||
|
|
const rect = element.getBoundingClientRect();
|
|||
|
|
// windows 下悬浮菜单在 drag 位置时无法点击
|
|||
|
|
let dragBarHeight = 0;
|
|||
|
|
/// #if !BROWSER
|
|||
|
|
if ("windows" === window.siyuan.config.system.os) {
|
|||
|
|
dragBarHeight = document.getElementById("drag").clientHeight;
|
|||
|
|
}
|
|||
|
|
/// #endif
|
|||
|
|
// 上下超出屏幕
|
|||
|
|
if (rect.bottom > window.innerHeight || rect.top < dragBarHeight) {
|
|||
|
|
const top = y - rect.height - targetHeight;
|
|||
|
|
if (top > dragBarHeight && (top + rect.height) < window.innerHeight - dragBarHeight) {
|
|||
|
|
// 上部
|
|||
|
|
element.style.top = top + "px";
|
|||
|
|
} else if (top <= dragBarHeight) {
|
|||
|
|
// 位置超越到屏幕上方外时,需移动到屏幕顶部。eg:光标在第一个块,然后滚动到上方看不见的位置,按 ctrl+a
|
|||
|
|
element.style.top = dragBarHeight + "px";
|
|||
|
|
} else {
|
|||
|
|
// 依旧展现在下部,只是位置上移
|
|||
|
|
element.style.top = Math.max(Constants.SIZE_TOOLBAR_HEIGHT, window.innerHeight - rect.height) + "px";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (rect.right > window.innerWidth) {
|
|||
|
|
// 展现在左侧
|
|||
|
|
element.style.left = `${window.innerWidth - rect.width - targetLeft}px`;
|
|||
|
|
} else if (rect.left < 0) {
|
|||
|
|
// 依旧展现在左侧,只是位置右移
|
|||
|
|
element.style.left = "0";
|
|||
|
|
}
|
|||
|
|
};
|