Html实现歌曲歌词同步_html歌词和歌曲同步网页_鱻i的博客-程序员秘密

技术标签: HTML5  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>歌词同步</title>
    <style>
        body {
            background:url("Img/起风了.jpg") center no-repeat ;
            background-size:60% 100%;
        }
        * {
            margin:0 auto;
            padding:0;
        }
        .play {
            color: #01e5ff;
            font-size: 24px;
        }

        .overPlay {
            font-size: inherit;
            color: #fff;
        }

        #div_lrc {
            position: absolute;
            padding-top: 0px;
            left: 28%;
            top: 300px;
            width:50%;
            transition: top .5s;
            margin: 0 auto;
            
        }

        .div_DisLrc {
            overflow: hidden;
            color:#b1abab;
            width: 70%;
            height: 600px;  
            position: relative;
            margin: 0 auto;
            
        }

        #audio {
            width: 100%;
        }

        .div_audio {
            width: 50%;
            margin: 0 auto;
        }

        .div_but {
            position: absolute;
            font-size: 26px;
            font-weight: 900;
            top: 40%;
            right: 0%;
        }

            .div_but p {
                cursor: pointer;
            }
    </style>
    <link href="CSS/iconfont.css" rel="stylesheet" />
</head>



<body>
    <div id="div_1" style="display: none;">
    </div>
    <!-- 歌词显示界面 -->
    <div class="div_DisLrc">
        <div id="div_lrc">
            <p id="lrc_row1"></p>
        </div>
        <!-- 用于调整歌词位置 -->
        <div class="div_but">
            <p οnmοusedοwn="time = setInterval(btn_down,0)" οnmοuseup="clearInterval

(time)"><i class="iconfont icon-top"></i></p>
            <p οnmοusedοwn="time = setInterval(btn_top,0)" οnmοuseup="clearInterval

(time)"><i class="iconfont icon-down"></i></p>
        </div>
    </div>
    <!-- 播放器控件 -->
    <div class="div_audio">
        <audio id="audio" controls="controls" autoplay="autoplay">
            <source src="audio/起风了.mp3" type="audio/mpeg">
        </audio>
    </div>



    <script src="JavaScript/jquery-3.3.1.js"></script>
    <script>
        var audio = document.getElementById("audio");
        var play = $("#lrc_row1");
        //将歌词添加到div中
        $(document).ready(function () {
            //加载歌词
            $('#div_1').load("LRC/qifengle.lrc");
            //获取所有歌词
            setTimeout(function () {
                var lrcArr = $("#div_1").text().split('\n');
                for (var i = 4; i < lrcArr.length; i++) {
                    var p = document.createElement("p");
                    //空白歌词不进行加载
                    if (lrcArr[i].substring(10) != "") {
                        p.innerText = lrcArr[i].substring(10);
                        $("#div_lrc").append(p);
                    }
                }
            }, 200)
        })

        function lrcDisplay() {
            //获取播放进度(转换的格式为: 00:00)
            var minute = parseInt(audio.currentTime / 60);//分钟
            minute = minute == 0 ? "00" : (minute + "").length < 2 ? "0" + minute : minute;
            //获取秒数
            var second = (parseInt(audio.currentTime)) % 60;
            second = second == 0 ? "00" : (second + "").length < 2 ? "0" + second : second;
            //正则表达匹配歌词
            var regex = new RegExp('\\[' + (minute + ":" + second) + '.+\\].+\n');
            var text = regex.exec($("#div_1").text());
            if (text != null) {
                var str1 = new String($(play).next().text());
                var str2 = new String(text[0].substring(10));
                if (str1.trim() == str2.trim()) {
                    //歌词颜色变色
                    $(play).attr("class", "overPlay");
                    play = $(play).next();
                    $(play).attr("class", "play");
                    //歌词滚动(自动)
                    var top = parseInt($("#div_lrc").css("top"));
                    $("#div_lrc").css("top", -1 * ((-1 * top) + 22) + "px");
                }
            }
        }
        setInterval(lrcDisplay, 500);
        //歌词滚动(手动)
        var time = null;
        function btn_top() {
            var top = parseInt($("#div_lrc").css("top"));
            $("#div_lrc").css("top", -1 * ((-1 * top) + 100) + "px");
        }
        function btn_down() {
            var top = parseInt($("#div_lrc").css("top"));
            if (top <= 0)
                $("#div_lrc").css("top", -1 * ((-1 * top) - 100) + "px");
        }

        //调整歌词位置的函数
        function btn_top() {
            var top = parseInt($("#div_lrc").css("top"));
            $("#div_lrc").css("top", -1 * ((-1 * top) + 30) + "px");
        }
        /*
            1.歌词文件不能是默认编码(记事本文件和lrc文件默认为ANSI编码) 只需要改为 UTF-8或

者GB2312,否则乱码
            2.歌曲因为没有算毫秒差距,可能出现细微误差
            3.因为网页同源策略的原因,外部直接打开html文件只能用firefox访问,
               不能进行跨域访问,如果不使用文件读取可以在任意地方打开.
            4.因为ajax识别原因,会把空格当做分割内容,即歌词文件名不能有空格
            5.因为js对文件操作以及ajax请求存在诸多默认限制,若以类似方法在winfrom asp等中很

多问题都会得到解决.
            6.setTimeout()和setInterval(),在浏览器窗口非激活的状态下会停止工作或者以极慢的

速度工作。目前我已知就IE不会有这种问题。
        */
    </script>
