html页面制作滚动歌词

效果(视频转的gif,效果差,凑活看看吧):
在这里插入图片描述

在我们制作页面音乐的时候,我们一般利用audio标签,看起来效果挺不错的,可是这样的界面不够美观不是吗?那么我想,如果添加歌词滚动效果,那么界面是不是很棒?当然,我们制作的页面不涉及服务器,不然就不够纯粹了,利用简单的JS和jquery就可以完成了!!分享一下。首先我们创建一个html文件,名字随便取,比如:index.html,这个简单,不用多说。不着急开始写代码,我们在创建一个css文件,不妨就命名为musicplay.css,js的话我们直接写道html文件里面方便阅读和调整,就不创建新的js文件了,但是你要准备jQuery文件,如果没有也没关系,待会说解决方法。准备工作结束了,我们开始写了,首先在标签里面写好编码格式,顺便也把我们之前创建的css样式和jQuery引入,代码如下:
代码如下:<head><meta charset="UTF-8"><title>爱在西元前-周杰伦</title><link type="text/css" rel="stylesheet" href="css/musicplay.css" /><script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script><!--注意:这种从网上直接引入的方法需要链接网络,如果你本地下载好了,就把这句话删除,采用下面的映入方式--><script src="js/jquery-1.9.1.min.js"></script></head>head内容写好后,我们开始写body里面的了,首先我们用

放置播放器,就是标签,代码如下:
<center> <audio autoplay="autoplay src="爱在西元前.mp3" controls></audio></center><!--这里修改播放器里面播放的音乐,这里只有简单的控制,没做上一曲,下一曲的功能 ,autoplay="autoplay"属性为自动播放,不想让自动播放删去即可 -->
去即可 -->接着写一个盒子,代码如下:
盒子的css代码如下(功能见备注):
* {margin: 0;padding: 0;}.bg {/* 歌词调整区 */width: 100%;/* 歌词显示盒子宽 */height: 100px;/* 歌词显示盒子高度,需要多显示几行歌词相应调大即可 *//* background-color:#333; */ /* 歌词背景颜色 */margin: 15px auto;color: darkgrey;/* 歌词默认颜色,灰色 */font-size: 12px;/* 歌词字体默认大小 */overflow: hidden;position: relative;font-family: "微软雅黑";/*字体可以随便换*/}.bg ul {width: 100%;position: absolute;top: 0;left: 0;list-style: none;}.bg ul li {width: 100%;height: 30px;line-height: 30px;text-align: center;}.bg ul li.active {/* 歌词高亮滚动区 */color: black;/* 歌词滚动高亮颜色 *//* font-weight: bold; *//* 文本加粗,不要,太丑了! */font-size: 15px; /* 歌词滚动行文字大小 */}audio {/* 播放器调整区 */width: 100%; /* 调整播放器宽度 *//* 其他要修改播放器在这里修改 */}
接下来就是js脚本事了,我们的设计思路是(分下面几个函数完成):
函数1:parseLyric()分割歌词,这一步主要是为了分行显示歌词
函数2:highLight()当前放到的歌词高亮显示,为了表示当前唱到那一句了
函数3:audio.addEventListener()实时渲染,因为是滚动的,所以要不停的渲染
函数4:getLineNo()获取此时的行数,如果我们快进或快退的时候,歌词也要跟着我们的调整而改变
函数5:audio.addEventListener()播放完回到开始,这个可以不做,没有太意义,这是为了完善功能解释好这几个函数之后,我直接贴代码。

