本周学习了js的,用老师教的敲了一个音乐播放器

准备工作

首先随便找首歌

然后用一个小工具扒它的歌词


前期准备完成

代码部分

现在就开始写 htmlcss

很简单 就不解释了 直接上代码

html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta http-equiv="X-UA-Compatible" content="ie=edge" /><title>Music player</title><link rel="stylesheet" href="index.css" /></head><body><div class="container"><audio id="MusicPlayer" src="media/袁娅维 - Starfall.flac" controls loop></audio><div class="btn"><button onclick="turn -= 0.1">-0.1s</button><button onclick="turn += 0.1">+0.1s</button></div><div class="lrc"><ul id="ullrc"></ul></div></div><script src="./index.js"></script></body>
</html>

css

*{box-sizing: border-box;
}
body{background: #000;
}
.container{width: 100%;
}
.container #MusicPlayer{width: 600px;display: block;margin: 0 auto;
}
.container .btn{display: block;margin: 0 auto;
}
.container .lrc{width: 700px;height: 450px;overflow: hidden;display: block;margin: 0 auto;
}
.container .lrc #ullrc{width: 100%;padding: 0;list-style: none;transition: 0.3s all ease;margin: 0;
}
/*歌词普通样式*/
.container .lrc #ullrc li{height: 35px;line-height: 35px;font-size: 1em;color: #aaa;font-weight: normal;transition: .3s all ease;/*一定要加上不然看着突兀*/list-style-type: none;text-align: center;display: block;width: 100%;margin: 0 auto;}
/*动态歌词样式*/
.container .lrc #ullrc li.active{ font-size: 1.2em;color: #fff;font-weight: bold;
}

js

完整js

先上完整js然后再讲一下

var lrc = `    歌词歌词歌词`;function $(id) {return document.getElementById(id);
}//这样写以后getid方便function getLrcArray() {var parts = lrc.split("\n");for (let index = 0; index < parts.length; index++) {parts[index] = getLrcObj(parts[index]);}return parts;function getLrcObj(content) {var twoParts = content.split("]");var time = twoParts[0].substr(1);var timeParts = time.split(":");var seconds = +timeParts[1];var min = +timeParts[0];seconds = min * 60 + seconds;var words = twoParts[1];return{seconds: seconds,words: words,};}
}var lrcArray = getLrcArray();function inputLrc() {for (let index = 0; index < lrcArray.length; index++) {var li = document.createElement("li");li.innerText = lrcArray[index].words;$("ullrc").appendChild(li);}
}inputLrc();function setPosition() {var index = getLrcIndex();if (index == -1) {return;}var lrc_li_height = 35, lrc_ul_height = 450;var top = index * lrc_li_height + lrc_li_height / 2 - lrc_ul_height / 2;if (top < 0) {top = 0;}$("ullrc").style.marginTop = -top + "px";var activeLi = $("ullrc").querySelector(".active");if(activeLi){activeLi.classList.remove("active");}$("ullrc").children[index].classList.add("active");
}var turn = 0;function getLrcIndex(){var time = $("MusicPlayer").currentTime + turn;for (var index = 0; index < lrcArray.length; index++) {if (lrcArray[index].seconds > time) {return index - 1;}}
}$("MusicPlayer").ontimeupdate = setPosition;

那接下来就到了我们的重头戏了

首先我们得到了歌词

但是是这样的

第一步 歌词信息获取

我们要从这样的字符串中得到信息,就需要先把每段分割开来

接着再从每一段去获取它的时间和歌词俩个信息

那就这样写

var lrc = `
这里是一大堆歌词
`;
var parts=lrc.split("\n");

这样就能把字符串根据回车分割开来,然后就是一步一步分割,直到达到我们要的格式

和上面一个逻辑就不解释了

