diff --git a/frontend/src/main.js b/frontend/src/main.js index 6fe6cf3a4..ab33e3954 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -12,6 +12,7 @@ import { checkToken, clearToken, isLogin } from './utils/auth' import { loginWithGoogle } from './utils/google' import { initTheme } from './utils/theme' import { clearVditorStorage } from './utils/clearVditorStorage' +import { initIOSKeyboardFix } from './utils/iosKeyboardFix' // 采用本地开发环境 // export const API_DOMAIN = 'http://127.0.0.1' @@ -34,6 +35,7 @@ export const toast = useToast() initTheme() clearVditorStorage() +initIOSKeyboardFix() const app = createApp(App) app.use(router) diff --git a/frontend/src/utils/iosKeyboardFix.js b/frontend/src/utils/iosKeyboardFix.js new file mode 100644 index 000000000..d7bee160c --- /dev/null +++ b/frontend/src/utils/iosKeyboardFix.js @@ -0,0 +1,23 @@ +export function initIOSKeyboardFix() { + if (typeof window === 'undefined' || !window.visualViewport) return; + + const ua = navigator.userAgent || ''; + const isIOS = /iP(ad|hone|od)/.test(ua); + if (!isIOS) return; + + const viewport = window.visualViewport; + const adjustScroll = () => { + window.scrollTo(0, viewport.offsetTop); + }; + + viewport.addEventListener('resize', adjustScroll); + viewport.addEventListener('scroll', adjustScroll); + + let lastScrollY = 0; + document.addEventListener('focusin', () => { + lastScrollY = window.scrollY; + }); + document.addEventListener('focusout', () => { + window.scrollTo(0, lastScrollY); + }); +}