视频加载失败

文章中添加音乐播放器

569 字
3 分钟
文章中添加音乐播放器
文章中添加音乐播放器

利用现有组件添加音乐播放器#

依旧可以直接利用 MD 语法在文章中嵌入组件,并且实现默认自动播放。

效果展示(音频源网易云示例)#

未知歌曲
未知艺术家
网易云音乐 · 单曲
0:000:00

使用说明#

直接URL方式#

::music{url="https://example.com/song.mp3" title="歌曲标题" artist="艺术家" cover="封面URL"}

网易云音乐方式#

::music{server="netease" type="song" id="1901371647" title="歌曲标题" artist="艺术家"}

参数说明(基本和主页播放器组件相同)#

参数说明示例
url音乐文件URLurl="/assets/music/song.mp3"
server音乐平台server="netease"
id歌曲IDid="1901371647"
typeID类型(默认song)type="song"
title歌曲标题title="我的歌曲"
artist艺术家artist="艺术家"
cover封面图片URLcover="https://example.com/cover.jpg"
autoplay自动播放(默认true)autoplay="true"
loop循环播放(默认false)loop="true"
volume音量0-1(默认0.7)volume="0.5"

代码实现#

  1. rehype-component-music-player.mjs(组件,src/plugins/) 解析 ::music{…} 语法 支持参数:url、server、id、type、title、artist、cover、autoplay、loop、volume

  2. music-player-script.js(脚本,src/plugins/) 音频播放控制(播放/暂停/进度/音量) Meting API 集成(网易云、QQ音乐等,三级回退) 多播放器互斥暂停、自动播放处理 切页时自动暂停并重新初始化(见下方事件说明)

切页事件的坑:站点用的是 Swup 4 + @swup/astro,它有个兼容层会把 Swup 钩子转成 astro 风格事件派发——content:replace 前触发 astro:before-swap,page:view 触发 astro:page-load。这两个才是实际会触发的事件;Swup v3 时代的 swup:contentReplaced / swup:willReplaceContent 在 4.x 里根本不派发, 写了也白写(会表现为:swup 切进文章时播放器不初始化、切页后音乐不停)。 脚本里监听 astro:before-swap 暂停、astro:page-load 清理并重新初始化。

  1. music-player.css(样式,src/styles/) 跟随主题色的扁平卡片风,全部用 Tailwind @apply + 主题变量 暗色模式自动适配(不再手写 .dark 覆盖) 加载中/错误/播放中三个状态类

  2. astro.config.mjs(配置)

import { MusicPlayerComponent } from "./src/plugins/rehype-component-music-player.mjs";
// ...
components: {
music: MusicPlayerComponent,
}
  1. MusicPlayerManager.astro(脚本接入,src/components/features/)

对齐框架里 GithubCardManager 的模式,一行副作用导入脚本,由 Layout 统一渲染:

---
// 文章内嵌音乐播放器客户端管理器(::music 指令)
---
<script>
import "@/plugins/music-player-script.js";
</script>

Layout.astro 里引入并渲染这个组件即可,不再需要手写 <link> 和 <script src>:

import MusicPlayerManager from "@components/features/MusicPlayerManager.astro";
// ...
<MusicPlayerManager />
  1. 样式加载(Markdown.astro / DynamicItemTemplate.astro)
import "@/styles/music-player.css";

和 markdown.css、markdown-extend.styl 放在一起,只在有正文的页面(文章、动态)加载,首页等页面不背这份 CSS。

文章分享

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

文章中添加音乐播放器
https://azuma.mstzuomu.space/posts/azuma.zuomu-blog-6/
作者
陌殊途左沐
发布于
2026-08-18
许可协议
CC BY-NC-SA 4.0
相关文章智能推荐
1
基于Firefly主题的列表封面位置改造
技术分享不想让封面挤在侧边?Firefly封面置顶记录
2
评论区回复时表情面板被截断:一次 overflow 裁剪排查实录
技术分享主评论框的表情菜单好好的,一到回复就少了半截?不是 z-index 的锅,是祖先容器的 overflow 在裁。完整复现步骤、根因分析与修复代码。
3
备案通过后的图床重生记:把 CloudFlare-ImgBed 从 Telegram 渠道搬回境内服务器的完整复刻手册
技术分享ICP 备案下证后,本站完成从 Cloudflare 全家桶到腾讯云生态的整体迁移。本文以图床为主线:为什么 CloudFlare-ImgBed 在国内必死(Telegram 渠道、workers.dev 污染、EO 反代 522、CF 封死子域 zone 四重死因),如何无损导出数据,并在轻量服务器上用 Docker 原版程序 + Nginx + rclone WebDAV 重建出「网页上传 + 后台设置」的完整体验,附全部踩坑与可照抄的复刻步骤
4
全站动效补完与 anime.js 数字滚动:五项动效计划的落地、四轮实测踩坑与复刻清单
技术分享完整记录 Firefly 博客一次「按门禁筛出来的动效改造」:五项动效计划(浮层开合/模态进出场/公告折叠/翻页桥接/切标签)的病灶定位、精确参数与四个实测才现形的 bug,以及用 anime.js 给侧栏统计做数字滚动的选型决策、v4 API 与零面积 IntersectionObserver 抢跑坑,附可照做的复刻清单
5
全站视觉移植复刻:把 Firefly 改造成 animal-island-ui 风格的七期工程(含复刻清单与踩坑全录)
技术分享完整记录如何把一个 Astro + Svelte 博客移植成 animal-island-ui 的治愈系海岛风格:决策依据(为什么不引库、不重写)、规范获取方式、七期改造的逐文件实录与精确色值、Tailwind 层序覆盖等关键机制、Nunito 字体接入、验证三件套,附他人可照做的复刻清单与未尽事项
随机文章随机推荐
Profile Image of the Author
陌殊途左沐
热爱是拯救无趣人生的唯一途径
公告
欢迎来到我的博客!这里是左沐的个人空间,分享我的学习、生活和兴趣爱好。希望你能在这里找到有趣的内容,请不要对我的喜好做出评价哦!请勿使用公网访问本站。
分类
访客信息
加载中...
标签
最新动态
站点统计
文章
30
分类
2
标签
52
总字数
58,096
运行时长
0 天
最后活动
0 天前
总浏览量
-
访客数
-
文章目录