js歌词滚动效果

2023-10-26

目录

效果图展示:

一.素材准备:

1.歌词数据data.js:借鉴了网上copy下来的歌词模板

2.图片准备: 设置title效果

3.音频文件准备:

二.html块:

拓展 标签属性:

三.设置scss样式:

四.逻辑js块:

拓展:使用到的audio的事件:

效果图展示:

一.素材准备:

1.歌词数据data.js:借鉴了网上copy下来的歌词模板

const lrc = `
[00:00.000] 作词 : 黄家驹\n
[00:01.000] 作曲 : 黄家驹\n
[00:02.000] 编曲 : Beyond/梁邦彦\n
[00:03.000] 制作人 : Beyond/梁邦彦\n
[00:18.466]今天我 寒夜里看雪飘过\n
[00:25.110]怀着冷却了的心窝漂远方\n
[00:30.950]风雨里追赶 雾里分不清影踪\n
[00:37.229]天空海阔你与我\n
[00:40.291]可会变 (谁没在变)\n
[00:43.440]多少次 迎着冷眼与嘲笑\n
[00:50.050]从没有放弃过心中的理想\n
[00:55.907]一刹那恍惚 若有所失的感觉\n
[01:02.133]不知不觉已变淡\n
[01:05.243]心里爱 (谁明白我)\n
[01:08.801]原谅我这一生不羁放纵爱自由\n
[01:15.799]也会怕有一天会跌倒\n
[01:22.008]背弃了理想 谁人都可以\n
[01:28.276]哪会怕有一天只你共我\n
[01:34.102]\n
[01:42.695]今天我 寒夜里看雪飘过\n
[01:49.284]怀着冷却了的心窝漂远方\n
[01:55.189]风雨里追赶 雾里分不清影踪\n
[02:01.405]天空海阔你与我\n
[02:04.535]可会变 (谁没在变)\n
[02:08.014]原谅我这一生不羁放纵爱自由\n
[02:15.040]也会怕有一天会跌倒\n
[02:21.279]背弃了理想 谁人都可以\n
[02:27.531]哪会怕有一天只你共我\n
[02:33.633]\n
[03:08.454]仍然自由自我 永远高唱我歌\n
[03:15.064]走遍千里\n
[03:19.739]原谅我这一生不羁放纵爱自由\n
[03:26.734]也会怕有一天会跌倒\n
[03:33.005]背弃了理想 谁人都可以\n
[03:39.257]哪会怕有一天只你共我\n
[03:45.496]背弃了理想 谁人都可以\n
[03:51.756]哪会怕有一天只你共我\n
[03:57.201]原谅我这一生不羁放纵爱自由\n
[04:04.204]也会怕有一天会跌倒\n
[04:10.456]背弃了理想 谁人都可以\n
[04:16.647]哪会怕有一天只你共我\n
[04:22.828]\n
[04:31.852] 录音 : Shunichi Yokoi\n
[04:40.876] 混音 : Shunichi Yokoi\n
[04:49.900] 录音室 : Greenbird St./Tokyu Fun St./West Side St.(Tokyo/From Jan/to Apr./1993)\n
[04:58.924] 母带工程师 : Setsu Hisai at Tokyu Fun St.\n[05:07.948] 弦乐 : 桑野圣乐团 (Kuwano Strings)\n
[05:16.972] OP : Amuse Inc. & Fun House Inc.\n[05:25.996] SP : Amuse H.K. Ltd.`

2.图片准备: 设置title效果

3.音频文件准备:

二.html块:

拓展 <audio> 标签属性:

  • src:音乐的URL
  • preload:预加载
  • autoplay:自动播放
  • loop:循环播放
  • controls:浏览器自带的控制条
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    // 设置title
    <link rel="shortcut icon" href="./bitbug_favicon.ico" type="image/x-icon">
    // 引入css样式文件
    <link rel="stylesheet" href="./index.min.css">
</head>
<body>
    <audio src="./海阔天空.mp3" controls></audio>

    <div class="box">
        <ul class="lrc-list">
        </ul>
    </div>
</body>
// 引入歌词文件
<script src="./data.js"></script>
<script src="./index.js"></script>
</html>

三.设置scss样式:

*{

    margin: 0;
    padding: 0;
}
body{
    background: #000;
    color: #999;
    text-align: center;
}

audio{
    width: 80%;
    margin: 30px 0;
}

.box{
    height: 420px;
    border: 1px solid #fff;
    overflow: hidden;
    .lrc-list{
        list-style: none;
        transform: translateY(-0px);
        transition: 0.2s;
        li{
            line-height: 30px;
            transition: 0.2s;
        }
        .active{
            color: #fff;
            transform: scale(1.5);
        }
    }
}

