找回密码
 立即注册
搜索
查看: 48|回复: 6

播放器相关

[复制链接]

1081

主题

2752

回帖

1万

积分

管理员

积分
10305
发表于 2025-12-23 22:09:56 | 显示全部楼层 |阅读模式

1081

主题

2752

回帖

1万

积分

管理员

积分
10305
 楼主| 发表于 2025-12-23 22:27:26 | 显示全部楼层
一、HTML 结构(包含音频播放器和歌词显示区域) 首先搭建基础的页面结构,包含音频播放控件和歌词展示的区域,这里使用原生的 <audio> 标签实现音频播放功能
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>歌词适配播放器</title>
    <style>
        /* 样式部分,使歌词展示和播放器更美观 */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

      body {
            background-color: #f5f5f5;
            font-family: "Microsoft YaHei", sans-serif;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            min-height: 100vh;
            padding: 20px;
        }
        .audio-player {
            width: 100%;
            max-width: 600px;
            margin-bottom: 40px;
        }


        audio {
            width: 100%;
            outline: none;
        }


        .lyric-container {
            width: 100%;
            max-width: 600px;
            height: 400px;
            background-color: #fff;
            border-radius: 10px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            overflow: hidden;
            position: relative;
        }

        .lyric-wrapper {
            position: absolute;
            width: 100%;
            transition: transform 0.3s ease;
        }


        .lyric-item {
            padding: 10px 20px;
            text-align: center;
            font-size: 16px;
            color: #666;
            transition: color 0.3s ease, font-size 0.3s ease;
        }


        .lyric-item.active {
            color: #e74c3c;
            font-size: 18px;
            font-weight: bold;
        }
    </style>
</head>
<body>
    <!-- 音频播放器 -->
    <div class="audio-player">
        <audio id="audio" controls>
            <!-- 替换为你的音频文件地址,支持mp3、ogg等格式 -->
            <source src="your-audio-file.mp3" type="audio/mpeg">
            您的浏览器不支持音频播放
        </audio>
    </div>


    <!-- 歌词显示区域 -->
    <div class="lyric-container" id="lyricContainer">
        <div class="lyric-wrapper" id="lyricWrapper">
            <!-- 歌词会通过JS动态生成 -->
        </div>
    </div>


    <script>
        // 后续JS代码写在这里
    </script>
</body>
</html>










1081

主题

2752

回帖

1万

积分

管理员

积分
10305
 楼主| 发表于 2025-12-24 10:22:26 | 显示全部楼层

二、JavaScript 逻辑(实现歌词与音频同步)
核心逻辑是:解析歌词数据、监听音频的时间更新事件、匹配对应时间的歌词并高亮显示,同时实现歌词的滚动效果。
javascript
运行
// 1. 歌词数据(就是之前转换后的歌词数组)
const lyricData = [
    { time: 4, text: "时间是一片沉默的海" },
    { time: 45, text: "思念是漂泊的孤雁" },
    { time: 52, text: "回忆是无边的草原" },
    { time: 59, text: "每片白云都是远方" },
    { time: 63, text: "思念飘来汇成的海" },
    { time: 67, text: "在风中独自独白" },
    { time: 73, text: "时光是一片沉默的海" },
    { time: 77, text: "往事是雪地的洁白" },
    { time: 80, text: "每朵梨花都是一个" },
    { time: 84, text: "来不及说出的对白" },
    { time: 88, text: "月光下轻轻散开" },
    { time: 95, text: "等待是无声的钟摆" },
    { time: 101, text: "重逢是融雪的春天" },
    { time: 108, text: "每粒沙砾都是一个" },
    { time: 112, text: "被晚风遗忘的誓言" },
    { time: 116, text: "在掌心渐渐飘散" },
    { time: 123, text: "时光是一片沉默的海" },
    { time: 126, text: "往事是雪地的洁白" },
    { time: 129, text: "每朵梨花都是一个" },
    { time: 132, text: "来不及说出的对白" },
    { time: 137, text: "月光下轻轻散开" },
    { time: 156, text: "从草原走到雪山" },
    { time: 159, text: "从白天走到黑夜" },
    { time: 163, text: "我遇到了盛开的雪莲" },
    { time: 165, text: "就放下了执念" },
    { time: 171, text: "放下了执念" },
    { time: 178, text: "时间是一片沉默的海" },
    { time: 181, text: "往事是时光的留白" },
    { time: 184, text: "每朵梨花都是一个" },
    { time: 188, text: "来不及说出的对白" },
    { time: 192, text: "月光下轻轻散开" },
    { time: 198, text: "你是漫天的星辰" },
    { time: 205, text: "我是沉默的孤雁" },
    { time: 211, text: "每道流星都是一个" },
    { time: 214, text: "无法言说的心愿" },
    { time: 220, text: "在夜空点亮黑暗" }
];