function getLrcArray() {//分割每一列var parts = lrc.split("\n");//遍历分割每一句for (let index = 0; index < parts.length; index++) {parts[index] = getLrcObj(parts[index]);}return parts;function getLrcObj(content) {//把一句分割为俩部分var twoParts = content.split("]");var time = twoParts[0].substr(1);//将时间前的"["截掉var timeParts = time.split(":");//用秒处理比较翻版我们这里这里转换成秒var seconds = +timeParts[1];var min = +timeParts[0];seconds = min * 60 + seconds;//歌词获取var words = twoParts[1];return{//返回秒和歌词seconds: seconds,words: words,};}
}var lrcArray = getLrcArray();//结果存储在这里

第二步 创建li

歌词文件都处理好了就没必要我们亲自去一个一个设置了,这里用js在页面上创建li元素

function inputLrc() {for (let index = 0; index < lrcArray.length; index++) {//不用数,有多少句创建多少li标签var li = document.createElement("li");li.innerText = lrcArray[index].words;//歌词放入$("ullrc").appendChild(li);//将这个li作为ul的子元素}
}

就没了

第三步 歌词位置滚动

这里歌词位置的滚动就是根据修改margin-top: ;进行的,然后给元素再增加一个active样式就可以了
但是margin-top: ;的值怎么确定呢?


我要让歌词居中显示,那么画一个模型出来是这样的


每次要让歌词的中间位置处于中线上,我们要算的其实就是溢出部分的高,将这个高写入 margin-top: -height;就可以实现效果了

那问题来了,这个溢出部分的高怎么算呢.我们假设现在播放到了第i行歌词,也就是说要处在中线上的歌词就是第i行歌词,
根据下图可知
溢出部分的高度就是 * i 歌词行高 + 行高 / 2 - 460 / 2*

(为了数组遍历,i是从0开始的)

接着就是写一个active样式,把选中的歌词加上样式,把其他的active去掉即可

function setPosition() {var index = getLrcIndex();var lrc_li_height = 35, lrc_ul_height = 450;//定义行高和歌词box高度var top = index * lrc_li_height + lrc_li_height / 2 - lrc_ul_height / 2;//计算if (top < 0) {top = 0;//如果top为负说明歌词在开始几句,无需滚动,top归零}$("ullrc").style.marginTop = -top + "px";//改变mtvar activeLi = $("ullrc").querySelector(".active");//寻找ul下类名为active的元素并返回之if(activeLi){activeLi.classList.remove("active");//删}$("ullrc").children[index].classList.add("active");//添
}

歌词行数获取

接着只要得到歌词在哪一行就可以了

这个很简单

比较播放时间,出现播放时间小于数组存的时间的情况,直接返回index-1

function getLrcIndex(){var time = $("MusicPlayer").currentTime;for (var index = 0; index < lrcArray.length; index++) {if (lrcArray[index].seconds > time) {return index - 1;}}
}

因为最开始时返回值为 -1,所以还要在前面的调用中判断如果 index == -1 的话退出函数

原生js html音乐播放器(歌词滚动)相关推荐

  1. html+css+js本地音乐播放器,实现可视化音频频谱

    效果 html+css+js本地音乐播放器,实现可视化音频频谱 前言 之前用swing写了个本地音乐播放器(如下图),但是效果一言难尽,界面丑,功能bug也多,唉 所以后面又重新用html写了个,界面 ...

  2. js html5 音乐播放器代码大全,js实现简单音乐播放器

    本文实例为大家分享了js实现音乐播放器的具体代码,供大家参考,具体内容如下 效果图: 可播放暂停继续播放,进度条可拖动,时间展示,声音调节 完整代码(直接拿来用) audio功能开发 * { marg ...

  3. 电脑端音乐播放器html5,原生js的音频播放器,兼容pc端和移动端(原创)

    插件描述:基于原生的音频播放器效果,小巧易用 更新时间:2018/12/10 下午3:08:16 更新说明: 1. 更新demo的音频地址 2. 组件的图片地址使用本地base64的图片格式 更新时间 ...

  4. 黄聪:原生js的音频播放器,兼容pc端和移动端(原创)

    更新时间:2018/9/3 下午1:32:54 更新说明:添加音乐的loop设置和ended事件监听 loop为ture的时候不执行ended事件 1 2 3 4 5 6 7 8 9 10 11 12 ...

  5. javafx音乐播放器----歌词同步实时显示(包含获取酷我歌词方式,歌词同步方法)

    首先我是爬虫获取的酷我的音源,因此歌词也是通过爬虫获取的,下面这个方法可以获取到歌曲对应的歌词信息.简单说下,在搜索歌曲之后会返回一个歌曲列表,查看源代码是包含在li标签里面的,这个li标签里面就有请 ...

  6. HTML+纯JS制作音乐播放器

    该篇文章会教你通过JavaScript制作一个简单的音乐播放器.包括播放.暂停.上一曲和下一曲. 阅读本文章你需要对HTML.CSS和Javascript有基本的了解. 话不多说,先上图. emmm. ...

  7. vue 音乐盒app_基于Vue.js的音乐播放器(Webapp)

    概述 项目是基于Vue.js,成品是一个移动端的音乐播放器,来源于imooc的实战课程.自己动手实践并加以修改拓展. 项目的大致流程是Vue-cli构建开发环境,分析需求,设计构思,规划目录结构,开始 ...

  8. 音乐播放器歌词的逐字渲染效果

    受到Android 自定义控件玩转字体变色 打造炫酷ViewPager指示器的启发,决定用这个来仿制大多数音乐播放器的逐字染色效果,效果图如下: 关键点剖析一:逐字染色效果 关键代码如下: publi ...

  9. JS制作音乐播放器并高亮歌词滚动以及按钮暂停播放切歌

    简介:高亮歌词这里需要说一个文件,也就是.lrc文件,这个功能制作是将文件中时间与音乐文件中播放的进度作比较,实现文件何时滚动换行以及高亮的,好了看代码(我的歌曲文件是周总的<等你下课>) ...

最新文章

  1. Cache Memory技术示例
  2. Archlinux里面安装VMware Tools
  3. C#[Serializable]在C#中的作用-NET 中的对象序列化
  4. MarkdownPad 2 常用快捷键
  5. word无法打开请去应用商店_word软件是什么?word文档是什么?可以用来干什么?...
  6. Silverlight 解谜游戏 之十七 胜利界面优化
  7. spreadsheet js中创建下拉列表_JS 中创建自定义排序方法
  8. 微软Windows7将捆绑杀软 众厂商面临生死抉择
  9. 熊猫concat()例子
  10. openresty查看log
  11. 12_电话拨号器_界面实现
  12. 用好文本框间的链接功能
  13. html前端登录界面示例
  14. ORACLE 锁解释
  15. 软件架构风格-数据流风格
  16. python 正则表达式 前瞻_Python的正则表达式
  17. turtle-绘制简易瞄准镜
  18. 阿里妈妈一面简历面-半小时直接挂
  19. Codeforces 1379B.Dubious Cyrpto
  20. python操作mysql_python操作MySQL

热门文章

  1. 喜报!Zilliz 斩获 AI 顶会 NeurlPS 向量检索比赛冠军
  2. 光敏电阻控制小灯泡的亮暗代码编写
  3. np.mat()函数与np.array()函数的辨析
  4. 基于示波器的DDR4眼图测试方法
  5. 华为将在MWC2019上发布5G折叠屏手机,与三星争第一
  6. 查看签名指纹MD5和SHA1值(应用签名)
  7. 顶级配置华硕笔记本电脑900元清仓咯
  8. (专升本)Excel(Excel 2010主要功能、工作簿与工作表操作)
  9. Shoot Game
  10. wsjls-zw:16、面向对象和原型及原型链