</body>
</html>

实例下载链接:https://download.csdn.net/download/a1455990364/10386136

有详细的注释

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a1455990364/article/details/80162795

智能推荐

idea中引入maven坐标无效解决_idea中导入坐标刷新没有用_收藏文章用的博客-程序员秘密

我maven projects已经存在要引入的坐标了本地仓库也下载好了坐标就是无效,特征就是Ctrl+左键点不进去maven reimport没用重导入坐标没用本地库jar包删了没用快一天了结果原因今天公司wifi出了些问题,虽然后面解决了但是idea有缓存,idea  file-invalid cached/retarted好了。。。。。...

树莓派 Retropie 4.4中文版使用说明 含roms资源_retropie界面设置中文_joyist的博客-程序员秘密

漫步云端服务器 http://chdong.top/bbs/ http://www.chdong.top/相关名词RetropieRetropie可以将你的树莓派或者PC变成一台复古游戏机。 Retropie基于完整的操作系统之上,你可以把它装在Raspbian系统上,或者直接刷入完整的镜像然后再添加更多的软件。模拟器一种能使电脑运行其他平台软件的软件。Retropie...

nginx img 403 forbidden问题的解决_Dreamy_wit的博客-程序员秘密

一、问题背景 今天在nginx 服务器上调试代码,发现报了一个图片无法显示的403 错误,如图:二、解决思路 可能是因为logo.png 这张图片的“文件操作权限“被设置成“不可读“。 1,打开终端 2,进入图片路径:cd /usr/local/nginx/html/flyblog/img 3, 显示文件夹内的详细信息: ls -l 证实发现该图片的文件操作权限缺少 r:-rw-r--

h5下划线怎么设置_怎么给文加下划线?_陈贵祥的博客-程序员秘密

怎么给文本加下划线?下面本篇文章就给大家介绍一下HTML页面和word文档中给文本加下划线的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。HTML页面中给文本添加下划线在HTML页面中怎么给文本添加下划线?给文本加下划线样式,有两种方法,一种是直接使用html下划线标签,另外一种是使用CSS下划线样式。方法1:使用HTML 标签添加下划线在HTML中可以使用标签定义下划线文...

Everyday-FE-Articles 8~11月前端文章日推 [持续更新]_weixin_33932129的博客-程序员秘密

Everyday-FE-Articles由来自@阿里马跃的每日文章推荐,于是顺手整理,以便学习... -- By Ale-cc/* 注:序号不准确 */八月份8月7日 星期二,农历六月廿六Scriptswitch: Conditional Script Loading Manager for Browsersgithub.com/anywhichway…三十分钟掌握Webp...

使用AsyncHttpClient获取Session 问题汇总_weixin_34342578的博客-程序员秘密

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

随便推点

Java基础面试题_RyanDYJ的博客-程序员秘密

1. Java 基础部分基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法。1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?可以有多个类,但只能有一个 public 的类,并且 public 的类名必须与文件名相一致。2、Java 有没有 goto?java 中

【ARM 汇编基础速成7】ARM汇编之栈与函数_arm汇编实现函数_lin___的博客-程序员秘密

原文地址:https://www.jianshu.com/p/f3f771f8f65b原文链接https://azeria-labs.com/functions-and-the-stack-part-7/在这部分我们将研究一篇独特的内存区域叫做栈,讲解栈的目的以及相关操作。除此之外,我们还会研究ARM架构中函数的调用约定。栈一般来说,栈是一片在程序/进程中的内存区域。这...

cesium中级(一)使用渐变纹理_cesium 渐变纹理_前端-小姚的博客-程序员秘密

官网实例在渲染地形的时候,我们会使用渐变的纹理,来表示不同的地形高度,官网给出的实例为:Globe Materialvar viewer = new Cesium.Viewer('cesiumContainer', { //2.本地图片 imageryProvider: new Cesium.SingleTileImageryPr...

在Windows系统下,Nginx反向代理缓存配置_windows下nginx清理缓存_青菜萝卜秧的博客-程序员秘密

1.实施准备工作在Windows系统下,Nginx的代理缓存配置,与在Linux系统下的配置大同小异。注意:对缓存文件的清理实施环境:系统:Windows 2012nginx版本:nginx-1.18.02.缓存配置的需求个人理解,对Nginx的代理缓存配置的需求如下:配置了反向代理后,对数据访问和获取,因代理区域的限制,需要浏览器...

【剑指Offer】59. Python实现按之字形顺序打印二叉树_python实现无线二叉树之字排列树节点逐行依次按之字形进行标记_NLP小姐姐的博客-程序员秘密

知识点:栈、树题目描述:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路:利用辅助函数计算出该二叉树的层数,再将偶数层的列表顺序反转。详解:方法:(递归法)# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None.

推荐文章

热门文章

相关标签