html网页页面制作滚动歌词

大家可能有时候可能会用到歌词同步,歌词滚动,大致的歌词滚动效果就是这样的,具体实现的方法需要JS/jQuery+CSS+H5的方式,具体代码如下。

首先你需要有一个lrc的歌词,大致格式是

别的不多说,直接上代码👇

歌词打印在界面上的代码是:

<!--歌词显示部分H5代码-->

        <div class="lyrics">

            <ul class="lyricsList" style="color:#86ff85;"></ul><!--#b1d4f3-->

        </div>

Js代码部分

var lrcArray = [];//新建数组,用于存放歌词
function(lrcPath)  {                    
        var lrctxt = lrcPath;//你的lrc歌词地址
                        lrcArray = [];//情感歌词数组
                        // 清空现有歌词列表
                        $('.lyricsList').empty();
                        var lrcGet = lrctxt;//提取歌词
                        if (lrcGet == "") {
                            $('.lyricsList').empty();
                        }
                        var lrc = lrcGet.split('\n');
                        $.each(lrc, function (i, item) {
                            //转化时间
                            var timeStr = item.substring(item.indexOf("[") + 1, item.indexOf("]"));
                            var min = parseInt(timeStr.split(':')[0]) * 60;
                            // 检查分钟和秒是否为数字
                            if (isNaN(min)) {
                                // 如果分钟或秒不是有效的数字,跳过这个项
                                return true;
                            }
                            var sec = parseFloat(timeStr.split(':')[1]);
                            var time = parseFloat((min + sec).toFixed(2));
                            var content = "";
                            var text = item.substring(item.indexOf(']') + 1);
                            if (text === "" || text === null || text === undefined) {
                                content = "------";
                            } else {
                                content = text;
                            }
                            //添加进数组
                            lrcArray.push({
                                t: time,
                                c: content
                            });
                        });
                        //显示歌词打印全部在页面
                        var html = "";
                        $.each(lrcArray, function (i, v) {
                            html += '<li>' + v.c + '</li>';
                        });
                        $('.lyricsList').append(html);
}

歌词样式部分:

.lyrics {
            float: right;
            width: 48%;
            /* height: 90%; */
            height: 75vh;
            margin-top: 50px;
            padding-top: 8px;
            overflow: hidden;
        }

        .lyrics .lyricsList {
            margin: 0;
            padding: 0;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
        }

        .lyrics .lyricsList li {
            height: 30px;
            line-height: 15px;
            list-style: none;
            font-size: 18px;
            transition: font-size 0.3s ease;
            /* 字体大小变化的过渡效果 */
        }

        /* 歌词高亮 */
        .highlight {
            color: #FF4500;
            font-weight: bold;
            text-shadow: 0 0 10px #ded1fc;
            font-size: 2em !important;
        }

歌词样式和歌词的显示也都完成了,解决改解决歌词同步歌曲进度的问题了,因为每行歌词都有对应的歌曲进度时间,所以我们可以根据歌词所在行的时间和audio控件的监听时间进度时间来控制歌词的实时滚动和同步。废话不多说,直接上代码。

 <audio id="bottomSpinner" controls autoplay="autoplay">
                <source src="" type="audio/mpeg">
                你的浏览器不支持
</audio>
  //同步歌词
            $('#bottomSpinner').on('timeupdate', function () {
                var currentTime = $('#bottomSpinner')[0].currentTime; // 获取当前播放时间
                $.each(lrcArray, function (i, v) {
                    if (currentTime >= lrcArray[i].t) {
                        $('.lyricsList').css('margin-top', '');// 避免进度变动时数值产生混乱
                        $('.lyricsList li').eq(i).addClass('highlight');
                        $('.lyricsList li').eq(i).siblings().removeClass('highlight');
                        if (i > 10) {
                            $('.lyricsList').css('margin-top', (-i + 10) * 30 + 'px');
                        }
                    }
                });
            });

  //歌词滚动
            $('#bottomSpinner').on('timeupdate', function () {
                var currentTime = this.currentTime;
                var index = findLyricIndex(currentTime);
                // 使用 requestAnimationFrame 来优化滚动性能
                requestAnimationFrame(function () {
                    highlightLyric(index);
                    scrollLyricList(index);
                });
            });

function findLyricIndex(currentTime) {
                var lyricsData = lrcArray;
                // 初始化索引为0,如果音频在开始或之前,则返回第一句歌词
                var closestIndex = 0;

                // 遍历歌词数据,寻找最接近但不超过当前播放时间的歌词
                for (var i = 0; i < lyricsData.length; i++) {
                    if (lyricsData[i].t > currentTime) {
                        break; // 找到了第一个大于currentTime的时间戳,因此前一个就是我们要找的
                    }
                    closestIndex = i;
                }

                return closestIndex;
            }

