diff --git a/video-gen-app/src/pages/LoginPage.tsx b/video-gen-app/src/pages/LoginPage.tsx index 9adb9673..29c182bd 100644 --- a/video-gen-app/src/pages/LoginPage.tsx +++ b/video-gen-app/src/pages/LoginPage.tsx @@ -48,6 +48,7 @@ const LoginPage: React.FC = () => { const [siteName, setSiteName] = useState(initialInfo.siteName); const [siteLogo, setSiteLogo] = useState(initialInfo.siteLogo); const [loginBgVideo, setLoginBgVideo] = useState(''); + const [mediaReady, setMediaReady] = useState(false); const [agreementPrivacyUrl, setAgreementPrivacyUrl] = useState(''); const [siteCopyright, setSiteCopyright] = useState(''); @@ -288,9 +289,12 @@ const LoginPage: React.FC = () => { return (
- {/* 背景视频/动图全屏铺满 — 预加载避免闪烁 */} - -
+ {/* 背景视频/动图全屏铺满 — 预加载完成后再显示页面 */} + setMediaReady(true)} /> +
+ + {/* 内容区 — 媒体加载完成后淡入 */} +
{/* 左上角 slogan */}
@@ -498,47 +502,48 @@ const LoginPage: React.FC = () => {
)} + +
{/* end media-ready wrapper */}
); }; -const BackgroundVideo: React.FC<{ src: string }> = ({ src }) => { +const BackgroundVideo: React.FC<{ src: string; onReady: () => void }> = ({ src, onReady }) => { const [ready, setReady] = useState(false); const vidRef = React.useRef(null); - if (!src) return null; + const handleReady = () => { + if (ready) return; + setReady(true); + vidRef.current?.play().catch(() => {}); + onReady(); + }; + + if (!src) { onReady(); return null; } const isGif = src.toLowerCase().endsWith('.gif'); const isWebp = src.toLowerCase().endsWith('.webp'); if (isGif || isWebp) { - return ; + return ; } - const handleCanPlay = () => { - setReady(true); - vidRef.current?.play().catch(() => {}); - }; - return ( - <> - {/* 视频加载前显示静态背景图作为占位 */} - {!ready &&
} - - + ); };