Skip to content

Commit 7df8e13

Browse files
committed
fix: improve loading animation and transition effects in the app
1 parent c785158 commit 7df8e13

File tree

2 files changed

+87
-6
lines changed

2 files changed

+87
-6
lines changed

frontend/index.html

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,62 @@
1-
<!doctype html>
1+
<!DOCTYPE html>
22
<html lang="en">
33
<head>
44
<meta charset="UTF-8" />
55
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
66
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
77
<title>vite-app</title>
8+
<style>
9+
/* Loading styles to prevent white screen */
10+
body {
11+
overflow: hidden;
12+
transition: overflow 0s 0.45s;
13+
}
14+
15+
body.loaded {
16+
overflow: auto;
17+
}
18+
19+
#app-loading {
20+
position: fixed;
21+
top: 0;
22+
left: 0;
23+
width: 100%;
24+
height: 100%;
25+
background-color: #ffffff;
26+
z-index: 9999;
27+
transition: opacity 0.6s cubic-bezier(0.4, 0, 0.2, 1);
28+
}
29+
30+
@media (prefers-color-scheme: dark) {
31+
#app-loading {
32+
background-color: #0a0a0a;
33+
}
34+
}
35+
36+
#app-loading.fade-out {
37+
opacity: 0;
38+
pointer-events: none;
39+
}
40+
41+
#root {
42+
opacity: 0;
43+
filter: blur(4px);
44+
transform: scale(0.99);
45+
transition: opacity 0.45s cubic-bezier(0.4, 0, 0.2, 1),
46+
filter 0.45s cubic-bezier(0.4, 0, 0.2, 1),
47+
transform 0.45s cubic-bezier(0.4, 0, 0.2, 1);
48+
will-change: opacity, filter, transform;
49+
}
50+
51+
#root.loaded {
52+
opacity: 1;
53+
filter: blur(0);
54+
transform: scale(1);
55+
}
56+
</style>
857
</head>
958
<body>
59+
<div id="app-loading"></div>
1060
<div id="root"></div>
1161
<script type="module" src="/src/main.tsx"></script>
1262
</body>

frontend/src/main.tsx

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { StrictMode } from "react";
1+
import { StrictMode, useEffect } from "react";
22
import { createRoot } from "react-dom/client";
33

44
import "./index.css";
@@ -12,13 +12,44 @@ import { defaultLocale, dynamicActivate } from "./i18n";
1212
// Initialize i18n
1313
dynamicActivate(defaultLocale);
1414

15+
// 移除加载动画并显示主界面
16+
const removeLoader = () => {
17+
const loader = document.getElementById('app-loading');
18+
const root = document.getElementById('root');
19+
20+
if (loader && root) {
21+
// 先让内容淡入
22+
requestAnimationFrame(() => {
23+
root.classList.add('loaded');
24+
document.body.classList.add('loaded');
25+
// 同时让加载屏淡出
26+
loader.classList.add('fade-out');
27+
// 动画完成后移除加载屏
28+
setTimeout(() => {
29+
loader.remove();
30+
}, 600);
31+
});
32+
}
33+
};
34+
35+
function AppWrapper() {
36+
useEffect(() => {
37+
// 组件挂载后移除加载动画
38+
removeLoader();
39+
}, []);
40+
41+
return (
42+
<ThemeProvider defaultTheme="system" storageKey="vite-ui-theme">
43+
<App />
44+
<Toaster position="top-center" />
45+
</ThemeProvider>
46+
);
47+
}
48+
1549
createRoot(document.getElementById("root")!).render(
1650
<StrictMode>
1751
<I18nProvider i18n={i18n}>
18-
<ThemeProvider defaultTheme="system" storageKey="vite-ui-theme">
19-
<App />
20-
<Toaster position="top-center" />
21-
</ThemeProvider>
52+
<AppWrapper />
2253
</I18nProvider>
2354
</StrictMode>
2455
);

0 commit comments

Comments
 (0)