778 字
4 分钟
fuwari主题侧边栏音乐播放器解决方案
学习自
Ke.ke的博客
Ke.ke的博客

初步试想
本来默认的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,把它引入到侧边栏中。
------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
------<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/ 页面浏览量:0 次
💡 评论需审核