//当前歌词高亮
function highlightLyric(index) {
                $('.lyricsList li').removeClass('highlight');
                $('.lyricsList li').eq(index).addClass('highlight');
            }

            function scrollLyricList(index) {
                var lyricsList = document.querySelector('.lyricsList');
                var lyricItemHeight = 30; // 假设每个歌词项的高度是30px
                if (index > 8) {
                    lyricsList.scrollTop = (index - 8) * lyricItemHeight;
                }
            }

上述代码的命名不是很规范,是一个Demo,大家在使用的时候记得要规范命名方式,“bottomSpinner”就是audio播放器的id,不要误会了大家。大致的实现方法就在上面了,最后放一个完整的代码。

<!DOCTYPE html>

<html lang="en">
<head>
 <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>歌词滚动显示</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
 <style>
   .lyrics {
            float: right;
            width: 48%;
            /* height: 90%; */
            height: 75vh;
            margin-top: 50px;
            padding-top: 8px;
            overflow: hidden;
        }

        .lyrics .lyricsList {
            margin: 0;
            padding: 0;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
        }

        .lyrics .lyricsList li {
            height: 30px;
            line-height: 15px;
            list-style: none;
            font-size: 18px;
            transition: font-size 0.3s ease;
            /* 字体大小变化的过渡效果 */
        }

        /* 歌词高亮 */
        .highlight {
            color: #FF4500;
            font-weight: bold;
            text-shadow: 0 0 10px #ded1fc;
            font-size: 2em !important;
        }
  </style>
  <script>
    $(function () {

 var lrcArray = [];//新建数组,用于存放歌词
function(lrcPath){
 var lrctxt = lrcPath;//你的歌词路径
                        lrcArray = [];//清空歌词数组
                        // 清空现有歌词列表
                        $('.lyricsList').empty();
                        var lrcGet = lrctxt;//提取歌词
                        if (lrcGet == "") {
                            $('.lyricsList').empty();
                        }
                        var lrc = lrcGet.split('\n');
                        $.each(lrc, function (i, item) {
                            //转化时间
                            var timeStr = item.substring(item.indexOf("[") + 1, item.indexOf("]"));
                            var min = parseInt(timeStr.split(':')[0]) * 60;
                            // 检查分钟和秒是否为数字
                            if (isNaN(min)) {
                                // 如果分钟或秒不是有效的数字,跳过这个项
                                return true;
                            }
                            var sec = parseFloat(timeStr.split(':')[1]);
                            var time = parseFloat((min + sec).toFixed(2));
                            var content = "";
                            var text = item.substring(item.indexOf(']') + 1);
                            if (text === "" || text === null || text === undefined) {
                                content = "------";
                            } else {
                                content = text;
                            }
                            //添加进数组
                            lrcArray.push({
                                t: time,
                                c: content
                            });
                        });
                        //显示歌词打印全部在页面
                        var html = "";
                        $.each(lrcArray, function (i, v) {
                            html += '<li>' + v.c + '</li>';
                        });
                        $('.lyricsList').append(html);

}

//同步歌词
            $('#bottomSpinner').on('timeupdate', function () {
                var currentTime = $('#bottomSpinner')[0].currentTime; // 获取当前播放时间
                $.each(lrcArray, function (i, v) {
                    if (currentTime >= lrcArray[i].t) {
                        $('.lyricsList').css('margin-top', '');// 避免进度变动时数值产生混乱
                        $('.lyricsList li').eq(i).addClass('highlight');
                        $('.lyricsList li').eq(i).siblings().removeClass('highlight');
                        if (i > 10) {
                            $('.lyricsList').css('margin-top', (-i + 10) * 30 + 'px');
                        }
                    }
                });
            });

            //歌词滚动
            $('#bottomSpinner').on('timeupdate', function () {
                var currentTime = this.currentTime;
                var index = findLyricIndex(currentTime);
                // 使用 requestAnimationFrame 来优化滚动性能
                requestAnimationFrame(function () {
                    highlightLyric(index);
                    scrollLyricList(index);
                });
            });

            function findLyricIndex(currentTime) {
                var lyricsData = lrcArray;
                // 初始化索引为0,如果音频在开始或之前,则返回第一句歌词
                var closestIndex = 0;

                // 遍历歌词数据,寻找最接近但不超过当前播放时间的歌词
                for (var i = 0; i < lyricsData.length; i++) {
                    if (lyricsData[i].t > currentTime) {
                        break; // 找到了第一个大于currentTime的时间戳,因此前一个就是我们要找的
                    }
                    closestIndex = i;
                }

                return closestIndex;
            }

 function highlightLyric(index) {
                $('.lyricsList li').removeClass('highlight');
                $('.lyricsList li').eq(index).addClass('highlight');
            }

            function scrollLyricList(index) {
                var lyricsList = document.querySelector('.lyricsList');
                var lyricItemHeight = 30; // 假设每个歌词项的高度是30px
                if (index > 8) {
                    lyricsList.scrollTop = (index - 8) * lyricItemHeight;
                }
            }

});

    </script>
