JS之歌词滚动案例

让我为大家带来一个歌词滚动的案例吧!
详细的介绍都在代码块中
我很希望大家可以自己动手尝试一下,如果需要晴天的mp3音频文件可以私信我
上代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>歌词滚动</title><style>* {margin: 0;padding: 0;box-sizing: border-box;}ul {list-style: none;transition: all 0.5s;}body {background-color: #000;}audio {display: block;margin: 50px auto;width: 400px;}.container {text-align: center;color: #fff;height: 400px;overflow: hidden;}ul li {height: 40px;line-height: 40px;transition: all 0.5s;}/* 对应的歌词设置active */.active {color: red;/* 建议使用transform font-size会造成reflow重新布局 效率变低 *//* transform不在渲染主线程上执行 而是在合成线程上执行 就不会造成reflow */transform: scale(1.5);}</style>
</head>
<body><!-- 晴天音频 --><audio src="周杰伦-晴天.mp3" controls></audio><!-- 大容器 --><div class="container"><!-- 容器需要装歌词 --><ul></ul></div>
</body>
<script>// 歌词let lrc = `[00:00.71]晴天 - 周杰伦
[00:28.84]故事的小黄花
[00:32.34]从出生那年就飘着
[00:35.85]童年的荡秋千
[00:39.41]随记忆一直晃到现在
[00:42.77]rui sou sou xi dou xi la
[00:45.50]sou la xi xi xi xi la xi la sou
[00:49.41]吹着前奏望着天空
[00:52.60]我想起花瓣试着掉落
[00:56.10]为你翘课的那一天
[00:58.29]花落的那一天
[01:00.14]教室的那一间
[01:01.79]我怎么看不见
[01:03.61]消失的下雨天
[01:05.38]我好想再淋一遍
[01:09.51]没想到失去的勇气我还留着
[01:15.72]好想再问一遍
[01:17.47]你会等待还是离开
[01:24.46]刮风这天我试过握着你手
[01:30.18]但偏偏雨渐渐大到我看你不见
[01:38.50]还要多久我才能在你身边
[01:44.93]等到放晴的那天也许我会比较好一点
[01:52.41]从前从前有个人爱你很久
[01:58.07]但偏偏风渐渐把距离吹得好远
[02:06.44]好不容易又能再多爱一天
[02:12.81]但故事的最后你好像还是说了拜拜
[02:33.93]为你翘课的那一天
[02:36.39]花落的那一天
[02:38.13]教室的那一间
[02:39.84]我怎么看不见
[02:41.55]消失的下雨天
[02:43.31]我好想再淋一遍
[02:47.39]没想到失去的勇气我还留着
[02:53.39]好想再问一遍
[02:55.49]你会等待还是离开
[03:02.46]刮风这天我试过握着你手
[03:08.12]但偏偏雨渐渐大到我看你不见
[03:16.54]还要多久我才能在你身边
[03:23.10]等到放晴的那天也许我会比较好一点
[03:30.49]从前从前有个人爱你很久
[03:36.26]但偏偏风渐渐把距离吹得好远
[03:44.48]好不容易又能再多爱一天
[03:51.05]但故事的最后你好像还是说了拜拜
[03:57.65]刮风这天我试过握着你手
[04:01.45]但偏偏雨渐渐大到我看你不见
[04:04.98]还要多久我才能够在你身边
[04:08.64]等到放晴那天也许我会比较好一点
[04:12.34]从前从前有个人爱你很久
[04:15.40]但偏偏雨渐渐把距离吹得好远
[04:19.05]好不容易又能再多爱一天
[04:22.42]但故事的最后你好像还是说了吧`// 获取audioconst audio = document.querySelector("audio")// 获取容器const container = document.querySelector(".container")// 获取ulconst ul = document.querySelector("ul")// 第一步渲染页面,我们需要用到split \n换行切割 记住是\n 不是/nconst lrcArr = lrc.split("\n")// console.log(lrcArr);// 准备好一个数组接收const resultArr = []// 因为我们是[00:00:00]这样的形式我们需要继续切割for (let i = 0; i < lrcArr.length; i++) {const lrcData = lrcArr[i].split("]")// 我们取到lrcData[0]与lrcData[1]// 获取到 00:00:00这样的字符串const times = lrcData[0].slice(1)// 声明一个对象 我们把时间与歌词依次存入const objLrc = {// 时间 不过我们需要处理一下时间 把00:00:00这样的格式转换为秒seconds: parseTime(times),// 歌词lrc: lrcData[1]}// 添加到resultArr中resultArr.push(objLrc)}// 处理时间转换为秒function parseTime(times) {// 切割times 用:切割let timesArr = times.split(":")// console.log(timesArr);// 把下标为0的分钟转换为秒 但要注意 当前时间为字符串型 我们需要转换为数字型// 介绍一下+ 这个是数值中的隐式转换return +timesArr[0] * 60 + +timesArr[1]}// 渲染页面function createLis() {for (let i = 0; i < resultArr.length; i++) {let li = document.createElement("li")li.innerHTML = resultArr[i].lrcul.appendChild(li)}}createLis()// 获取到下标function getIndex() {// 获取音频的当前时间let current = audio.currentTimefor (let i = 0; i < resultArr.length; i++) {// 判断 如果当前时间小于seconds 下标为 i - 1if (current < resultArr[i].seconds) {return i - 1}}// 找遍了没有找到 说明播放到最后一句了return resultArr.length - 1}// 获取到container的高度const containerHeight = container.clientHeight// 获取到第一个li的高度const liHeight = ul.children[0].clientHeight// 设置最大最小偏移 解决效果不佳const minOffset = 0const maxOffset = ul.clientHeight - containerHeight// 滚动效果function setOffset() {// 下标let index = getIndex()// 滚动到哪了 li的高度乘以下标就是对应的歌词 // 然后减去容器的一半 这时对应的li就在接近中间的位置// 我们再加上li一半的高度这时对应li就在中间let offset = liHeight * index - containerHeight / 2 + liHeight / 2// 判断// 为什么offset会小于0?// 假设现在下标为0 选取到了第0个// 那么就是 liHeight*0 - 200+liHeight/2if (offset < minOffset) {// offset赋为minOffsetoffset = minOffset}// 为什么会大于maxOffset?// 当我们歌到了最后的时候 就会造成这种情况if (offset > maxOffset) {// offset赋为maxOffsetoffset = maxOffset}// 现在可以滚动了 滚动ul// 建议大家使用transform// 好处在哪? 如果使用margin 会造成reflow重新布局 效率会出现问题// transform不在渲染主线程上执行 而是在合成线程上执行 就不会造成reflowul.style.transform = `translateY(-${offset}px)`// 设置active// 首先我们获取到activelet li = ul.querySelector(".active")// 存在就移除if (li) {li.classList.remove("active");}// 获取到下标对应的歌词li = ul.children[index];if (li) {li.classList.add("active");}}// 我们需要用到audio中的timeupdate事件audio.addEventListener("timeupdate", setOffset)
</script>
</html>

请添加图片描述

感谢大家的阅读,如有不对的地方,可以向我提出,感谢大家!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/645318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel·VBA时间范围筛选及批量删除整行

看到一个帖子《excel吧-筛选开始时间&#xff0c;结束时间范围内的所有记录》&#xff0c;根据条件表中的开始时间和结束时间构成的时间范围&#xff0c;对数据表中的开始时间和结束时间范围内的数据进行筛选 目录 批量删除整行&#xff0c;整体删除批量删除整行&#xff0c;分…

HTML+CSS:炫酷登录切换

效果演示 实现了一个登录注册页面的切换效果&#xff0c;当用户点击登录或注册按钮时&#xff0c;会出现一个叠加层&#xff0c;其中包含一个表单&#xff0c;用户可以在表单中输入用户名和密码&#xff0c;然后点击提交按钮进行登录或注册。当用户点击返回按钮时&#xff0c;会…

【Android】Android中的系统镜像由什么组成?

文章目录 总览Boot Loader 的加锁与解锁Boot 镜像内核RAM diskARM 中的设备树 (Device Tree) /System 和/Data 分区镜像参考 总览 各种Android设备都只能刷专门为相应型号的设备定制的镜像。 厂商会提供一套系统镜像把它作为“出厂默认”的 Android 系统刷在设备上。 一个完…

SpringCloudAlibaba系列之Nacos实战

目录 注意事项 参考资源 Nacos配置中心 初始化项目 进行Nacos相关配置 运行 Nacos注册中心 dubbo方式 对外暴露接口dubbo-api 服务提供者dubbo-provider 服务消费者dubbo-consumer 负载均衡客户端方法 服务提供者 服务消费者 注意事项 不管是使用Nacos配置中心&…

代码随想录 Leetcode144/94/145 二叉树的前/中/后序遍历

题目&#xff1a; 前&#xff1a; 中&#xff1a; 后&#xff1a; 代码&#xff08;首刷自解 2024年1月24日&#xff09;&#xff1a; //前序遍历&#xff0c;递归 class Solution { public:void funcOfRecursion(TreeNode* cur, vector<int>& vec) {if (cur null…

谈谈 RocketMQ 5.0 分级存储背后一些有挑战的技术优化

作者&#xff1a;斜阳 RocketMQ 5.0 提出了分级存储的新方案&#xff0c;经过数个版本的深度打磨&#xff0c;RocketMQ 的分级存储日渐成熟&#xff0c;并成为降低存储成本的重要特性之一。事实上&#xff0c;几乎所有涉及到存储的产品都会尝试转冷降本&#xff0c;如何针对消…

自动化Web页面性能测试介绍

随着越来越多的用户使用移动设备访问 Web 应用&#xff0c;使得 Web 应用需要支持一些性能并不是很好的移动设备。为了度量和测试 Web 应用是不是在高复杂度的情况下&#xff0c;页面性能能满足用户的需求。 同时&#xff0c;随着 Web 应用的空前发展&#xff0c;前端业务逐渐…

插入排序

插入排序 概述步骤代码示例输出结果 概述 插入排序是一种最简单直观的排序算法&#xff0c;它的工作原理是通过创建有序序列和无序序列&#xff0c;然后再遍历无序序列得到里面每一个数字&#xff0c;把每一个数字插入到有序序列中正确的位置。 插入排序是一种简单直观的排序…

某马头条——day10

热文章数据查询 分布式任务调度xxl-job 概述 环境搭建 docker化部署 docker run -p 3306:3306 --name mysql57 \ -v /opt/mysql/conf:/etc/mysql \ -v /opt/mysql/logs:/var/log/mysql \ -v /opt/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORDroot\ -d mysql:5.7 dock…

尝试给docker ubuntu22.04镜像添加远程访问桌面

实在时不愿折腾&#xff0c;但是ubuntu 镜像没有桌面&#xff0c;有些操作实在太难受了&#xff0c;效率也不高。硬着头皮上吧。幸亏这是个docker的镜像。要是个虚拟机&#xff0c;这折腾来去&#xff0c;直接崩溃了。docker的好处就是立马就能从头来过&#xff0c;秒级的删除安…

分辨率 时钟频率 lane速率计算

PCLK: pixel clock(像素频率) 计算方法如下&#xff1a; 以1920x1080p/60hz为例&#xff0c;total pixel&#xff1a;2200&#xff0c;total line&#xff1a;1125&#xff0c;filed rate&#xff1a;60Hz&#xff0c;那么&#xff1a;PCLK 2200*1125*60 148.5MHz&#xff1b…

ATF(TF-A)安全通告TF-V11——恶意的SDEI SMC可能导致越界内存读取(CVE-2023-49100)

目录 一、ATF(TF-A)安全通告TFV-11 (CVE-2023-49100) 二、透过事务看本质SDEI是干啥的呢&#xff1f; 三、CVE-2023-49100 1、GICv2 systems 2、GICv3 systems 四、漏洞修复 一、ATF(TF-A)安全通告TFV-11 (CVE-2023-49100) Title 恶意的SDEI SMC可能导致越界内存读取&am…

Spring Security架构

文章目录 过滤器回顾DelegatingFilterProxyFilterChainProxySecurityFilterChainSecurity Filters打印Security Filters将自定义过滤器添加到过滤器链 Handling Security ExceptionsSaving Requests Between AuthenticationRequestCachePrevent the Request From Being Saved R…

《游戏-01_3D-开发》之—人物动画控制器

创建变量&#xff0c; 创建线&#xff0c; 连接&#xff0c; 选中线会变为蓝色&#xff0c;新增变量&#xff0c; 设置线&#xff0c; 双击子层进入子层&#xff0c; 创建变量&#xff0c; 双击SkillPanel 拖拽好之后返回上一层&#xff0c; 依次连接&#xff0c; 设置线&#…

[Tomcat] [从安装到关闭] MAC部署方式

安装Tomcat 官网下载&#xff1a;Apache Tomcat - Apache Tomcat 9 Software Downloads 配置Tomcat 1、输入cd空格&#xff0c;打开Tomca目录&#xff0c;把bin文件夹直接拖拉到终端 2、授权bin目录下的所有操作&#xff1a;终端输入[sudo chmod 755 *.sh]&#xff0c;回车 …

【GitHub项目推荐--不错的 Go 学习项目】【转载】

开源实时性能分析平台 Pyroscope 是基于 Go 的开源实时性能分析平台&#xff0c;在源码中添加几行代码 pyroscope 就能帮你找出源代码中的性能问题和瓶颈、CPU 利用率过高的原因&#xff0c;调用树展示帮助你理解程序&#xff0c;支持 Go、Python、Ruby 语言。 Pyroscope 可以…

k8s的图形化工具---rancher

rancher是一个开源的企业级多集群的k8s管理平台。 rancher和k8s的区别&#xff1a;都是为了容器的调度和编排系统。但是rancher不仅可以调度还可以管理整个k8s集群。 rancher自带监控(普罗米修斯) 实验部署 master01 20.0.0.32 node01 20.0.0.34 node02 20.0.0.35 test …

【Java Kubernates】Java调用kubernates提交Yaml到SparkOperator

背景 目前查询框架使用的是trino&#xff0c;但是trino也有其局限性&#xff0c;需要准备一个备用的查询框架。考虑使用spark&#xff0c;spark operator也已经部署到k8s&#xff0c;现在需要定向提交spark sql到k8s的sparkoperator上&#xff0c;使用k8s资源执行sql。 对比 …

linux安装docker--更具官网教程

1.访问https://docs.docker.com/ 2.进入download 3输入cento 或者直接访问地址Install Docker Engine on CentOS | Docker Docs 4一步一步根据官网命令走 2安装 3 4 方式一&#xff1a; service docker start&#xff08;开启&#xff09; service docker status&#xff08…

使用PowerShell命令行,批量修改文件编码

目录 ■前言 ■PowerShell命令 ■效果 ■前言 今天统计修改代码量&#xff0c;使用工具时&#xff0c;发现有些代码无法统计。 原因时UTF-8中有某些特殊字符&#xff0c;工具不能识别。 但是&#xff0c;如果把代码转换为SJIS格式&#xff0c;就能正常统计了。 因此&…