🎯 登录页面双面板设计与功能优化
文件位置: page/p-signin.php · core/module/fun-user.php · assets/js/login-particles.js
🎯 优化目标
将登录页面重构为双面板设计,优化按钮样式和交互效果,修复注册功能,恢复粒子效果,并确保所有元素样式统一美观。
🔧 实现方法
采用双面板设计,使用CSS过渡实现平滑切换,优化按钮样式和交互效果,修复注册功能,恢复粒子效果,并确保所有元素样式统一。
✏️ 具体修改内容
- 双面板设计与切换功能 (
p-signin.php):
- 重构登录页面为双面板设计,包含登录和注册模块
- 添加根据URL参数自动切换模块功能,支持?mode=signup参数
- 优化面板切换动画,使用CSS过渡实现平滑效果
- 统一按钮样式,确保文字居中显示
- 修复按钮悬停扫光动画,改为流畅斜角效果
- 注册功能修复 (
p-signin.php·fun-user.php):
- 添加密码确认字段,确保注册表单提交完整数据
- 修复服务器端注册处理函数,确保密码确认验证通过
- 优化注册表单样式,统一输入框大小
- 修复注册表单提交逻辑,确保数据正确发送到服务器
- 粒子效果恢复 (
login-particles.js·p-signin.php):
- 修改粒子效果脚本,将canvas添加到main标签中,避免被CSS规则隐藏
- 调整粒子效果的z-index,确保显示在背景之上,容器之下
- 移除不必要的粒子效果容器,简化代码结构
- 版权信息添加 (
p-signin.php):
- 在登录页面底部添加主题版权信息
- 动态获取主题名称和版本号
- 添加白木重构链接,颜色设置为深蓝色
- 确保版权信息在页面底部居中显示
- 样式统一优化 (
p-signin.php):
- 统一所有按钮样式,确保文字居中显示
- 加宽按钮长度5px,提升视觉效果
- 修复注册模块输入框大小不一问题,统一输入框宽度
- 优化输入框样式,使用浮动标签设计
- 确保所有元素响应式设计,适配不同屏幕尺寸
🎨 实现效果
- ✅ 登录页面双面板设计,支持平滑切换
- ✅ 根据URL参数自动切换登录/注册模块
- ✅ 按钮样式优化,悬停扫光动画流畅美观
- ✅ 注册功能修复,支持密码确认验证
- ✅ 粒子效果恢复,背景动态效果丰富
- ✅ 版权信息正确显示,包含主题名称和版本号
- ✅ 所有元素样式统一,输入框大小一致
- ✅ 响应式设计,适配不同屏幕尺寸
- ✅ 按钮文字居中显示,视觉效果协调
- ✅ 重构链接正确显示,颜色为深蓝色
🌟 重构404页面
文件位置: 404.php · assets/404/shiroki-404.css · assets/404/shiroki-404.js
- 功能描述:全面优化404页面,包括本地资源替换、动画效果添加和交互体验增强
- 实现内容:
1. 本地资源替换:
- 将tsParticles CDN链接替换为本地文件:assets/404/tsparticles.preset.fountain.bundle.min.js
- 提高加载速度,减少外部依赖,增强离线可用性
- 引入自定义404页面JS文件:assets/404/shiroki-404.js
2. 动画效果添加:
- 为路线图标添加上下浮动动画,持续时间3秒,缓动效果ease-in-out
- CSS动画名称:float-up-down,实现上下10px的浮动效果
- 集成tsParticles粒子背景效果,增强页面视觉层次感
3. 交互体验增强:
- 为h1标题添加从中间展开的粉色覆盖效果
- 使用clip-path和::before伪元素实现,过渡时间0.5秒
- 实现原理:通过clip-path: inset(0 50% 0 50%)到clip-path: inset(0 0 0 0)的过渡
- 按钮添加渐变背景和悬停动画效果
- 按钮文字与站点Logo结合,增强品牌识别
4. 字体同步优化:
- 确保404页面同步后台设置的站点默认字体
- 完整复制主题字体处理逻辑,支持自定义字体上传和应用
- 遵循boxmoe_custom_font_switch开关设置
- 修复动态字体被CSS硬编码覆盖的问题:
- 在动态字体CSS中添加!important确保优先级
- 从CSS文件中移除硬编码的font-family
- 添加字体CSS应用代码,确保字体样式正确应用到页面
5. 响应式设计优化:
- 针对移动端和桌面端分别优化字体大小和元素尺寸
- 使用CSS变量管理不同屏幕尺寸的样式
- 调整布局结构,确保在各种设备上都有良好的显示效果
6. 视觉设计增强:
- 使用渐变色彩方案,增强页面现代感
- 添加平滑的过渡效果,提升用户体验
- 优化图标和图片的显示效果
7. 性能优化:
- 内联关键CSS,减少HTTP请求
- 优化资源加载顺序
- 确保页面在各种网络环境下都能快速加载
8. 代码清理与优化:
- 将HTML内容转换为纯PHP格式,方便扩展和维护
- 删除多余的背景图相关代码,简化代码结构
- 优化CSS样式,移除无效的样式设置
- 添加min-height: 100vh确保页面全屏显示
9. 安全与稳定性:
- 添加安全检查,防止直接访问主题文件
- 使用esc_url()和esc_attr()等函数确保输出安全
- 优化错误处理,确保页面在各种情况下都能正常显示
📋 代码块样式优化
文件位置: assets/css/style.css
- 功能描述:优化代码块样式,确保字体同步站点字体,增大字体大小,添加留白间距
- 实现内容:
1. 字体大小调整:
- 将代码块字体大小从原默认值调整为16px,提高可读性
- 确保行内代码和带有行号的代码块使用相同的字体大小
2. 字体同步修复:
- 原代码硬编码使用固定字体,无法继承站点自定义字体设置
- 将所有代码块相关CSS选择器的font-family改为inherit或inherit !important
- 确保当后台主题设置的自定义字体开启时,代码块字体会自动同步
3. 留白间距添加:
- 修复代码块第一行和最后一行文本太贴边的问题
- 为.post-single pre.prettyprint ol.linenums添加padding: 8px 0
- 为.post-single pre.prettyprint添加padding: 40px 10px 10px
- 为.post-single pre添加padding: 10px
4. CSS选择器优化:
- .single-content code: 将字体设置为inherit
- .post-single pre: 将字体设置为inherit
- .post-single pre.prettyprint: 将字体设置为inherit
- .post-single pre.prettyprint code: 将字体设置为inherit !important
- .post-single pre.prettyprint ol.linenums: 将字体设置为inherit
- .post-single pre.prettyprint ol.linenums li: 将字体设置为inherit
- .post-single pre.prettyprint, .post-single pre.prettyprint *: 将字体设置为inherit !important
技术实现:
/* 代码块字体同步优化 */
.single-content code {
font-family: inherit;
font-size: 16px;
}
.post-single pre,
.post-single pre.prettyprint,
.post-single pre.prettyprint ol.linenums,
.post-single pre.prettyprint ol.linenums li {
font-family: inherit;
font-size: 16px;
}
.post-single pre.prettyprint code,
.post-single pre.prettyprint,
.post-single pre.prettyprint * {
font-family: inherit !important;
font-size: 16px;
}
/* 代码块留白间距优化 */
.post-single pre {
padding: 10px;
}
.post-single pre.prettyprint {
padding: 40px 10px 10px;
}
.post-single pre.prettyprint ol.linenums {
padding: 8px 0;
}
优化效果:
- 代码块字体大小统一为16px,提高可读性
- 当后台主题设置的自定义字体开启时,代码块字体会自动同步
- 代码块第一行和最后一行文本有了足够的留白间距,不再贴边
- 所有类型的代码块(包括行内代码和带有行号的代码块)都应用了相同的优化样式
🧑🏻💻 代码块样式优化
文件位置: assets/css/style.css · core/module/fun-fonts.php
- 功能描述:优化文章页代码块样式,提高可读性,同步站点自定义字体,修复留白问题
- 实现内容:
1. 字体同步优化:
- 将代码块字体从硬编码值改为 inherit,继承站点自定义字体设置
- 确保后台主题设置的自定义字体开启时,代码块字体同步更新
- 支持经典编辑器和 Gutenberg 编辑器的字体设置
2. 字体大小优化:
- 初始调整:calc(0.8rem - 3px) → 0.75rem → 16px
- 最终确定为 16px,确保代码可读性
- 所有代码块元素统一字体大小
3. 留白间距优化:
- 修复第一行和最后一行代码文本贴边问题
- 添加 10px 内边距,确保代码与边框有适当间距
- 优化代码块整体视觉效果
4. 选择器修正:
- 修复 CSS 选择器缺少 . 前缀的问题
- 确保所有代码块相关元素都被正确选中
技术实现:
/* 代码块字体同步优化 */
.single-content code {
font-family: inherit;
font-size: 16px;
}
.post-single pre,
.post-single pre.prettyprint,
.post-single pre.prettyprint ol.linenums,
.post-single pre.prettyprint ol.linenums li {
font-family: inherit;
font-size: 16px;
}
/* 代码块留白间距优化 */
.post-single pre {
padding: 10px;
}
优化效果:
- ✅ 代码块字体成功同步站点自定义字体设置
- ✅ 字体大小调整为 16px,提高代码可读性
- ✅ 代码块内边距增加,解决文本贴边问题
- ✅ 所有代码块元素样式统一
- ✅ 支持后台主题字体设置的动态变化
🚀 页面缓存头设置修复
文件位置: functions.php
- 功能描述:解决"未检测到页面缓存"问题,添加必要的缓存相关HTTP头
- 实现内容:
- 添加 shiroki_add_cache_headers() 函数,为前端页面添加缓存头
- 设置 Cache-Control 头:public, max-age=3600(缓存1小时)
- 设置 Expires 头:1小时后过期
- 设置 Last-Modified 头:基于最后文章修改时间
- 设置 ETag 头:唯一标识
- 设置 X-Cache-Enabled: true 自定义缓存启用标识
- 使用 send_headers 钩子绑定缓存头设置函数
🔧 函数名冲突修复
文件位置: functions.php
- 问题描述:
is_login()函数与WordPress核心函数冲突,导致致命错误 - 修复内容:
- 将 is_login() 重命名为 shiroki_is_login()
- 将 is_logout() 重命名为 shiroki_is_logout()
- 更新 shiroki_add_cache_headers() 函数中对这两个函数的调用
- 遵循WordPress最佳实践,使用前缀避免函数名冲突
👤 登录注册页面优化
文件位置: page/p-signin.php · assets/css/mobile-signin-shiroki.css
- 功能描述:优化登录注册页面的移动端适配和用户体验
- 实现内容:
1. 移动端样式独立化:
- 创建独立的移动端样式文件 mobile-signin-shiroki.css
- 采用响应式设计,适配870px以下屏幕
- 实现顶部半圆设计,覆盖顶部区域
- 调整表单布局,确保在小屏幕上正常显示
2. 浮动标签优化:
- 修复默认状态下标签偏下问题,确保垂直居中
- 将默认状态下的背景色从半透明白色改为完全透明
- 优化激活状态下的标签样式,添加背景色和圆角
- 确保桌面端和移动端标签样式一致
3. 验证码按钮修复:
- 修复验证码按钮被表单盖住的问题,设置 z-index: 10
- 确保按钮垂直居中显示
- 为验证码输入框添加足够的右侧内边距
- 优化按钮样式,与整体设计保持一致
4. 表单提交失败样式修复:
- 修复表单提交失败时输入框内容偏移的bug
- 将错误信息定位在输入框下方,不影响输入框布局
- 为表单容器添加最小高度,确保错误信息不影响整体布局
- 优化错误信息样式,提高可读性
5. 小屏幕滚动优化:
- 为屏幕高度低于690px的设备添加表单滚动功能
- 增强滚动条可见性,优化滚动体验
- 确保注册表单可以独立滚动,避免内容被截断
6. 按钮样式优化:
- 修复GO按钮被压扁的问题,设置固定高度
- 将扫光效果放在按钮内部,优化视觉体验
- 增强按钮交互效果,添加悬停动画
技术实现:
/* 🌟 移动端独立样式 */
@media screen and (max-width: 870px) {
/* 移动端整体布局重置 */
html, body, main {
width: 100% !important;
height: 100% !important;
overflow: hidden !important;
position: fixed !important;
}
/* 顶部半圆设计 */
.container::before {
width: 120% !important;
height: 40% !important;
top: -15% !important;
left: 50% !important;
transform: translateX(-50%) !important;
border-radius: 0 0 50% 50% / 0 0 100% 100% !important;
}
/* 浮动标签优化 */
.floating-label-group label {
background: transparent !important;
padding: 0 8px !important;
transform: translateY(-55%) !important;
}
/* 激活状态样式 */
.floating-label-group .form-control:focus ~ label,
.floating-label-group .form-control:not(:placeholder-shown) ~ label {
background: rgba(255, 255, 255, 0.95) !important;
border-radius: 4px !important;
}
/* 小屏幕滚动优化 */
@media screen and (max-height: 690px) {
.forms-container {
height: 360px !important;
overflow: hidden !important;
}
form {
overflow-y: auto !important;
}
}
}
⏰ 修复时钟小部件
文件位置: core/widgets/widget-clock.php · assets/js/admin-select-ui.js
- 问题描述:
1. 时钟小部件不显示完整的星期几,只显示部分字符
2. 时钟小部件的时区下拉框无法点击
3. 时钟小部件的时间文本没有同步自定义的站点默认字体
- 修复内容:
1. 星期显示修复:
- 原代码使用正则表达式只匹配2个字符的星期,导致完整星期名称被截断
- 改为直接使用 Intl.DateTimeFormat API分别获取年、月、日和完整星期名称
- 使用 toLocaleString 方法获取各日期组件,确保星期名称完整显示
- 组合成 YYYY-MM-DD 星期X 格式的日期字符串
2. 时区下拉框修复:
- 主题使用自定义的下拉框UI插件替换原生select元素
- 插件没有监听WordPress小部件编辑界面的特殊事件
- 添加对 widget-added 和 widget-updated 事件的监听
- 确保动态加载的小部件能正确初始化下拉框
3. 字体同步修复:
- 原代码硬编码使用 boxmoe 字体,无法继承站点自定义字体设置
- 添加获取自定义字体设置的逻辑
- 修改时间文本的字体设置,使用动态获取的字体
- 保持原有的字体回退机制
- 技术实现:
// 星期显示修复
var year = now.toLocaleString('zh-CN', { year: 'numeric', timeZone: timezone });
var month = now.toLocaleString('zh-CN', { month: '2-digit', timeZone: timezone });
var day = now.toLocaleString('zh-CN', { day: '2-digit', timeZone: timezone });
var weekday = now.toLocaleString('zh-CN', { weekday: 'long', timeZone: timezone });
var dateString = year + '-' + month + '-' + day + ' ' + weekday;
// 时区下拉框修复
$(document).on('widget-added widget-updated', function(e, widget) {
setTimeout(function() {
initBoxmoeSelect();
}, 200);
});
// 字体同步修复
$default_font = get_boxmoe('boxmoe_default_font');
$font_family = $default_font && $default_font !== 'default' ? $default_font : 'boxmoe';
// 在CSS中使用动态字体
font-family: "<?php echo $font_family; ?>", monospace !important;
🚀 修复主题后台重置功能
📋 优化过程
第一阶段:问题诊断
- 问题描述:【重置所有设置】按钮完全没反应,卡在【正在重置】状态
- 初步分析:WordPress设置API冲突、类加载问题、重定向问题
第二阶段:多重解决方案
- 方案一:修复原始重置按钮的JavaScript事件处理
- 方案二:创建独立的重置处理文件,绕过WordPress设置API
- 方案三:添加缓存机制,优化默认值获取
- 方案四:使用预定义默认值,避免动态获取
第三阶段:性能优化
- 速度提升:从10-30秒缩短到1-3秒
- 用户体验:添加进度条和状态提示
- 界面简化:将【极快重置】设为主要按钮
🎯 最终解决方案
核心文件
super-fast-reset.php:超高效重置处理文件
- 使用预定义默认值,避免动态获取
- 1-3秒完成重置操作
class-options-framework-admin.php:主题设置页面
- 添加【🚀 极快重置(推荐)】按钮
- 移除其他测试按钮,简化界面
options-custom.js:JavaScript处理文件
- 包含superFastResetFunction函数
- 精确的成功消息检测逻辑
🔧 技术实现细节
超快重置处理流程
// 检测重置请求
$isResetRequest = (isset($_POST['direct_reset']) && $_POST['direct_reset'] === '1') ||
(isset($_POST['reset']) && $_POST['reset'] === '1') ||
(isset($_POST['reset_flag']) && $_POST['reset_flag'] === '1');
// 使用预定义默认值
$default_settings = array(
'boxmoe_basics_logo' => '',
'boxmoe_basics_favicon' => '',
// ... 其他设置
);
// 直接更新数据库
update_option($option_name, $default_settings);
// 正确重定向
$redirect_url = admin_url('admin.php?page=boxmoe_options');
header('Location: ' . $redirect_url);
JavaScript处理逻辑
// 确认对话框
if (!confirm('警告:点击确定,之前所有设置修改都将丢失!\n\n这是超快重置,使用预定义默认值,速度极快!')) {
return false;
}
// 显示加载提示
var loadingHtml = '<div id="shiroki-reset-loading">...</div>';
$('body').append(loadingHtml);
// 创建表单并提交
var $form = $('<form>', {
'action': themeUri + '/super-fast-reset.php',
'method': 'POST',
'target': '_self'
});
// 添加重置标志
$('<input>', {
'type': 'hidden',
'name': 'reset',
'value': '1'
}).appendTo($form);
// 提交表单
$form.appendTo('body').submit();
成功消息检测
// 只有在真正重置成功后才显示消息
var urlParams = new URLSearchParams(window.location.search);
var isResetSuccess = urlParams.get('reset') === 'success';
if (isResetSuccess) {
// 显示成功消息
$('#message').remove();
var successHtml = '<div id="message" class="updated fade"><p><strong>✅ 已恢复默认选项!</strong></p></div>';
$('.wrap h2').after(successHtml);
// 移除URL参数,避免刷新时重复显示
var newUrl = window.location.pathname + window.location.search.replace(/[?&]reset=success/, '');
window.history.replaceState({}, document.title, newUrl);
// 5秒后自动隐藏消息
setTimeout(function() {
$('#message').fadeOut();
}, 5000);
}
🎨 重置按钮样式优化
📋 需求描述
- 按钮背景色:将重置按钮背景色改为红色
- 按钮对齐:将重置按钮显示靠左对齐
- 代码清理:删除测试相关代码
🔧 实现过程
第一阶段:样式修改
- CSS文件修改 (
optionsframework.css)
/* 🚀 超快重置按钮样式 - 红色背景和左对齐 */
#super-fast-reset-button {
background-color: #ff4d4f !important;
border-color: #ff4d4f !important;
color: #fff !important;
float: left !important;
margin-right: 10px;
}
#super-fast-reset-button:hover {
background-color: #ff7875 !important;
border-color: #ff7875 !important;
}
- PHP文件修改 (
class-options-framework-admin.php)
- 调整按钮顺序,将重置按钮放在保存按钮之前
- 确保按钮能够正确应用左对齐样式
第二阶段:代码清理
- 删除测试代码 (
options-custom.js)
- 删除 testResetFunction 函数
- 删除重复的 superFastResetFunction 函数定义
- 保留第一个更完整的函数版本
🎵 重构音乐播放器
📋 功能概述
音乐播放器基于 APlayer 和 MetingJS 实现,支持多音乐平台(网易云、QQ音乐等),具有以下核心功能:
- 🎵 多音乐平台支持(网易云、QQ音乐等)
- 🔄 多API源自动切换
- 🎼 歌词显示与同步
- 📋 歌单管理
- 🔊 音量控制
- 🎚️ 播放进度控制
- 🌆 暗色模式适配
- 📱 移动端响应式设计
- 🎵 音乐控制弹窗
🔧 技术架构
核心文件结构
wp-content/themes/lolimeow-shiroki/
├── core/module/
│ ├── fun-music.php # 🎵 音乐播放器核心模块
│ └── fun-music-popup-shiroki.php # 🎵 音乐播放器弹窗菜单模块
└── assets/js/music-player/
├── APlayer.min.js # APlayer 核心库
├── Meting.min.js # MetingJS API 库
├── aplayer-lyrics-fix.js # 歌词修复脚本
├── shiroki-music-api-manager.js # API 管理器
└── shiroki-music-error-handler.js # 错误处理器
🎵 核心功能模块
音乐播放器初始化模块(fun-music.php)
功能特点:
- ✅ 支持多音乐平台(网易云、QQ音乐等)
- ✅ 多API源配置,提高可用性
- ✅ 自定义API接口支持
- ✅ 歌词显示支持
API源配置:
$api_urls = array(
'api_injahow' => 'https://api.injahow.cn/meting/',
'api_imeto' => 'https://api.i-meto.com/meting/api',
'api_ihuan' => 'https://meting-api.ihuan.me/api',
'api_github' => 'https://api-meting.github.io/api',
'api_chuyel' => 'https://musicapi.chuyel.top/meting/api'
);
核心功能:
- 🎵 加载 APlayer 和 MetingJS 核心库
- 🎵 注册音乐播放器样式
- 🎵 输出播放器 HTML 标签
- 🎵 配置多个备用API源
- 🎵 支持自定义API接口
关键代码位置:
音乐控制弹窗模块(fun-music-popup-shiroki.php)
功能特点:
- 🎼 三列布局设计(歌词、控制、歌单)
- 🎵 实时歌词同步显示
- 📋 完整的歌单管理
- 🔊 音量控制(支持拖拽)
- 🎚️ 播放进度控制
- 📱 移动端响应式适配
- 🌆 暗色模式支持
三列布局结构:
┌─────────────────────────────────────────────────────┐
│ 💿 音乐控制窗口 × │
├─────────────┬──────────────────┬─────────────────────┤
│ 🎼 歌词 │ 🪗 歌曲信息 │ 📋 歌单 │
│ │ 🎚️ 播放控制 │ │
│ 歌词显示 │ 🎶 播放进度 │ 歌曲列表 │
│ 实时同步 │ 🔊 音量控制 │ 点击切换 │
└─────────────┴──────────────────┴─────────────────────┘
核心功能:
- 🎵 点击播放器显示弹窗
- 🎵 歌词实时同步高亮
- 🎵 歌单点击切换歌曲
- 🎵 播放控制(上一首、播放/暂停、下一首)
- 🎵 进度条拖拽跳转
- 🎵 音量条拖拽调节
- 🎵 静音切换
- 🎵 ESC键关闭弹窗
关键代码位置:
API管理器(shiroki-music-api-manager.js)
功能特点:
- 🔄 自动API源切换
- 🎵 检测音乐源加载失败
- 📢 切换通知提示
- 🎯 智能跳过自定义API
核心功能:
- 🎵 监听APlayer错误事件
- 🎵 自动切换到下一个可用API
- 🎵 添加API切换按钮
- 🎵 显示切换通知
- 🎵 重新加载播放器
API切换逻辑:
// 如果当前使用的是自定义API,则切换到第一个备用API
if (window.shirokiCustomAPI && this.apis[currentApiIndex] === window.shirokiCustomAPI) {
currentApiIndex = 0;
} else {
// 更新当前API索引
currentApiIndex = (currentApiIndex + 1) % this.apis.length;
}
关键代码位置:
错误处理器(shiroki-music-error-handler.js)
功能特点:
- 🎵 监控APlayer错误
- 📢 用户友好的错误提示
- 🔄 自动修复尝试
- 📊 错误报告生成
核心功能:
- 🎵 监听全局错误事件
- 🎵 监听Promise错误
- 🎵 监控APlayer音频错误
- 🎵 显示用户友好的错误提示
- 🎵 自动切换API源修复
- 🎵 添加加载指示器
错误处理逻辑:
// 检查是否是音乐相关错误
if (this.isMusicRelatedError(errorMessage)) {
console.warn(`🎵 音乐播放器错误 [${source}]:`, errorMessage);
// 显示用户友好的错误提示
this.showUserFriendlyError(errorMessage, source);
// 尝试自动修复
this.attemptAutoFix(errorMessage);
}
关键代码位置:
🎨 样式设计
暗色模式适配
/* 🌆 暗色模式样式 */
.dark-theme .music-popup-content {
background-color: #1a1d23;
border-color: #33363d;
}
.dark-theme .progress-inner {
background: linear-gradient(90deg, #a78bfa, #c4b5fd);
box-shadow: 0 0 15px rgba(167, 139, 250, 0.6);
}
移动端适配
/* 📱 移动端上下布局 */
@media (max-width: 768px) {
.music-layout {
flex-direction: column;
gap: 16px;
}
/* 音乐控制区域在移动端置顶 */
.music-control-section {
order: -1;
background-color: rgba(139, 61, 255, 0.1);
}
}
🔧 使用方法
基本配置
在主题设置中配置:
- 音乐开关:启用/禁用音乐播放器
- 音乐平台:选择音乐平台(网易云、QQ音乐等)
- 歌单ID:输入歌单ID
- 播放顺序:选择播放顺序(列表、随机)
- API源:选择API源或自定义API
弹窗控制
- 点击播放器任意位置打开控制弹窗
- 点击弹窗外部或按ESC键关闭弹窗
- 点击API切换按钮切换音乐源
🎯 核心技术点
APlayer实例获取
使用多种方式获取APlayer实例,确保兼容性:
function getAplayerInstance() {
// 直接从DOM元素获取
const aplayerElement = document.querySelector(".aplayer");
if (aplayerElement && aplayerElement.aplayer) {
return aplayerElement.aplayer;
}
// 从全局变量获取
if (window.aplayers && window.aplayers.length > 0) {
return window.aplayers[0];
}
// ... 更多方法
}
歌词同步
// 更新当前歌词高亮
function updateCurrentLyrics(currentTime) {
const lyricsLines = lyricsElement.querySelectorAll(".lyrics-line[data-time]");
for (let i = 0; i < lyricsLines.length; i++) {
const time = parseFloat(lyricsLines[i].getAttribute("data-time"));
if (time <= currentTime) {
activeIndex = i;
} else {
break;
}
}
// 滚动到当前歌词
lyricsLines[activeIndex].scrollIntoView({ behavior: "smooth", block: "center" });
}
音量控制防冲突
// 添加变量跟踪用户设置的音量,防止被自动更新覆盖
let userSetVolume = null;
let isUpdatingVolume = false;
// 处理音量条点击和拖拽
function handleVolumeInteraction(e) {
isUpdatingVolume = true;
setVolume(percent);
// 延迟重置更新标志,防止定期更新覆盖用户设置
setTimeout(() => {
isUpdatingVolume = false;
}, 2000);
}
🏹 修复APlayer音乐播放器箭头图标不显示的问题
修复的关键文件[assets/css/music-player/aplayer-miniswitcher-fix-shiroki.css]
🎵 特色功能
多API源自动切换
- 配置5个备用API源
- 检测到加载失败自动切换
- 显示切换通知提示
歌词实时同步
- 从API获取歌词
- 实时高亮当前歌词
- 自动滚动到当前行
- 支持手动刷新歌词
完整的歌单管理
- 显示完整歌单列表
- 点击切换歌曲
- 高亮当前播放歌曲
- 显示歌曲时长
移动端优化
- 响应式三列布局
- 移动端上下布局
- 控制区域置顶
- 触摸友好的按钮大小

评论(2)