mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
550 字
1 分钟
Mizuki博客移动端布局突变
2026-05-01

Mizuki博客移动端布局突变的追根溯源和解决方法#

现象#

我的 Astro 博客( Mizuki 主题)在移动端出现了一个诡异问题:

  • 页面刚加载时显示正常。
  • 约 1-2 秒后(歌单加载完成),整个页面布局突然被撑大,内容在移动端难以看清楚。
  • 手动切换到歌单中的第二首歌,布局立刻恢复正常。

页面刚加载时的正常布局

页面刚加载时的正常布局

歌单加载完成后的布局错乱(页面撑大,内容看不清)

歌单加载完成后的布局错乱

数据流简图#

config.ts (musicPlayerConfig)
↓ mode: "meting" / "local"
musicPlayerStore.ts
↓ initialize() → loadPlaylist()
↓ 根据 mode 选择数据来源
├── mode === "meting"
│ ↓ fetchMetingPlaylist()
│ ↓ 请求 Meting API (id, server, type)
│ ↓ 返回 JSON 数组
│ ↓ map(convertMetingSong) // ⚠️ 问题函数
│ ↓ 创建 Song 对象 { title, artist, ... }
└── mode === "local"
↓ loadLocalPlaylist()
↓ 读取本地常量 LOCAL_PLAYLIST
↓ state.playlist 更新
MusicPlayer.svelte (订阅 store)
↓ 渲染子组件 (MiniPlayer, PlayerBar)
↓ 显示 artist 字段
↓ 移动端超长文本 → 撑开父容器 → 布局错乱 ❌

排查过程#

对比 local 模式与 meting 模式#

Mizuki 音乐播放器支持两种歌单来源:

  • local:本地硬编码歌单(艺术家名较短,布局正常)。
  • meting:通过 Meting API 获取网易云歌单(出现问题)。

local 模式数据(正常):

[
{ "title": "口笛で愛は歌えない", "artist": "Dazbee" },
{ "title": "ひとり上手", "artist": "Kaya" }
]

meting 模式数据(出现问题的第一首歌):

{
"title": "24/7(纯音乐)",
"artist": "吴佳隆 / 包子音乐社 / 宣子 / DJ枫叶 / DJ大筒 / 小魚yzz / 北野弦疑 / 梦晨 / 小耳朵乐乐 / 瑞雪映春色 / 鱼丸粗面 / laika / 小民 / LiuTangping / 八点零八"
}

艺术家名长度超过 200 个字符

定位渲染组件#

播放器组件 MusicPlayer.svelte 中,艺术家名最终渲染在 .song-artist 元素内。该元素未做长度限制,在移动端小屏幕上导致文本换行,撑开了父容器宽度,从而推动页面其他元素下移。

验证原因#

手动切换到第二首歌(艺术家名正常),布局立刻恢复。这说明超长文本是布局错乱的直接诱因。

切换到第二首歌(艺术家名正常)

解决方案:数据层截断#

首先尝试 CSS 方案:

.song-artist {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 70vw;
}

未生效(可能因为父容器 flex 布局缺少 min-width: 0,或其他样式覆盖)。为了彻底解决问题,选择在数据源处直接截断字符串。

修改文件:src/stores/musicPlayerStore.ts#

找到 convertMetingSong 方法,添加截断逻辑:

private convertMetingSong(song: any): Song {
const titleRaw = song.name ?? song.title ?? i18n(Key.unknownSong);
const artistRaw = song.artist ?? song.author ?? i18n(Key.unknownArtist);
const truncate = (str: string, maxLen: number): string => {
if (!str) return str;
return str.length > maxLen ? str.slice(0, maxLen) + '...' : str;
};
const title = truncate(titleRaw, 30); // 标题最多30字符
const artist = truncate(artistRaw, 20); // 艺术家最多20字符
// 原有 duration 等其他处理保持不变
let dur = song.duration ?? 0;
if (typeof dur === "string") dur = parseInt(dur, 10);
if (dur > 10000) dur = Math.floor(dur / 1000);
if (!Number.isFinite(dur) || dur <= 0) dur = 0;
return {
id: typeof song.id === "string" ? parseInt(song.id, 10) : (song.id ?? 0),
title,
artist,
cover: song.pic ?? "",
url: song.url ?? "",
duration: dur,
};
}

最终效果#

  • 超长的艺术家名被截断为 "吴佳隆 / 包子音乐社 / 宣..." 的形式,不会换行,也不会撑开布局。
  • 移动端布局稳定,不再出现加载后移位。
  • 保留了原始 API 数据完整性,仅在展示层做截断。

超长的艺术家名被截断

涉及文件#

  • src/stores/musicPlayerStore.tsconvertMetingSong 方法)
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Mizuki博客移动端布局突变
https://cmzh.yongs.xyz/posts/歌曲艺术家字段过长导致页面被撑大/
作者
沉眠之海°
发布于
2026-05-01
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录