// 2. 获取DOM元素
const audio = document.getElementById('audio');
const lyricWrapper = document.getElementById('lyricWrapper');
const lyricContainer = document.getElementById('lyricContainer');


// 3. 初始化歌词:将歌词数据渲染到页面
function initLyric() {
    lyricData.forEach((item, index) => {
        const lyricItem = document.createElement('div');
        lyricItem.className = 'lyric-item';
        lyricItem.dataset.time = item.time; // 存储歌词时间,用于匹配
        lyricItem.dataset.index = index; // 存储歌词索引
        lyricItem.innerText = item.text;
        lyricWrapper.appendChild(lyricItem);
    });
}


// 4. 歌词滚动和高亮逻辑
function updateLyric(currentTime) {
    const lyricItems = document.querySelectorAll('.lyric-item');
    let activeIndex = -1;


    // 遍历歌词,找到当前时间对应的歌词索引
    for (let i = 0; i < lyricItems.length; i++) {
        const itemTime = parseFloat(lyricItems.dataset.time);
        // 下一句歌词的时间(如果是最后一句,设为无穷大)
        const nextItemTime = i < lyricItems.length - 1 ? parseFloat(lyricItems[i + 1].dataset.time) : Infinity;


        // 当前时间在当前歌词和下一句歌词之间,即为当前要显示的歌词
        if (currentTime >= itemTime && currentTime < nextItemTime) {
            activeIndex = i;
            break;
        }
    }


    // 如果没有找到对应歌词,移除所有高亮
    if (activeIndex === -1) {
        lyricItems.forEach(item => item.classList.remove('active'));
        return;
    }


    // 高亮当前歌词,移除其他歌词的高亮
    lyricItems.forEach((item, index) => {
        if (index === activeIndex) {
            item.classList.add('active');
        } else {
            item.classList.remove('active');
        }
    });


    // 歌词滚动:让当前高亮的歌词居中显示
    const activeItem = lyricItems[activeIndex];
    const containerHeight = lyricContainer.clientHeight;
    const itemHeight = activeItem.offsetHeight;
    const scrollTop = activeItem.offsetTop - (containerHeight / 2) + (itemHeight / 2);


    // 设置歌词容器的滚动位置(使用transform实现平滑滚动)
    lyricWrapper.style.transform = `translateY(-${scrollTop}px)`;
}


// 5. 初始化并绑定事件
window.onload = function() {
    initLyric(); // 渲染歌词


    // 监听音频的时间更新事件(每100ms触发一次,更新歌词)
    audio.addEventListener('timeupdate', function() {
        const currentTime = Math.floor(audio.currentTime); // 取整,匹配歌词的秒数
        updateLyric(currentTime);
    });


    // 音频播放结束后,重置歌词
    audio.addEventListener('ended', function() {
        lyricWrapper.style.transform = 'translateY(0px)';
        const lyricItems = document.querySelectorAll('.lyric-item');
        lyricItems.forEach(item => item.classList.remove('active'));
    });
};
三、使用说明
替换音频文件:将代码中的 your-audio-file.mp3 替换为你的音频文件地址(支持本地文件或网络音频链接)。
歌词扩展:如果需要添加更多歌词,只需要在 lyricData 数组中按照格式添加对应的 time(秒数)和 text(歌词内容)即可。
样式自定义:可以通过修改 CSS 中的样式(如颜色、字体、背景、歌词容器高度等),适配你的页面风格。
四、功能说明
音频播放时,歌词会根据当前播放时间自动高亮对应行。
歌词区域会自动滚动,使当前高亮的歌词居中显示。
音频播放结束后,歌词会重置到顶部,移除所有高亮。
适配移动端和 PC 端,响应式布局。

1081

主题

2752

回帖

1万

积分

管理员

积分
10305
 楼主| 发表于 2025-12-24 10:26:59 | 显示全部楼层
要清除歌词的背景,只需要移除歌词样式中有关背景和内边距的相关属性即可。主要改动在.lyrics-text的 CSS 样式部分