四.逻辑js块:

const doms = {
    audio: document.querySelector('audio'),
    box: document.querySelector('.box'),
    lrcEl: document.querySelector('.lrc-list'),
    lis:document.querySelectorAll('.lrc-list li')
}

/**
 * 解析歌词字符串
 * 得到歌词字符串数组
 * {time:时间,words:歌词内容}
 */
function parseLrc() {
    const lines = lrc.split('\n')
    const result = lines.map(item => {
        const newItem = item.split(']')
        return {
            time: parseTime(newItem[0].slice(1)),
            words: newItem[1].trim(),
        }
    })
    return result
}
const lrcData = parseLrc()
console.log(lrcData);

/**
 * 将一个时间字符串解析为数字(秒)
 * @param {*} timeStr 
 * @returns 
 */
function parseTime(timeStr) {
    var part = timeStr.split(':')
    // console.log(part);
    return +part[0] * 60 + +part[1]
}

/**
 * 计算出,当前播放器播放的第几秒,lrcData数组中应该高亮的歌词下标
 */
function findIndex() {
    const currentTime = doms.audio.currentTime
    // console.log('currentTime', currentTime);
    for (var index = 0; index < lrcData.length; index++) {
        if (currentTime < lrcData[index].time) {
            return index - 1
        }
    }
    return lrcData.length - 1
}

// 渲染界面
function createLrcEl() {
    for (let index = 0; index < lrcData.length; index++) {
        const lis = document.createElement('li')
        lis.innerText = lrcData[index].words
        doms.lrcEl.appendChild(lis)
    }
}
createLrcEl()

// 盒子的高度
const boxHeight = doms.box.clientHeight
// 每个li的高度
const liHeight = doms.lrcEl.children[0].clientHeight
// 最大的高度
const maxHeight = doms.lrcEl.clientHeight - liHeight

function setOffset() {
    // 定位当前高亮歌词下标
    const lrcIndex = findIndex()
    // 计算需要移动的距离
    var moveHeight = liHeight * lrcIndex - (liHeight / 2) - (boxHeight / 2)
    if (moveHeight < 0) {
        moveHeight = 0
    }
    if (moveHeight > maxHeight) {
        moveHeight = maxHeight
    }
    doms.lrcEl.style.transform = `translateY(-${moveHeight}px)`

    // 添加高亮的样式
    const oldLi = doms.lrcEl.querySelector('.active')
    if(oldLi){
        oldLi.classList.remove('active')
    }
    const li = doms.lrcEl.children[lrcIndex]
    if (li) {
        li.classList.add('active')
    }
}

doms.audio.addEventListener('timeupdate', setOffset)

拓展:使用到的audio的事件:

audio.addEventListener("timeupdate", callback);
// 播放时间改变时触发

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js歌词滚动效果 的相关文章

