From 72fabc6d12230c5a488cf83f866d0395bb11a349 Mon Sep 17 00:00:00 2001 From: alger Date: Wed, 11 Mar 2026 23:02:04 +0800 Subject: [PATCH] =?UTF-8?q?refactor(ui):=20=E4=BC=98=E5=8C=96=E9=AA=A8?= =?UTF-8?q?=E6=9E=B6=E5=B1=8F=E5=8A=A0=E8=BD=BD=E6=95=88=E6=9E=9C=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=94=A8=E6=88=B7=E9=A1=B5=E5=B7=A6=E4=BE=A7?= =?UTF-8?q?=E9=BB=91=E8=89=B2=E8=83=8C=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 关键布局组件(AppMenu/TitleBar/SearchBar)改为同步导入,消除加载闪烁 - 新增全局 skeleton-shimmer 流光动画替代 animate-pulse 闪烁效果 - 用户页 loading 骨架屏避免使用 .left scoped 样式导致的深色背景 - 全部 n-skeleton 组件替换为原生 div + shimmer,统一圆角风格 - 菜单容器添加背景色防止加载穿透 --- src/renderer/index.css | 40 +++++++++++++++++++ src/renderer/layout/AppLayout.vue | 10 +++-- src/renderer/layout/MobileLayout.vue | 3 +- src/renderer/views/album/index.vue | 8 ++-- src/renderer/views/artist/detail.vue | 22 +++++----- .../home/components/HomeAlbumSection.vue | 6 +-- .../views/home/components/HomeArtists.vue | 8 ++-- .../views/home/components/HomeCard.vue | 2 +- .../home/components/HomeDailyRecommend.vue | 2 +- .../views/home/components/HomeHero.vue | 10 ++--- .../views/home/components/HomeNewSongs.vue | 6 +-- .../home/components/HomePlaylistSection.vue | 6 +-- .../home/components/HomePrivateContent.vue | 2 +- src/renderer/views/list/index.vue | 6 +-- src/renderer/views/mv/index.vue | 8 ++-- src/renderer/views/podcast/index.vue | 16 +++----- src/renderer/views/search/SearchResult.vue | 6 +-- src/renderer/views/toplist/index.vue | 8 ++-- src/renderer/views/user/detail.vue | 24 ++++++----- src/renderer/views/user/followers.vue | 8 ++-- src/renderer/views/user/follows.vue | 8 ++-- src/renderer/views/user/index.vue | 34 ++++++++-------- 22 files changed, 133 insertions(+), 110 deletions(-) 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 @@