三、使用说明
1  替换音频文件:将代码中的 your-audio-file.mp3 替换为你的音频文件地址(支持本地文件或网络音频链接)。
2   歌词扩展:如果需要添加更多歌词,只需要在 lyricData 数组中按照格式添加对应的 time(秒数)和 text(歌词内容)即可。
3   样式自定义:可以通过修改 CSS 中的样式(如颜色、字体、背景、歌词容器高度等),适配你的页面风格。
四、功能说明
。音频播放时,歌词会根据当前播放时间自动高亮对应行。
。歌词区域会自动滚动,使当前高亮的歌词居中显示。
。音频播放结束后,歌词会重置到顶部,移除所有高亮。
。适配移动端和 PC 端,响应式布局。


1081

主题

2752

回帖

1万

积分

管理员

积分
10305
 楼主| 发表于 2025-12-24 10:28:44 | 显示全部楼层
大图音画歌词样式小手册
核心说明
所有样式都基于你现有代码的 .lyrics-container 结构,只需替换 .lyrics-text 的 CSS 即可。
保留 white-space: nowrap; overflow: hidden; text-overflow: ellipsis; 确保单行显示不换行。
字号 font-size、颜色 color 可根据自己的背景图灵活调整。
样式 1:无背景纯文字(当前在用款)
特点:清爽不遮挡背景,适合淡色 / 简洁背景
css
.lyrics-text {
    font-size: 24px;
    color: #ffffff;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
样式 2:半透明背景款(原款)
特点:提升文字可读性,适合复杂 / 色彩丰富的背景
css
.lyrics-text {
    font-size: 24px;
    color: #ffffff;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    padding: 5px 20px;
    background: rgba(0, 0, 0, 0.3);
    border-radius: 0px;
}
样式 3:文字描边款(复杂背景救星)
特点:文字带轮廓,在炫彩 / 明暗交错的背景上也清晰
css
.lyrics-text {
    font-size: 24px;
    color: #ffffff;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    /* 描边效果:兼容不同浏览器 */
    -webkit-text-stroke: 1px #000000;
    text-stroke: 1px #000000;
}
样式 4:渐变文字款(氛围感拉满)
特点:文字自带渐变色彩,适合文艺 / 梦幻风格的音画
css
.lyrics-text {
    font-size: 24px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    /* 渐变文字核心代码 */
    background: linear-gradient(to right, #ff7e5f, #feb47b);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
}
小技巧
调整 font-size 数值可以改变歌词大小,比如 28px 更大,20px 更精致。
描边款可以把 #000000 换成其他颜色,比如 #333333 浅一点的描边。

1081

主题

2752

回帖

1万

积分

管理员

积分
10305
 楼主| 发表于 2025-12-24 10:38:39 | 显示全部楼层
  • [color=rgb(0, 0, 0) !important]移除歌词阴影:删除了.lyrics-text中的text-shadow属性,不再显示文字阴影。
  • [color=rgb(0, 0, 0) !important]解决楼层脱离问题
    • 将歌词容器从外部移入#pa父元素内,使用position: absolute绝对定位(匹配父级的定位层级),替换原来的fixed固定定位,避免脱离楼层。
    • 调整歌词容器的z-index为99(可根据页面元素层级微调),适配页面层级结构。



jimeng-2025-05-29-44-远景,狗尾巴花,漫山遍野,绿色的,草长莺飞,蝴蝶飞舞,阳光.jpg

1081

主题

2752

回帖

1万

积分

管理员

积分
10305
 楼主| 发表于 2025-12-24 10:44:30 | 显示全部楼层
删除 “暂无歌词” 默认显示:歌词容器初始为空,播放音频后显示第一句歌词。
隐藏原生音乐播放条:添加audio { display: none !important; }样式,彻底隐藏原生音频控件,不再显示播放条。
优化音频播放触发:
保留标题点击触发播放的逻辑(playmp3回调中播放音频)。
增加自动播放尝试(部分浏览器因安全策略需用户交互触发,失败时不影响功能)。
优化歌词同步逻辑:修改歌词匹配逻辑,改为遍历所有歌词,精准匹配当前时间对应的歌词,避免索引跳跃问题,同时播放到最后时保持最后一句歌词。
注意事项:
若歌词仍未显示,可微调.lyrics-container的z-index值(如改为999),确保其层级高于页面其他元素。
歌词数据可根据实际歌曲的时间轴和内容进行替换,格式为[时间(秒), 歌词内容]。
部分浏览器(如 Chrome)要求音频播放必须由用户交互触发(如点击标题),因此保留了标题点击播放的逻辑。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

协同嘉业科技有限公司 ( 京ICP备2024053108号-1 )

GMT+8, 2026-1-15 12:01 , Processed in 0.101949 second(s), 44 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表