diff --git a/src/renderer/index.css b/src/renderer/index.css index 1af7489..ffa64ea 100644 --- a/src/renderer/index.css +++ b/src/renderer/index.css @@ -136,3 +136,43 @@ font-size: 2.25rem; } } + +/* 骨架屏 shimmer 动画 */ +.skeleton-shimmer { + position: relative; + overflow: hidden; + background: #e5e7eb; +} + +.skeleton-shimmer::after { + content: ''; + position: absolute; + inset: 0; + background: linear-gradient( + 90deg, + transparent 0%, + rgba(255, 255, 255, 0.4) 50%, + transparent 100% + ); + animation: shimmer 1.5s infinite; + transform: translateX(-100%); +} + +:root.dark .skeleton-shimmer { + background: #262626; +} + +:root.dark .skeleton-shimmer::after { + background: linear-gradient( + 90deg, + transparent 0%, + rgba(255, 255, 255, 0.06) 50%, + transparent 100% + ); +} + +@keyframes shimmer { + 100% { + transform: translateX(100%); + } +} diff --git a/src/renderer/layout/AppLayout.vue b/src/renderer/layout/AppLayout.vue index 8b7f895..0e3a1c9 100644 --- a/src/renderer/layout/AppLayout.vue +++ b/src/renderer/layout/AppLayout.vue @@ -69,6 +69,10 @@ import { usePlayerStore } from '@/store/modules/player'; import { useSettingsStore } from '@/store/modules/settings'; import { isElectron } from '@/utils'; +// 关键布局组件同步导入(始终可见,避免加载闪烁) +import AppMenu from './components/AppMenu.vue'; +import SearchBar from './components/SearchBar.vue'; +import TitleBar from './components/TitleBar.vue'; // 移动端专用布局 import MobileLayout from './MobileLayout.vue'; @@ -87,11 +91,9 @@ const keepAliveInclude = computed(() => { .filter(Boolean); }); -const AppMenu = defineAsyncComponent(() => import('./components/AppMenu.vue')); +// 非关键组件保持异步加载 const PlayBar = defineAsyncComponent(() => import('@/components/player/PlayBar.vue')); const MobilePlayBar = defineAsyncComponent(() => import('@/components/player/MobilePlayBar.vue')); -const SearchBar = defineAsyncComponent(() => import('./components/SearchBar.vue')); -const TitleBar = defineAsyncComponent(() => import('./components/TitleBar.vue')); const PlayingListDrawer = defineAsyncComponent( () => import('@/components/player/PlayingListDrawer.vue') ); @@ -151,7 +153,7 @@ provide('openPlaylistDrawer', openPlaylistDrawer); } .menu { - @apply h-full; + @apply h-full bg-light dark:bg-black; } .main { diff --git a/src/renderer/layout/MobileLayout.vue b/src/renderer/layout/MobileLayout.vue index ea503f2..d3f73d0 100644 --- a/src/renderer/layout/MobileLayout.vue +++ b/src/renderer/layout/MobileLayout.vue @@ -37,9 +37,8 @@ import otherRouter from '@/router/other'; import { useMenuStore } from '@/store/modules/menu'; import { usePlayerStore } from '@/store/modules/player'; +import AppMenu from './components/AppMenu.vue'; import MobileHeader from './components/MobileHeader.vue'; - -const AppMenu = defineAsyncComponent(() => import('./components/AppMenu.vue')); const MobilePlayBar = defineAsyncComponent(() => import('@/components/player/MobilePlayBar.vue')); const PlayingListDrawer = defineAsyncComponent( () => import('@/components/player/PlayingListDrawer.vue') diff --git a/src/renderer/views/album/index.vue b/src/renderer/views/album/index.vue index 2c326b3..60a0021 100644 --- a/src/renderer/views/album/index.vue +++ b/src/renderer/views/album/index.vue @@ -30,11 +30,9 @@ diff --git a/src/renderer/views/artist/detail.vue b/src/renderer/views/artist/detail.vue index 26a4477..793090a 100644 --- a/src/renderer/views/artist/detail.vue +++ b/src/renderer/views/artist/detail.vue @@ -9,17 +9,19 @@
-
+
- +
- - +
+
- - +
+
@@ -29,12 +31,12 @@
- +
- - +
+
- +
diff --git a/src/renderer/views/home/components/HomeAlbumSection.vue b/src/renderer/views/home/components/HomeAlbumSection.vue index 3b2f205..7ff739c 100644 --- a/src/renderer/views/home/components/HomeAlbumSection.vue +++ b/src/renderer/views/home/components/HomeAlbumSection.vue @@ -20,9 +20,9 @@
-
-
-
+
+
+
diff --git a/src/renderer/views/home/components/HomeArtists.vue b/src/renderer/views/home/components/HomeArtists.vue index 55f4b62..cfad5bf 100644 --- a/src/renderer/views/home/components/HomeArtists.vue +++ b/src/renderer/views/home/components/HomeArtists.vue @@ -2,11 +2,9 @@
-
-
-
+
+
+
diff --git a/src/renderer/views/home/components/HomeCard.vue b/src/renderer/views/home/components/HomeCard.vue index 705f54a..5265dfb 100644 --- a/src/renderer/views/home/components/HomeCard.vue +++ b/src/renderer/views/home/components/HomeCard.vue @@ -12,7 +12,7 @@ class="h-full w-full object-cover transition-transform duration-500 group-hover:scale-110" loading="lazy" /> -
+
diff --git a/src/renderer/views/home/components/HomeHero.vue b/src/renderer/views/home/components/HomeHero.vue index 6bedd59..b505d37 100644 --- a/src/renderer/views/home/components/HomeHero.vue +++ b/src/renderer/views/home/components/HomeHero.vue @@ -6,16 +6,12 @@
-
-
+
+
diff --git a/src/renderer/views/home/components/HomeNewSongs.vue b/src/renderer/views/home/components/HomeNewSongs.vue index afb5e20..2299134 100644 --- a/src/renderer/views/home/components/HomeNewSongs.vue +++ b/src/renderer/views/home/components/HomeNewSongs.vue @@ -19,11 +19,7 @@
-
+
diff --git a/src/renderer/views/home/components/HomePlaylistSection.vue b/src/renderer/views/home/components/HomePlaylistSection.vue index bf5ad13..e8867ae 100644 --- a/src/renderer/views/home/components/HomePlaylistSection.vue +++ b/src/renderer/views/home/components/HomePlaylistSection.vue @@ -20,9 +20,9 @@
-
-
-
+
+
+
diff --git a/src/renderer/views/home/components/HomePrivateContent.vue b/src/renderer/views/home/components/HomePrivateContent.vue index f0a3371..313655b 100644 --- a/src/renderer/views/home/components/HomePrivateContent.vue +++ b/src/renderer/views/home/components/HomePrivateContent.vue @@ -18,7 +18,7 @@
diff --git a/src/renderer/views/list/index.vue b/src/renderer/views/list/index.vue index da1819e..656207b 100644 --- a/src/renderer/views/list/index.vue +++ b/src/renderer/views/list/index.vue @@ -30,10 +30,8 @@ diff --git a/src/renderer/views/mv/index.vue b/src/renderer/views/mv/index.vue index 717ec6a..40a135d 100644 --- a/src/renderer/views/mv/index.vue +++ b/src/renderer/views/mv/index.vue @@ -31,11 +31,9 @@
-
-
-
+
+
+
diff --git a/src/renderer/views/podcast/index.vue b/src/renderer/views/podcast/index.vue index 7b4cf44..590de08 100644 --- a/src/renderer/views/podcast/index.vue +++ b/src/renderer/views/podcast/index.vue @@ -193,11 +193,9 @@ class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-5 gap-6" >
-
-
-
+
+
+
@@ -234,11 +232,9 @@
diff --git a/src/renderer/views/search/SearchResult.vue b/src/renderer/views/search/SearchResult.vue index 567b7e6..551c80e 100644 --- a/src/renderer/views/search/SearchResult.vue +++ b/src/renderer/views/search/SearchResult.vue @@ -117,10 +117,8 @@ class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6" >
-
-
+
+
diff --git a/src/renderer/views/toplist/index.vue b/src/renderer/views/toplist/index.vue index 2090613..09944c9 100644 --- a/src/renderer/views/toplist/index.vue +++ b/src/renderer/views/toplist/index.vue @@ -19,11 +19,9 @@
-
-
-
+
+
+
diff --git a/src/renderer/views/user/detail.vue b/src/renderer/views/user/detail.vue index 63e057f..a8d76cf 100644 --- a/src/renderer/views/user/detail.vue +++ b/src/renderer/views/user/detail.vue @@ -6,30 +6,32 @@
-
+
- +
- +
- - - +
+
+
- +
- +
- - - +
+
+
diff --git a/src/renderer/views/user/followers.vue b/src/renderer/views/user/followers.vue index 4439a59..edd422e 100644 --- a/src/renderer/views/user/followers.vue +++ b/src/renderer/views/user/followers.vue @@ -5,14 +5,14 @@
- +
- - - +
+
+
diff --git a/src/renderer/views/user/follows.vue b/src/renderer/views/user/follows.vue index 679fff1..e076df6 100644 --- a/src/renderer/views/user/follows.vue +++ b/src/renderer/views/user/follows.vue @@ -5,14 +5,14 @@
- +
- - - +
+
+
diff --git a/src/renderer/views/user/index.vue b/src/renderer/views/user/index.vue index 32a5e7b..1c793c8 100644 --- a/src/renderer/views/user/index.vue +++ b/src/renderer/views/user/index.vue @@ -1,30 +1,32 @@