<script type="text/javascript">    $(function() {       
 function parseLyric(text) { 
 //按行分割歌词            
 let lyricArr = text.split('\n');            //console.log(lyricArr)
//0: "[ti:爱在西元前]" "[ar:周杰伦]"...  
 let result = []; 
 //新建一个数组存放最后结果      
 //遍历分割后的歌词数组,将格式化后的时间节点,歌词填充到result数组           
  for (i = 0; i < lyricArr.length; i++) {                let playTimeArr = lyricArr[i].match(/\[\d{2}:\d{2}((\.|\:)\d{2})\]/g); 
  //正则匹配播放时间               
   let lineLyric = "";              
  if (lyricArr[i].split(playTimeArr).length > 0) {                   
 lineLyric = lyricArr[i].split(playTimeArr);                }                
 if (playTimeArr != null) {                    for (let j = 0; j < playTimeArr.length; j++) {                        
 let time = playTimeArr[j].substring(1, playTimeArr[j].indexOf("]")).split(":");                        //数组填充   
result.push({                            time: (parseInt(time[0]) * 60 + parseFloat(time[1])).toFixed(4),                            content: String(lineLyric).substr(1)                        });                    
}                
}            
}            
return result;        
}
// 这里请按照格式放入相应歌词--开始
// 格式可能看着很复杂,其实是根据lrc歌词文件换句前加入\n 换行符,然后删除多余空行.即可!        
let text = "[ti:爱在西元前][ar:周杰伦][al:范特西]\n[00:00.00]爱在西元前\n[00:04.00]作词:方文山 作曲:周杰伦 \n[00:12.00]演唱:周杰伦\n[00:16.00]\n[00:32.20]古巴比伦王颁布了汉摩拉比法典\n[00:35.69]刻在黑色的玄武岩 距今已经三千七百多年\n[00:40.05]你在橱窗前 凝视碑文的字眼\n[00:43.59]我却在旁静静欣赏你那张我深爱的脸\n[00:47.70]\n[00:47.76]祭司 神殿 征战 弓箭 是谁的从前\n[00:51.47]喜欢在人潮中你只属于我的那画面\n[00:55.14]经过苏美女神身边 我以女神之名许愿\n[00:59.47]思念像底格里斯河般的漫延\n[01:03.28]当古文明只剩下难解的语言\n[01:09.70]传说就成了永垂不朽的诗篇\n[01:18.18]我给你的爱写在西元前\n[01:21.15]深埋在美索不达米亚平原\n[01:25.98]几十个世纪后出土发现\n[01:28.50]泥板上的字迹依然清晰可见\n[01:33.35]我给你的爱写在西元前\n[01:36.10]深埋在美索不达米亚平原\n[01:41.34]用楔形文字刻下了永远\n[01:43.65]那已风化千年的誓言 一切又重演\n[01:50.17]\n[01:51.70]祭司 神殿 征战 弓箭 是谁的从前\n[01:55.72]喜欢在人潮中你只属于我的那画面\n[01:59.57]经过苏美女神身边 我以女神之名许愿\n[02:03.95]思念像底格里斯河般的漫延\n[02:07.48]当古文明只剩下难解的语言\n[02:14.06]传说就成了永垂不朽的诗篇\n[02:22.66]我给你的爱写在西元前\n[02:25.34]深埋在美索不达米亚平原\n[02:30.36]几十个世纪后出土发现\n[02:32.86]泥板上的字迹依然清晰可见\n[02:37.69]我给你的爱写在西元前\n[02:40.49]深埋在美索不达米亚平原\n[02:45.30]用楔形文字刻下了永远\n[02:48.01]那已风化千年的誓言 一切又重演\n[02:52.90]我感到很疲倦 离家乡还是很远\n[02:59.41]害怕再也不能回到你身边\n[03:06.76]\n[03:07.95]我给你的爱写在西元前\n[03:10.73]深埋在美索不达米亚平原\n[03:15.82]几十个世纪后出土发现\n[03:18.22]泥板上的字迹依然清晰可见\n[03:23.30]我给你的爱写在西元前\n[03:25.89]深埋在美索不达米亚平原\n[03:30.76]用楔形文字刻下了永远\n[03:33.59]那已风化千年的誓言 一切又重演";
// 这里请按照格式放入相应歌词--结束        
let audio = document.querySelector('audio');        let result = parseLyric(text); //执行lyc解析        // 把生成的数据显示到界面上去        
let $ul = $("<ul></ul>");        
for (let i = 0; i < result.length; i++) {            let $li = $("<li></li>").text(result[i].content);            $ul.append($li);        
}        
$(".bg").append($ul);        
let lineNo = 0; 
// 当前行歌词        
let preLine =1; // 当播放6行后开始滚动歌词
let lineHeight = -30; // 每次滚动的距离        // 滚动播放 歌词高亮  增加类名active  
function highLight() {            
let $li = $("li");            $li.eq(lineNo).addClass("active").siblings().removeClass("active");            
if (lineNo > preLine) {                $ul.stop(true, true).animate({ top: (lineNo - preLine) * lineHeight });            
}        
}        
highLight();        
// 播放的时候不断渲染   
audio.addEventListener("timeupdate", function() {            
if (lineNo == result.length) return;            if ($("li").eq(0).hasClass("active")) {                $("ul").css("top", "0");            
}            
lineNo =getLineNo(audio.currentTime);            highLight();            
lineNo++;        });        
// 当快进或者倒退的时候,找到最近的后面那个
result[i].time        
function getLineNo(currentTime) {            if (currentTime >=parseFloat(result[lineNo].time)) {                // 快进                
for (let i = result.length - 1; i >= lineNo; i--) {                    
if (currentTime >= parseFloat(result[i].time)) {                        return i;                    
}                
}            
} else {                
// 后退                
for (let i = 0; i <= lineNo; i++) {                    if (currentTime <= parseFloat(result[i].time)) {                        return i - 1;                    
}                
}            
}        
}        
//播放结束自动回到开头 
audio.addEventListener("ended", function() {            lineNo = 0;            
highLight();            
audio.play();            
$("ul").css("top", "0");        
});    
});    
</script>

