用 WordPress 古腾堡区块做一张会动的歌词海报

用 WordPress 古腾堡区块做一张会动的歌词海报

问题

写博客推歌的时候,歌词怎么处理?

纯文字最省事,但太素了。手写稿、歌词海报拍一张放上去,质感好,但它是死的——读者只能盯着一张静态图看。

网易云的外链播放器有歌词滚动,但它不能放自己录的 live,歌词也只能是纯文本。

我想保留手写稿的质感,又想有逐句高亮的动态体验。

方案

写了一个 WordPress 古腾堡区块插件:Synced Lyric Image

核心思路很简单:

  • 一张完整的歌词图片(手写稿/海报截图都可以)
  • 按行划分「行带」,每行对应一句歌词
  • 音频播放时,当前句淡入,唱完淡出

技术要点

不切图

很多方案会把图片切成 N 张小图,按时间换 src。这样每张图都要单独加载,而且手写稿切开后边缘处理很麻烦。

这里用 CSS background-position 裁切显示区域,原图保持完整。一行歌词就是一个 div,背景是整张图,通过 background-position-y 定位到对应行。切换时只是改一个 CSS 属性,没有额外的 HTTP 请求。

自动收紧

手写稿拍照时,每行左右的空白不固定。如果按整张图宽度显示,歌词会飘在很宽的区域里,不好看。

用 Canvas 扫描每行的像素,找到左右第一个非白点,自动 trim。如果某行右边有签名之类的干扰墨迹,可以在配置里手动填左右边界。

白底融合

手写稿一般是白纸黑字,直接贴到博客里白底会很突兀。

侧边栏加一个开关:开启后给图片加 mix-blend-mode: multiply。白色背景会和页面背景融合,只剩墨迹。适合浅色主题。如果是深色主题,建议把白色抠掉存成透明 PNG,效果最好。

时间轴

歌词时间从网易云/QQ 音乐的 LRC 文件里拿,格式是 [mm:ss.xx]。把这个时间映射到行带编号就行。

支持一句歌词跨多行(比如 [03:09.78] 8-9 表示同时显示第 8、9 行)。

效果

最终效果:音频播放时,当前句淡入(轻微上浮 + 去模糊),唱完淡出。长间奏时所有行淡出,显示淡淡的「· · ·」。

不用切图、不用修图(白底一键融合)、时间轴直接从 LRC 复制。

源码

GitHub: SHAWNTRIBBIANI/synced-lyric-image

使用示例

博客里的《誓言 – 窦靖童》和《落雁 – 宋冬野》两篇文章用了这个插件,可以点开看看实际效果。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注