Vanessa преди 1 година
родител
ревизия
a3ec74f72c
променени са 1 файла, в които са добавени 17 реда и са изтрити 7 реда
  1. 17 7
      app/src/protyle/util/onGet.ts

+ 17 - 7
app/src/protyle/util/onGet.ts

@@ -4,7 +4,7 @@ import {fetchPost} from "../../util/fetch";
 import {processRender} from "./processCode";
 import {highlightRender} from "../render/highlightRender";
 import {blockRender} from "../render/blockRender";
-import {bgFade} from "../../util/highlightById";
+import {bgFade, scrollCenter} from "../../util/highlightById";
 /// #if !MOBILE
 import {pushBack} from "../../util/backForward";
 /// #endif
@@ -391,21 +391,31 @@ const focusElementById = (protyle: IProtyle, action: string[], scrollAttr?: IScr
         }
         /// #endif
     }
-    if (action.includes(Constants.CB_GET_FOCUS) || action.includes(Constants.CB_GET_HL) || action.includes(Constants.CB_GET_FOCUSFIRST)) {
-        focusElement.scrollIntoView();
-    } else if (scrollAttr && scrollAttr.scrollTop) {
+    if (scrollAttr && typeof scrollAttr.scrollTop === "number") {
         protyle.contentElement.scrollTop = scrollAttr.scrollTop;
+    }
+    if (action.includes(Constants.CB_GET_FOCUS) || action.includes(Constants.CB_GET_HL) || action.includes(Constants.CB_GET_FOCUSFIRST)) {
+        const contentRect = protyle.contentElement.getBoundingClientRect();
+        const focusRect = focusElement.getBoundingClientRect();
+        if (contentRect.top > focusRect.top || contentRect.bottom < focusRect.bottom) {
+            scrollCenter(protyle, focusElement);
+        }
     } else {
         protyle.observerLoad?.disconnect();
         return;
     }
     // 加强定位
     protyle.observerLoad = new ResizeObserver(() => {
-        if (action.includes(Constants.CB_GET_FOCUS) || action.includes(Constants.CB_GET_HL) || action.includes(Constants.CB_GET_FOCUSFIRST)) {
-            focusElement.scrollIntoView();
-        } else if (scrollAttr && scrollAttr.scrollTop) {
+        if (scrollAttr && typeof scrollAttr.scrollTop === "number") {
             protyle.contentElement.scrollTop = scrollAttr.scrollTop;
         }
+        if (action.includes(Constants.CB_GET_FOCUS) || action.includes(Constants.CB_GET_HL) || action.includes(Constants.CB_GET_FOCUSFIRST)) {
+            const contentRect = protyle.contentElement.getBoundingClientRect();
+            const focusRect = focusElement.getBoundingClientRect();
+            if (contentRect.top > focusRect.top || contentRect.bottom < focusRect.bottom) {
+                scrollCenter(protyle, focusElement);
+            }
+        }
     });
     protyle.observerLoad.observe(protyle.wysiwyg.element);
     protyle.observer.unobserve(protyle.wysiwyg.element);