【前端】-音乐播放器(源代码和结构讲解,大家可以将自己喜欢的歌曲添加到数据当中,js实现页面动态显示音乐)

【前端】-音乐播放器(源代码和结构讲解,大家可以将自己喜欢的歌曲添加到数据当中,js实现页面动态显示音乐)
前言:音乐播放器是前端开发中的一个经典项目,通过它可以掌握很多核心技术,如音频处理、DOM操作、事件监听、动画效果等。这个项目不仅能提升前端开发的技能,还能让开发者深入理解JavaScript与HTML的协同作用。

页面展示:

歌曲页面+列表(html代码):
录视频时音乐有点卡顿,大家看视频效果就行 

git链接密码生成器: 用来生成密码的小项目

 下面有详细的注释讲解,大家可以对照着上图中的结构进行理解,当然也可以自己写,大家了解我的思路就行
 <div> <div> <!-- 歌曲信息卡片(隐藏页面) --> <div> <div> <div> <h4>我记得</h4> </div> <div>赵雷-署前街少年</div> <div> <!-- 时间显示 --> <div> <!-- 当前时间 --> <span>00:00</span> <!-- 歌曲总时间 --> <span>05:29</span> </div> <!-- 音乐进度线 --> <div> <!-- 绘制播放线 --> <div></div> </div> </div> </div> </div> <!-- 歌曲控制页面 --> <div> <div> <img> </div> <!-- 控制按钮 --> <div> <i>&#xe844;</i> <i>&#xe848;</i> <i>&#xe845;</i> <i>&#xe8bf;</i> </div> </div> </div> </div> <!-- 设置音乐背景页面 --> <div></div> <!-- 绘制歌曲列表 --> <div> <div> <!-- 设置模块头部内容 --> <div> <div> <h3>音乐列表</h3> </div> <div> <!-- 放置让模块消失的图标 --> <i>&#xe8b9;</i> </div> </div> <div> <!-- 容器 --> <ul> </ul> </div> </div> </div> <!-- 音乐--> <audio></audio> <script src="./js/jquery.js"></script>

 页面功能介绍:

  • 点击播放按钮,音乐开始播放,歌曲信息将自然弹出,页面中的圆形图片开始旋转
  • 点击前进和后退按钮,音乐和页面信息将进行相应改变
  • 点击模块列表内容,可播放该音乐

js功能实现:

 家人们我是通过jQuery实现的
 1.使用ajax请求音乐数据
通过ajax请求数据,并且调用更新页面数据的函数,在页面中显示第一个歌曲, 添加音乐列表
 let musicList = []; let currentIndex = 0; // 当前播放音乐的下标 // Ajax 获取音乐数据 $.ajax({ type: "GET", url: "./music.json", success: function (data) { musicList = data; render(musicList[currentIndex]); // 渲染当前音乐 renderMusicList(musicList); // 渲染音乐列表 } }); 
 2.页面渲染信息函数:
 获得jQuery包装级对象包装级对象,并且通过text()方法,在对象中添加数据
 // 渲染音乐详情 function render(data) { $(".name h4").text(data.name); $(".time").text(data.time); $(".singer-album").text(`${data.singer} - ${data.album}`); $(".cover img").attr("src", data.cover); $("audio").attr("src", data.audio_url); $('.bg').css({ background: `url("${data.cover}") no-repeat center center`, "background-size": "cover" }); } 
3.播放和暂停音乐:
 设置点击播放按钮,将暂停按钮变成播放按钮,并且显示歌曲信息,大家可以通过上面视频了解
 // 绑定播放按钮事件 $("#playBtn").on("click", togglePlay); // 播放与暂停音乐 function togglePlay() { //返回dom对象 let audio = $("audio").get(0); if (audio.paused) { $("#playBtn").removeClass("paused").addClass("running").html('&#xe847;'); $(".player-info").animate({ top: '-95%' }, 'slow'); $(".cover").css({ "animation-play-state": "running" }); audio.play(); } else { $("#playBtn").removeClass("running").addClass("paused").html('&#xe848;'); $(".player-info").animate({ top: '0%' }, 'slow'); $(".cover").css({ "animation-play-state": "paused" }); audio.pause(); } } 
4.渲染音乐列表:
通过js动态添加歌曲列表 
 // 渲染音乐列表 function renderMusicList(list) { $(".song-list").empty(); $.each(list, function (index, item) { let isPlaying = (index == currentIndex && !$("audio").get(0).paused); let $li = $(` <liplaying' : ''}"> <span>${index + 1}.${item.name} - ${item.singer}</span> <span>${isPlaying ? '&#xe784;' : '&#xe781;'}</span> </li> `); $(".song-list").append($li); }); }
5.更新播放函数:
这个方法会被重复利用,所以封装起来 ,更新当前音乐信息,更新列表
 // 更新并播放音乐 function updateAndPlay() { render(musicList[currentIndex]); $("#playBtn").trigger("click"); renderMusicList(musicList); } 