源代码地址:百度网盘直接下载
提取码:h7g9

制作一个可以滚动HTML 页面,可以使用 `<div>` 标签来创建一个容器,在其中添加内容。然后,将该容器的样式设置为具有固定高度和 `overflow: scroll` 属性,以便在内容超出容器高度时出现滚动条。 以下是一个简单的示例: ```html <!DOCTYPE html> <html> <head> <title>Scrollable Page</title> <style> .container { height: 300px; overflow: scroll; } </style> </head> <body> <div class="container"> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod metus ut felis dignissim, et tristique enim porta. Praesent vel nibh a massa vestibulum facilisis. Sed posuere eros nec nisi suscipit, ac malesuada felis cursus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Quisque ac mi elit. Nullam vitae mi eget magna luctus sagittis. Donec vehicula tellus quis felis laoreet, ut consequat quam tincidunt. Nam quis nunc auctor, bibendum lectus at, ullamcorper nulla. Curabitur vel ex tincidunt, hendrerit purus sed, tincidunt orci. Ut scelerisque commodo sapien, eu congue est volutpat sed. Vestibulum eget odio ligula. </p> <p>Integer nec ipsum vel mauris consectetur molestie. Etiam auctor augue non quam ullamcorper, a porttitor nunc efficitur. Sed eu ligula vitae lectus commodo efficitur. Quisque in venenatis massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed vel quam eget tellus finibus ullamcorper. Sed mollis, nisl eget aliquet fermentum, sem arcu tincidunt augue, vel bibendum nulla sapien id velit. Duis viverra metus ut enim convallis, nec scelerisque mi porttitor. Nulla facilisi. </p> <p>Phasellus at neque quis turpis auctor egestas. Ut et augue sem. Vestibulum vel rutrum risus. Sed euismod elit sed pellentesque volutpat. Donec et elit auctor, facilisis ipsum eu, ullamcorper mi. Sed commodo, dolor et luctus bibendum, mauris turpis euismod turpis, at varius mi est vel metus. Praesent feugiat id felis non consequat. Suspendisse euismod, urna sit amet pretium bibendum, risus augue commodo lectus, ac volutpat elit metus vel urna. </p> <p>Nam in libero euismod, bibendum nibh ut, faucibus sem. Aliquam erat volutpat. Sed vitae nulla quam. Ut vel leo vitae purus hendrerit interdum. Integer id diam ac sapien aliquet sodales. Donec placerat ligula purus, ut rhoncus massa sollicitudin ut. Donec euismod, nisl quis vehicula lacinia, metus tellus vehicula lacus, sed maximus dolor nisl vel odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam vitae vulputate felis. </p> <p>Etiam hendrerit, felis quis venenatis commodo, enim lacus pretium quam, id cursus sem purus non ante. In rhoncus elit eu placerat feugiat. Nulla facilisi. Nulla facilisi. Sed euismod, velit non blandit malesuada, magna mauris suscipit nibh, sit amet ultrices turpis velit non lectus. Nunc eget felis sed est ultrices aliquam. Duis ac justo massa. </p> </div> </body> </html> ``` 在这个例子中,我们使用 `<div>` 标签创建了一个名为 `container` 的容器,将其样式设置为具有 `height: 300px` 和 `overflow: scroll` 属性,以便在内容超出容器高度时出现滚动条。在容器中添加了一些段落作为示例内容。 可以根据需要更改容器的高度和样式,以实现所需的滚动效果。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值