css 实现KTV 歌词效果

前言

ktv 屏幕歌词在唱歌过程中,字体颜色是逐渐高亮渐变的,怎么实现这个效果?不能用 CSS 镂空字体

看到后,就想着写个demo嘛!

111.gif

分析

  • 每一句歌词的时间
  • 当前一句歌词唱完的操作
  • 歌词唱完的操作

实现

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>ktv 歌词</title>
    <style>
      * {
        padding: 0;
        margin: 0;
      }
      :root {
        --length: 0%;
      }
      li {
        list-style: none;
      }
      html,
      body {
        width: 100%;
        height: 100%;
      }
      ul {
        text-align: center;
      }
      #line {
        position: fixed;
        bottom: 30px;
        font-size: 24px;
        left: 50%;
        transform: translate(-50%, 0);
        white-space: nowrap;
        color: transparent;
        background: linear-gradient(to right, #008c8c 0%, #e66465 0%, #9198e5);
        background-clip: text;
        -webkit-background-clip: text;
        animation: KTV 2s ease infinite;
      }
      @keyframes KTV {
        0% {
          background: linear-gradient(
            to right,
            #008c8c var(--length),
            #e66465 var(--length),
            #9198e5
          );
          background-clip: text;
          -webkit-background-clip: text;
        }
        100% {
          background: linear-gradient(
            to right,
            #008c8c var(--length),
            #e66465 var(--length),
            #9198e5
          );
          background-clip: text;
          -webkit-background-clip: text;
        }
      }
    </style>
  </head>
  <body>
    <span>
      <span id="line"></span>
      <ul>
        <li>有些话不知怎么对你讲</li>
        <li>是不是其实我们都一样</li>
        <li>就算是受了伤也要装得很坚强</li>
        <li>不会让泪水轻易流淌</li>
        <li>遇到了挫折也不要失望</li>
        <li>我们还有最初的梦想</li>
        <li>在心上在远方等着你和我去闯</li>
        <li>不要躲在这个角落里彷徨</li>
        <li>我知道黑夜不会太长</li>
        <li>有梦就有了希望</li>
        <li>把不该有的迷茫</li>
        <li>有梦就有了希望</li>
        <li>化作前进的力量</li>
        <li>任谁都无法阻挡</li>
        <li>一路闪耀着光芒</li>
        <li>在这残酷的战场</li>
        <li>是男人就挺起胸膛</li>
      </ul>

      <script>
        function randomNum(minNum, maxNum) {
          switch (arguments.length) {
            case 1:
              return parseInt(Math.random() * minNum + 1);
              break;
            case 2:
              return parseInt(Math.random() * (maxNum - minNum + 1) + minNum);
              break;
            default:
              return 0;
              break;
          }
        }
        const listDom = document.querySelectorAll("li");
        const line = document.querySelector("#line");
        let size = 0;
        let timer;
        let index = 0;
        let time = 1000;
        let timeout;
        function Ktv() {
          timeout = setTimeout(() => {
            time = randomNum(2, 6) * 1000;
            size = 0;
            if (index > listDom.length) {
              index = 0;
            }
            line.innerText = listDom[index].innerText;
            if (timer) {
              clearInterval(timer);
            }
            timer = setInterval(() => {
              document.documentElement.style.setProperty(
                "--length",
                size + "%"
              );
              size++;
            }, time / 100);
            index++;
            clearTimeout(timeout);
            Ktv();
          }, time);
        }
        Ktv();
      </script>
    </span>
  </body>
</html>

结语

这里仅仅是模拟!代码也不多,核心代码也就几行吧!这里也不考虑每个次的高音等问题,因为词的高低音等需要数据。这里仅仅在说实现原理!没事记录一下吧!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容