6.上下按钮点击事件:
点击前进和后退按钮更换歌曲事件,通过currentIndex变化更换当前歌词(因为当前歌词是通过currentIndex下标进行控制的) 
 // 绑定上一首、下一首按钮事件 $("#prevBtn").on("click", playPrev); // 播放上一首音乐 function playPrev() { currentIndex = (currentIndex > 0) ? currentIndex - 1 : musicList.length - 1; updateAndPlay(); } $("#nextBtn").on("click", playNext); // 播放下一首音乐 function playNext() { currentIndex = (currentIndex < musicList.length - 1) ? currentIndex + 1 : 0; updateAndPlay(); } 
7.更新音乐条的进度:
根据当前音乐的时间,获得值的百分比赋值给进度表的宽度 
 // 格式化时间 function formatTime(time) { let min = Math.floor(time / 60); let sec = Math.floor(time % 60); return `${min < 10 ? '0' : ''}${min}:${sec < 10 ? '0' : ''}${sec}`; } // 更新播放时间和进度条 $("audio").on("timeupdate", function () { let audio = $("audio").get(0); let currentTime = audio.currentTime || 0; let duration = audio.duration || 0; $(".current-time").text(formatTime(currentTime)); $(".time").text(formatTime(duration)); let value = (currentTime / duration) * 100; $(".music-progress-line").css({ width: value + "%" }); });
8.显示模块列表:
点击两个小图标点开音乐列表和关闭音乐列表 
 // 打开和关闭音乐列表弹窗 $("#openModal").on("click", function () { $(".modal").css({ display: "block" }); renderMusicList(musicList); // 渲染音乐列表 }); $(".modal-close").on("click", function () { $(".modal").css({ display: "none" }); });
9.点击音乐列表播放音乐事件:
 点击列表相应歌曲播放点击歌曲
 // 点击音乐列表播放对应歌曲 $(".song-list").on("click", "li", function () { currentIndex = parseInt($(this).attr("id")); updateAndPlay(); // 播放选择的音乐 });
10.音乐结束事件:
这个我设置的是 playNext ()  播放下一个歌曲,大家还可以自己进行其他操作
 // 监听音乐播放完毕的事件,自动播放下一首 $("audio").on("ended", function () { playNext(); });

源代码:

