马黑黑 发表于 2022-9-15 13:10

可爱的星星为什么最后一句歌词会跳舞

本帖最后由 马黑黑 于 2022-9-15 13:16 编辑

☞ 可爱的星星

在 audio 控件的监听事件上,我使用一个 for 循环语句,让audio的当前播放时间与歌词数组的时间信息做比较,依照比较结果实现同步显示歌词中的对应句。for语句如下:

      for(j=0; j<lrcAr.length; j++) {
                if(aud.currentTime >= lrcAr) {
                        if(lrcKey == j) lrc.innerHTML = showLrc(lrcAr);
                        else continue;
                }
      }


嵌套在里层的 if 语句,设计的条件是 lrcKey 变量如果与for循环的步进变量 j 相等,则调用 showLrc() 函数,否则(else)暂停循环、等待下一个循环。变量 lrcKey 是用来表示所播放的歌词数组序号,比如播放第一句,它的值为 0 ,第一句进入播放它的值加 1,当它加到大于等于歌词数组元素总量(lrcAr.length)时,该数值非法(因为超出了数组总量),所以必须令其变回 0,从头开始。lrcKey 的值的变化,在 showLrc(text) 函数中:

let showLrc = (text) => {
      let tstr = '';
      Array.from({length: text.length}).forEach((ele,key) => {
                if(text.substr(key,1).trim() != '') tstr += `<span class="lrcChar" style='top: ${ranNum(-10,10)}px; background: #${setColor()}; color: #${setColor()};'>${text.substr(key,1)}</span>`;
      });
      lrcKey += 1;
      if(lrcKey >= lrcAr.length) lrcKey = 0;
      return tstr;
}


最后一句歌词是 lrcAr.length - 1,即数值长度(数组成员总数)减去 1,因为数组下标从 0 开始。当变量 lrcKey 等于 lrcAr.length - 1 时,lrcKey 总是等于 for 循环到 j 等于 lrcAr.length - 1 之时的值,所以,嵌套里边的 if (如果)语句成立,所以每秒钟都调用 showLrc(text) 函数,所以该句歌词会跳舞,很漂亮的。

如果不需要最后一句歌词跳舞,成本最低的处理方法是给 lrcAr 数组在最后再加一个成员,该成员的数值为:

    ['240.00', '']

这里的 240.00 是歌曲总时长变为秒数,应根据自己的歌曲实际总时长进行换算。例如,一首歌播放总时长是 3分58秒,则换算成 3*60+58=238.00,这样构建最后一个数组元素就写成:

    ['230.00','']

完整结构的歌词数组则是:

let lrcAr = [
    ['00.00','花潮论坛好汉歌'],
    ['21.20','词|曲|演唱 - 马黑黑'],
    ['40.08','诶呦呦诶呦呦诶呦呦诶呦呦诶呦呦'],
    ['61.40','hoo hoo'],
    //其它歌词略
    ['200.17','ooh ooh ooh'], //这是最后一句歌词
    ['238.00',''] //这是根据歌曲时长加入的空歌词
];

红影 发表于 2022-9-15 14:50

嵌套的判断语句,对每一句都判断的呢,黑黑聪明,这个同步歌词设计得真漂亮{:4_187:}

红影 发表于 2022-9-15 14:53

呵呵,最后一句任嵌套内部的语句去折腾,也挺好玩,一直跳到音乐结束。
最后的结束时间通常都是省略的,看到黑黑的这个,省略和不省略效果完全不同呢{:4_204:}

红影 发表于 2022-9-15 14:55

    ['00.00','花潮论坛好汉歌'],
    ['21.20','词|曲|演唱 - 马黑黑'],
    ['40.08','诶呦呦诶呦呦诶呦呦诶呦呦诶呦呦'],

这个例子也举得太有趣了,作词作曲加演唱,黑黑厉害了,影子申请第一个聆听{:4_189:}

马黑黑 发表于 2022-9-15 18:15

红影 发表于 2022-9-15 14:55
['00.00','花潮论坛好汉歌'],
    ['21.20','词|曲|演唱 - 马黑黑'],
    ['40.08','诶呦呦诶呦呦诶 ...

这些都是高度机密

马黑黑 发表于 2022-9-15 18:16

红影 发表于 2022-9-15 14:53
呵呵,最后一句任嵌套内部的语句去折腾,也挺好玩,一直跳到音乐结束。
最后的结束时间通常都是省略的,看 ...

也可以将最后一句设计为其他的内容,如谢谢欣赏之类的话语

马黑黑 发表于 2022-9-15 18:16

红影 发表于 2022-9-15 14:50
嵌套的判断语句,对每一句都判断的呢,黑黑聪明,这个同步歌词设计得真漂亮

一般,过得去

梦缘 发表于 2022-9-15 20:41

感谢老师的好代码,欣赏学习中!{:4_204:}

马黑黑 发表于 2022-9-15 21:07

梦缘 发表于 2022-9-15 20:41
感谢老师的好代码,欣赏学习中!

{:4_191:}

红影 发表于 2022-9-15 21:35

马黑黑 发表于 2022-9-15 18:15
这些都是高度机密

赶紧高歌一首呗{:4_173:}

红影 发表于 2022-9-15 21:36

马黑黑 发表于 2022-9-15 18:16
也可以将最后一句设计为其他的内容,如谢谢欣赏之类的话语

反正只要把那时间占用掉就行了呗。

红影 发表于 2022-9-15 21:36

马黑黑 发表于 2022-9-15 18:16
一般,过得去

很奇特的效果{:4_187:}

马黑黑 发表于 2022-9-15 21:43

红影 发表于 2022-9-15 21:36
很奇特的效果

问题也会存在,将来慢慢去修复

马黑黑 发表于 2022-9-15 21:44

红影 发表于 2022-9-15 21:36
反正只要把那时间占用掉就行了呗。

是这个道理

马黑黑 发表于 2022-9-15 21:44

红影 发表于 2022-9-15 21:35
赶紧高歌一首呗

低调低调

红影 发表于 2022-9-15 22:06

马黑黑 发表于 2022-9-15 21:43
问题也会存在,将来慢慢去修复

能做出来就很厉害啊,黑黑真棒{:4_187:}

红影 发表于 2022-9-15 22:09

马黑黑 发表于 2022-9-15 21:44
是这个道理

今天我得早点下了,感冒了。黑黑晚安{:4_204:}

红影 发表于 2022-9-15 22:10

马黑黑 发表于 2022-9-15 21:44
低调低调

知道你唱了自己作词作曲的歌曲,却没听到,多难受{:4_173:}

马黑黑 发表于 2022-9-15 22:25

红影 发表于 2022-9-15 22:10
知道你唱了自己作词作曲的歌曲,却没听到,多难受

那也木有办法,谁叫俺不想出名呢

马黑黑 发表于 2022-9-15 22:25

红影 发表于 2022-9-15 22:09
今天我得早点下了,感冒了。黑黑晚安

晚安,好好休息
页: [1] 2 3
查看完整版本: 可爱的星星为什么最后一句歌词会跳舞