随机推荐

  • c语言 (3×3)矩阵转置

    题目描述 写一个函数 使给定的一个二维数组 转置 即行列互换 输入 一个3x3的矩阵 输出 转置后的矩阵 样例输入 1 2 3 4 5 6 7 8 9 样例输出 1 4 7 2 5 8 3 6 9 废话不说还是直接上代码 include
  • 使用STM32CUBEIDE创建工程,点亮LED

    1 创建LED驱动文件 先在工程下新建一个文件夹命名为icode存放驱动程序 然后对每一个外设新建新的驱动文件夹 如驱动LED就新建文件夹led 然后在led文件夹下创建对应的头文件和源文件 即led h和led c 然后编写对应外设的驱动
  • X.509证书的使用

    总结一下如何使用X 509证书来保护我们的设备的数据传输 证书的签发 以下是证书签发的流程 为了更好的演示 我们需要分别创建两个根证书 并且用每个根证书来颁发一个客户端证书 这两个根证书分别为root 1 crt以及root 2 crt 对
  • Java上传下载ftp文件

    在Java中连接FTP服务器可以使用Apache Commons Net库提供的FTPClient类 以下是一个简单的示例代码 演示如何连接到FTP服务器 进行文件上传和下载操作 import org apache commons net
  • 【Windows上同时安装两个不同版本MYSQL】MySQL安装教程--5.7和8.0版本

    一 MySQL官网下载对应版本的zip文件 最新版本8 0 34下载链接 https dev mysql com downloads mysql MySQL 5 7下载链接 https downloads mysql com archive
  • vue中使用百度地图自定义信息窗口

    场景 点击地图上的标注的时候 希望可以显示自定义的信息弹窗 具体效果如下 注意 如果只是简单显示信息 则使用InfoWindow信息窗口或者标注本身的title属性即可 想自定义就使用infoBox自定义信息窗口工具 效果 效果图是GIF图
  • 【满分】【华为OD机试真题2023B卷 JS】矩阵最大值

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 矩阵最大值 知识点矩阵数组 时间限制 1s 空间限制 32MB 限定语言 不限 题目描述 给定一个仅包含0和1的N N二维矩阵 请计算二维矩阵的最大值 计算规则如下 1 每行元素按下标
  • startx analyze

    1 xinit 在说明startx之前 我想我们应该先了解一下xinit 因为startx就是通过调用xinit启动X的 1 1 功能 当我们安装了Ubuntu后 默认就已经安装了xinit 它位于 usr bin下 xinit是一个二进制
  • RabbitMQ(四)消息Ack确认机制

    RabbitMQ 四 消息Ack确认机制 确认种类 RabbitMQ的消息确认有两种 消息发送确认 这种是用来确认生产者将消息发送给交换器 交换器传递给队列的过程中 消息是否成功投递 发送确认分为两步 一是确认是否到达交换器 二是确认是否到
  • AS 从SVN转向Git

    之前的项目都是用SVN 感觉SVN 还是挺不错的 但接触了Git后 才发现长江后浪推前浪 前浪死在沙滩上 果断抛弃了SVN 转向git的怀抱 虽然遇到了很多问题 但在同事的帮助下 至少能上传和check了 之后遇到git上的问题后 在写文章
  • js从数组中提取自己所需的数据

    1 场景一 人员选择相关问题 场景一 从人员选择数据中 提取已选的人员信息 selectedList为已选择的人员信息 只有id groupInfo接口返回的原始数据 所有人员信息 需要找出已选择的人员信息的具体信息 const group
  • 使用RBAC模型构建动态路由权限,交由前端动态渲染路由。

    根据RBAC模型生成动态路由并交给前端渲染 什么是RBAC模型 简单的RBAC模型数据库设计 后端处理动态的路由表信息 前端渲染路由的细节与注意 什么是RBAC模型 RBAC Role Based Access Control 模型是一种访
  • C++0基础教程

    还在苦恼找不到C 的教程吗 这篇文章搞定C 基础内容 前言 C 是一门编译型语言 是面向对象的 C 对语法的要求较高 且记忆量较大 但其运行速度较快 且编译过后是 exe的文件 可以直接运行 因此深受青睐 目录 前言 准备工作 C 源码文件
  • Chap3_数据预处理

    数据预处理 什么是数据预处理 数据分析算法的设计与选择需要考虑被处理数据的特征 数据质量过低或数据的形态不符合算法需求时 需要进行数据预处理工作 数据预处理是指对数据进行正式处理 计算 之前 根据后续数据计算的需求对原始数据集进行审计 清洗
  • 数据仓库建设及数据治理总结

    在谈数仓之前 先来看下面几个问题 数仓为什么要分层 用空间换时间 通过大量的预处理来提升应用系统的用户体验 效率 因此数据仓库会存在大量冗余的数据 不分层的话 如果源业务系统的业务规则发生变化将会影响整个数据清洗过程 工作量巨大 通过数据分
  • python使用 itchat结合图灵微信群机器人回复源码

    突然来了下兴致 又弄了个前几个月弄的微信群机器人 功能有好友之间的回复 群艾特后的回复 下面是源码 有更多的请看其他博文 coding utf 8 Time 2018 11 5 12 17 Author 蛇崽 Email 643435675
  • Qt::WindowFlags

    查了些资料 整理了一下 以备查询 枚举类型 Qt WindowFlags低位的一个字节用于定义窗口部件的窗口类型 Qt WindowFlags的高位字节定义了窗口提示 窗口提示能够进行位或操作 例如 Qt WindowContextHelp
  • K210学习篇(八)在MaixHub训练模型

    前言 本文着重于如何使用K210拍摄图片 并将图片上传到MaixHub平台进行模型训练 补充一下一些经验心得 比如一些训练参数的设置 在我们训练模型之前 我们需要获取一些数据集 其实也就是需要识别的物体图片 这里记得我们在获取数据集的时候
  • 获取shell返回值

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 使用command 二 使用function 总结 前言 shell获取返回值的方法有多种 这里介绍两种 第一种是直接执行command然后获取返回值 第
  • js歌词滚动效果

    目录 效果图展示 一 素材准备 1 歌词数据data js 借鉴了网上copy下来的歌词模板 2 图片准备 设置title效果 3 音频文件准备 二 html块 拓展 标签属性 三 设置scss样式 四 逻辑js块 拓展 使用到的audio