上面HTML代码和JavaScript代码都是完整的,大家可以直接取上面的
CSS:
* { margin: 0; padding: 0; } body { user-select: none; background-color: #dadada; } /* 动画 */ @keyframes circle { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .wrapper { width: 360px; height: 80px; margin: auto; margin-top: 200px; } .player-warp { position: relative; } .player-info { width: 90%; height: 100%; position: absolute; /* top: -95%; */ top: 0; left: 5%; z-index: -1; background-color: rgba(255, 255, 255, 0.15); box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37); backdrop-filter: blur(3.5px); border-radius: 10px; border: 1px solid rgba(255, 255, 255, 0.17); display: flex; justify-content: flex-end; } .player-info .info { padding: 5px; width: 60%; font-size: 15px; } /* 进度条%比 */ .info .music-progress { width: 100%; } .music-progress .music-progress-top { display: flex; color: #ff668c; justify-content: space-between; } /* 绘制歌曲进程背景 */ .music-progress .music-progress-bar { width: 100%; height: 3px; background-color: #b8b8b8; border-radius: 10px; margin-top: 3px; } /* 绘制覆盖线 */ .music-progress .music-progress-line { width: 0%; height: 90%; background-color: #ff5a94; } .player-warp .player-control { width: 360px; height: 80px; background-color: #ffffff; border-radius: 15px; display: flex; z-index: 10; } .player-control .cover { position: relative; /* margin-left: 20px; */ left: 30px; width: 104px; height: 100px; border-radius: 50px; background-color: #ffffff; margin-top: -60px; animation: circle 5s infinite linear; animation-play-state: paused; } .player-control img { position: absolute; top: 5%; left: 5%; width: 90%; height: 90px; border-radius: 50%; } .player-control .cover::before { content: ""; display: inline-block; width: 15px; height: 15px; border-radius: 50%; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); background-color: #fff; } .player-control .control { margin-left: 20px; width: 70%; display: flex; align-items: center; justify-content: space-around; } .player-control .control i { display: block; color: #b05757; font-size: 45px; margin-right: 6px; cursor: pointer; transition: all 0.4s; } .control i:hover { color: #e2a3a3 !important; } .bg { position: absolute; top: 0; left: 0; z-index: -2; width: 100%; height: 100%; background: url("http://p2.music.126.net/34YW1QtKxJ_3YnX9ZzKhzw==/2946691234868155.jpg") no-repeat center center; transform: scale(2); /* 模糊 */ filter: blur(50px); transition: all 1s; } li { list-style: none; } .modal { width: 100%; height: 100%; background-color: rgba(128, 128, 128, 0.25); /* 设置固定定位 */ position: fixed; top: 0; right: 0; display: none; } .modal .modal-box { width: 30%; height: 100%; background-color: #fff; position: absolute; top: 0; right: 0; padding: 5px; } .modal-box .modal-close .iconfont { font-size: 23px; } .modal-box .modal-box-top { width: 100%; height: 40px; display: flex; align-items: center; justify-content: space-between; margin-bottom: 5px; } .modal-box .modal-wrapper li { cursor: pointer; display: block; height: 30px; line-height: 30px; display: flex; justify-content: space-between; margin-bottom: 4px; background-color: rgba(230, 230, 230, 0.37); border-bottom: 1px solid rgb(83, 83, 83); } .modal-box .modal-wrapper li span { display: block; font-size: 18px; } .modal-box .modal-wrapper li .iconfont { font-size: 28px; } .modal-box .modal-wrapper li .iconfont:hover { font-size: 30px; } .playing span { color: #00ddc3; }

到这里就讲完了,感谢大家的观看

Read more

Webstorm中的编码辅助AI

Webstorm中的编码辅助AI

Webstorm中的编码辅助AI * MarsCode * MarsCode在WebStorm中的使用 * 安装方式 * 核心功能 * 其它AI插件 MarsCode MarsCode 是一款由 字节跳动(ByteDance) 推出的 AI 编程助手,类似于 GitHub Copilot,提供智能代码补全、生成和优化功能。目前,它主要支持 VS Code 和 JetBrains 系列 IDE(如 WebStorm),但需要手动安装插件。 MarsCode在WebStorm中的使用 安装方式 通过Marketplace安装 1. 在 WebStorm 的 Settings > Plugins 中搜索 MarsCode。 直接安装并重启 IDE。 核心功能 1. 智能代码补全:基于上下文预测代码,支持多种语言 2.

AI Agent 架构:基础组成模块深度解析

AI Agent 架构:基础组成模块深度解析

AI Agent 架构:基础组成模块深度解析 📝 本章学习目标:本章是入门认知部分,帮助零基础读者建立对AI Agent的初步认知。通过本章学习,你将全面掌握"AI Agent 架构:基础组成模块深度解析"这一核心主题。 一、引言:为什么这个话题如此重要 在AI Agent快速发展的今天,AI Agent 架构:基础组成模块深度解析已经成为每个开发者和研究者必须了解的核心知识。无论你是技术背景还是非技术背景,理解这一概念都将帮助你更好地把握AI时代的机遇。 1.1 背景与意义 💡 核心认知:AI Agent正在从"对话工具"进化为"执行引擎",能够主动完成任务、调用工具、与外部世界交互。这一变革正在深刻改变我们的工作和生活方式。 从2023年AutoGPT的横空出世,到如今百花齐放的Agent生态,短短一年多时间,执行式AI已经从概念走向落地。根据最新统计,

Python + Ollama 本地跑大模型:零成本打造私有 AI 助手

Python + Ollama 本地跑大模型:零成本打造私有 AI 助手

零 API 费用、零数据泄露风险、完全离线可用。本文带你从安装到实战,30 分钟跑起一个本地 AI 助手。 一、为什么要在本地跑大模型? 对比维度云端 API(ChatGPT / Claude)本地模型(Ollama)费用按量付费,$20/月起完全免费数据隐私数据上传到云端数据留在本地网络依赖必须联网离线可用模型选择固定自由切换开源模型硬件要求无需要一定配置 38%27%18%12%5%选择本地大模型的理由(2026年开发者调查)数据隐私与安全零成本长期使用离线可用可自由定制微调其他 二、Ollama 是什么? Ollama 是一个开源的本地大模型运行框架,核心特点: * 一键拉取模型:类似 docker pull 的体验 * 自动适配硬件:根据你的显存/内存自动量化 * 兼容 OpenAI API 格式:现有代码几乎不用改 * 跨平台:Windows

OpenClaw 多智能体设置,包含多个 AI 助手

OpenClaw 支持在一个 Gateway 进程内运行多个代理,每个代理都可以像自己的助手一样运行,拥有自己的文件、内存、身份验证和工具。 本指南从实际角度介绍多智能体设置。您将看到两种容易混淆的模式: * 持久代理程序会“永久”存在,通常映射到某个频道、机器人帐户或家庭成员。 * 在后台运行执行特定任务并自动归档的子代理 您可以同时运行这两个代理。常见的设置是:一个主“协调器”代理负责处理主要聊天,并生成子代理来执行并行任务。同时,您还可以将其他持久代理绑定到不同的频道,使它们能够独立运行。 OpenClaw 中的“多智能体”是什么意思? OpenClaw 可以在单个 Gateway 进程内运行多个完全隔离的代理。“隔离”并非营销噱头。每个代理都可以拥有自己的: * 工作区目录和本地文件,例如 SOUL.md 和 AGENTS.md * 内存存储 * 会话历史记录 * 模型提供者和技能的身份验证配置文件 * 技能列表和技能覆盖 * 模型选择和默认值 * 可选的 Docker