当前位置: 首页 > news >正文

vue实现歌词滚动效果

1.结构

<template><div class="lyricScroll"><div class="audio"><audio id="audio" src="./common/周传雄-青花1.mp3" controls></audio></div><div class="container" id="container"><ul id="ul"><li v-for="item in dataArr" :key="item.time">{{ item.word }}</li></ul></div></div>
</template>
<script>
import {data} from "./common/data";
export default {name: 'lyricScroll',data() {return {dataArr: [],doms: {}}},mounted(){this.parseLrc()this.getDoms()this.audioTimeUpdata()},methods:{/*** 获取dom*/getDoms(){this.doms['audio'] = document.getElementById("audio")this.doms['container'] = document.getElementById("container")this.doms['ul'] = document.getElementById("ul")},/*** 将字符串转为对象数组[{ time: 0, word: 'x' }]*/parseLrc(){let lines = data.split('\n');this.dataArr = lines.map(item => {return {time: this.parseTime(item.split(']')[0].split("[")[1]),word: item.split(']')[1]}})},/*** 将时间字符串转为数字(秒)* @param {String} timeStr 时间字符串* @param {Number} offset 设置时间偏移*/parseTime(timeStr, offset = 0.5){let parts = timeStr.split(":");return +parts[0] * 60 + +parts[1] - offset},/*** 计算出,在当前播放器播放到第几秒的情况下,应该高亮的歌词下标*/findIndex(){let curTime = this.doms.audio.currentTime;let nowIndex = this.dataArr.findIndex(item => {return item.time > curTime})return nowIndex != -1 ? nowIndex - 1 : this.dataArr.length - 1},/*** 设置ul的偏移量*/setOffset(){let { ul, container } = this.domslet liHieght = ul.children[0].clientHeightlet containerHeight = container.clientHeightlet ulHeight = ul.clientHeightlet index = this.findIndex();let oldLi = ul.querySelector('.active')if(oldLi){oldLi.classList.remove('active')}let offset = liHieght * index + liHieght / 2 - containerHeight / 2let resultOffset = offset < 0 ? 0 : (offset > ulHeight ? ulHeight : offset)ul.style.transform = `translateY(${-resultOffset}px)`ul.children[index].classList.add('active')},/*** 给audio监听时间轴改变事件*/audioTimeUpdata(){let { audio } = this.domsaudio.addEventListener('timeupdate', this.setOffset)}}
};
</script><style lang="less" scoped>
* {margin: 0;padding: 0;
}.lyricScroll {width: 100%;height: 100%;background: black;display: flex;flex-direction: column;align-content: center;.audio{audio{width: 400px;margin: 0 auto;display: block;}}.container {flex: 1;overflow: hidden;ul {transition: 0.6s;li {height: 50px;line-height: 50px;transition: 0.3s;text-align: center;font-size: 30px;&.active{color: #fff;font-size: 40px;}}}}
}</style>

2.效果

歌词滚动效果

http://www.lryc.cn/news/414203.html

相关文章:

  • 【算法设计题】合并两个非递减有序链表,第1题(C/C++)
  • Vue前端工程
  • 什么是药物临床试验?
  • 编译和汇编的区别
  • C# 设计倒计时器、串口助手开发
  • 图论① dfs | Java | LeetCode 797,Kama 98 邻接表实现(未完成)
  • Mac安装nvm以及配置环境变量
  • AUTOSAR实战教程-使用DET来发现开发错误
  • ZeroMQ(二):请求-响应模式,C和C++。
  • 【虚拟仿真】Unity3D中实现2DUI显示在3D物体旁边
  • 代码随想录 day 29 贪心
  • 开源:LLMCompiler高性能工具调用框架
  • 【学习方法】高效学习因素 ① ( 开始学习 | 高效学习因素五大因素 | 高效学习公式 - 学习效果 = 时间 x 注意力 x 精力 x 目标 x 策略 )
  • LeetCode Medium|【146. LRU 缓存】
  • (南京观海微电子)——LCD OTP(烧录)介绍
  • [E二叉树] lc572. 另一棵树的子树(dfs+前中序判断+树哈希+树上KMP+好题)
  • C# 设计模式之简单工厂模式
  • mac中dyld[5999]: Library not loaded: libssl.3.dylib解决方法
  • python 容器
  • 微信小程序中Component中如何监听属性变化
  • 【Python 逆向滑块】(实战五)逆向滑块,并实现用Python+Node.js 生成滑块、识别滑块、验证滑块、发送短信
  • 微服务架构设计的最佳实践
  • 样式与特效(3)——实现一个测算页面
  • 芯片制造过程4光刻机
  • Nexus3 Repository代理pypi设置与应用
  • PMP–知识卡片--燃起图
  • 63 epoll服务器 (ET模式)
  • AI Agent
  • select
  • 按照指定格式打印pprint()