778 字
4 分钟
fuwari主题侧边栏音乐播放器解决方案

学习自

www.kekesxk.online
Ke.ke的博客
Ke.ke的博客
Link preview

初步试想#

本来默认的aplayer固定在左下角,观感不是很好,也不是很贴合fuwari主题。

一直想换,但是不知道从哪里入手。知道偶然误入了大佬的博客,唤醒了我的xp。

解决方案#

我也不知道咋解决的,反正改了4个文件。gemini是主谋😄,只是描述一下过程

  • /src/layouts/Layout.astro
  • /src/layouts/MainGridLayout.astro
  • /src/components/MusicPlayer.astro
  • /src/components/widget/SideBar.astro

先把原来引用的删除#

本来的做法是把MusicPlayer.astro引入layout.astro,实现全局的效果,我把它放在了body标签的底下,所以它在左下角

那么首先要把本来的全局layout.astro、MainGridLayout.astro本来的删除。然后更改SideBar.astro,把它引入到侧边栏中。

src/components/widget/SideBar.astro
---
---
import type { MarkdownHeading } from "astro";
import Categories from "./Categories.astro";
import Profile from "./Profile.astro";
import Tag from "./Tags.astro";
import MusicPlayer from "../MusicPlayer.astro";
interface Props {
class?: string;
headings?: MarkdownHeading[];
}
const className = Astro.props.class;
---
<div id="sidebar" class:list={[className, "w-full"]}>
<div class="flex flex-col w-full gap-4 mb-4">
<Profile></Profile>
</div>
<div id="sidebar-sticky" class="transition-all duration-700 flex flex-col w-full gap-4 top-4 sticky top-4">
<Categories class="onload-animation" style="animation-delay: 150ms"></Categories>
<Tag class="onload-animation" style="animation-delay: 200ms"></Tag>
<MusicPlayer class="onload-animation" style="animation-delay: 250ms" />
</div>
</div>

吐槽#

几乎搞了2个小时的音乐播放器,终于实现了初步效果,从默认的左下角实现了类似卡片集成的效果,看起来很原生。 要是样式可以再匹配主题一点的话,就更像了。

bug#

现在还有一个超级无敌的bug,那就是展开音乐列表的时候,会把整个网页都给拉伸一下。这应该是因为?尝试了很多次,但都是展开之后,音乐播放器都不能自由滚动😓,这主要是因为我改变了本来aplayer的样式,因为它一直出现两个播放器,生成不一样的aplayer之后,原生的列表也变了。

所以我决定回复原来的aplayer引用,改为销毁一个音乐播放器

一度变成了 山的那边 山的那边

解决#

最后还是豆包解决的,微笑。

修改MusicPlayer.astro

src/components/MusicPlayer.astro
---
---
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.css" />
<script src="https://cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/meting@2.0.1/dist/Meting.min.js"></script>
<div class="pb-4 card-base">
<div class="font-bold transition text-lg text-neutral-900 dark:text-neutral-100 relative ml-8 mt-4 mb-2
before:w-1 before:h-4 before:rounded-md before:bg-[var(--primary)]
before:absolute before:left-[-16px] before:top-[5.5px]">
音乐
</div>
<div class="px-4" id="music-player-container"></div>
</div>
<script is:inline>
// 全局变量存储播放器实例
window.musicPlayerInstance = null;
// 确保只初始化一次播放器
function initMusicPlayer() {
// 先销毁已存在的实例
if (window.musicPlayerInstance) {
try {
window.musicPlayerInstance.destroy();
} catch (e) {
console.log('销毁旧播放器实例:', e);
}
window.musicPlayerInstance = null;
}
// 清除容器内容
const container = document.getElementById('music-player-container');
if (!container) return;
container.innerHTML = '';
// 创建新的meting-js元素
const metingElement = document.createElement('meting-js');
metingElement.setAttribute('api', 'meting服务器?server=:server&type=:type&id=:id');
metingElement.setAttribute('server', 'netease');
metingElement.setAttribute('type', 'playlist');
metingElement.setAttribute('id', '歌单id');
metingElement.setAttribute('fixed', 'false');
metingElement.setAttribute('autoplay', 'false');
metingElement.setAttribute('theme', '#25c6fc');
metingElement.setAttribute('loop', 'all');
metingElement.setAttribute('order', 'list');
metingElement.setAttribute('preload', 'auto');
metingElement.setAttribute('list-folded', 'true');
metingElement.setAttribute('list-max-height', '300px');
container.appendChild(metingElement);
// 手动初始化并存储实例
window.Meting(metingElement, {
// 配置参数
});
// 获取APlayer实例并存储
setTimeout(() => {
const aplayerElement = container.querySelector('.aplayer');
if (aplayerElement && aplayerElement.aplayer) {
window.musicPlayerInstance = aplayerElement.aplayer;
}
}, 100);
}
// 页面加载时初始化
document.addEventListener('DOMContentLoaded', initMusicPlayer);
// Astro页面切换时重新初始化
document.addEventListener('astro:page-load', initMusicPlayer);
// Swup路由切换时清理并重新初始化
if (window.swup) {
window.swup.hooks.on('content:replace', () => {
if (window.musicPlayerInstance) {
try {
window.musicPlayerInstance.destroy();
} catch (e) {
console.log('Swup切换时销毁播放器:', e);
}
window.musicPlayerInstance = null;
}
});
window.swup.hooks.on('page:view', initMusicPlayer);
}
</script>
fuwari主题侧边栏音乐播放器解决方案
https://blog.xomoe.cn/posts/2025-08-22/musicplayer/
作者
发布于
2025-08-22
许可协议
CC BY-NC-SA 4.0
页面浏览量:0

💡 评论需审核