当前位置: 首页 > 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.效果

歌词滚动效果

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • HOW - 计时器实践和注意事项
  • RFID固定资产管理系统:提升企业资产管理效率的新利器
  • mybatisplus布隆过滤器解决缓存穿透
  • <数据集>棉花识别数据集<目标检测>
  • FPGA:我的零基础学习路线(2022秋招已上岸)持续更新中~
  • asp.net mvc 三层架构开发商城系统需要前台页面代完善
  • 3千米以上音视频键鼠延长解决方案:KVM光纤延长器
  • 什么是Java并发中的锁池?
  • Redis学习[5] ——Redis过期删除和内存淘汰
  • 使用 ModelScope 本地部署图片变视频模型
  • 深入理解Java注解
  • [网鼎杯 2020 青龙组]AreUSerialz1
  • vue后台管理系统 vue3+vite+pinia+elementui+axios下
  • 接口测试框架中测试用例管理模块的优化与思考!
  • 理解ThreadLocal 变量副本,为什么不同线程的 ThreadLocalMap互不干扰
  • SegmentFault for Android 3.0 发布
  • CSS实用技巧干货
  • EOS是什么
  • exports和module.exports
  • iOS 颜色设置看我就够了
  • Java多态
  • leetcode386. Lexicographical Numbers
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • SQLServer之创建显式事务
  • use Google search engine
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 订阅Forge Viewer所有的事件
  • 动态魔术使用DBMS_SQL
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 普通函数和构造函数的区别
  • 什么是Javascript函数节流?
  • 手机端车牌号码键盘的vue组件
  • 一文看透浏览器架构
  • 在Mac OS X上安装 Ruby运行环境
  • 1.Ext JS 建立web开发工程
  • puppet连载22:define用法
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • #数据结构 笔记三
  • (20)docke容器
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (八)Spring源码解析:Spring MVC
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (九)信息融合方式简介
  • (三) diretfbrc详解
  • (四)鸿鹄云架构一服务注册中心
  • (一)、python程序--模拟电脑鼠走迷宫
  • (杂交版)植物大战僵尸
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Mysql的优化设置
  • (轉貼) UML中文FAQ (OO) (UML)
  • .Net Core与存储过程(一)
  • .NET 中的轻量级线程安全