</head>
<body>
 <!--歌词显示部分-->
        <div class="lyrics">
            <ul class="lyricsList" style="color:#86ff85;"></ul><!--#b1d4f3-->
        </div>
<!--播放器部分-->
<audio id="bottomSpinner" controls autoplay="autoplay">
                <source src="" type="audio/mpeg">
                Your browser does not support the audio element.
            </audio>
</body>

</html>

歌词显示的宽度高度的大家根据自己的需要去调整,以上就是歌词滚动的全部代码了,大家也可以在评论区讨论。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
制作一个可以滚动HTML 页面,可以使用 `<div>` 标签来创建一个容器,并在其中添加内容。然后,将该容器的样式设置为具有固定高度和 `overflow: scroll` 属性,以便在内容超出容器高度时出现滚动条。 以下是一个简单的示例: ```html <!DOCTYPE html> <html> <head> <title>Scrollable Page</title> <style> .container { height: 300px; overflow: scroll; } </style> </head> <body> <div class="container"> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod metus ut felis dignissim, et tristique enim porta. Praesent vel nibh a massa vestibulum facilisis. Sed posuere eros nec nisi suscipit, ac malesuada felis cursus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Quisque ac mi elit. Nullam vitae mi eget magna luctus sagittis. Donec vehicula tellus quis felis laoreet, ut consequat quam tincidunt. Nam quis nunc auctor, bibendum lectus at, ullamcorper nulla. Curabitur vel ex tincidunt, hendrerit purus sed, tincidunt orci. Ut scelerisque commodo sapien, eu congue est volutpat sed. Vestibulum eget odio ligula. </p> <p>Integer nec ipsum vel mauris consectetur molestie. Etiam auctor augue non quam ullamcorper, a porttitor nunc efficitur. Sed eu ligula vitae lectus commodo efficitur. Quisque in venenatis massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed vel quam eget tellus finibus ullamcorper. Sed mollis, nisl eget aliquet fermentum, sem arcu tincidunt augue, vel bibendum nulla sapien id velit. Duis viverra metus ut enim convallis, nec scelerisque mi porttitor. Nulla facilisi. </p> <p>Phasellus at neque quis turpis auctor egestas. Ut et augue sem. Vestibulum vel rutrum risus. Sed euismod elit sed pellentesque volutpat. Donec et elit auctor, facilisis ipsum eu, ullamcorper mi. Sed commodo, dolor et luctus bibendum, mauris turpis euismod turpis, at varius mi est vel metus. Praesent feugiat id felis non consequat. Suspendisse euismod, urna sit amet pretium bibendum, risus augue commodo lectus, ac volutpat elit metus vel urna. </p> <p>Nam in libero euismod, bibendum nibh ut, faucibus sem. Aliquam erat volutpat. Sed vitae nulla quam. Ut vel leo vitae purus hendrerit interdum. Integer id diam ac sapien aliquet sodales. Donec placerat ligula purus, ut rhoncus massa sollicitudin ut. Donec euismod, nisl quis vehicula lacinia, metus tellus vehicula lacus, sed maximus dolor nisl vel odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam vitae vulputate felis. </p> <p>Etiam hendrerit, felis quis venenatis commodo, enim lacus pretium quam, id cursus sem purus non ante. In rhoncus elit eu placerat feugiat. Nulla facilisi. Nulla facilisi. Sed euismod, velit non blandit malesuada, magna mauris suscipit nibh, sit amet ultrices turpis velit non lectus. Nunc eget felis sed est ultrices aliquam. Duis ac justo massa. </p> </div> </body> </html> ``` 在这个例子中,我们使用 `<div>` 标签创建了一个名为 `container` 的容器,并将其样式设置为具有 `height: 300px` 和 `overflow: scroll` 属性,以便在内容超出容器高度时出现滚动条。在容器中添加了一些段落作为示例内容。 可以根据需要更改容器的高度和样式,以实现所需的滚动效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李云龙520

求支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值