Skip to content
html
<!-- 翻转效果 -->
<!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>Document</title>
  </head>
  <body>
    <div class="wrap" id="wrap">
      <div class="list">
        <div class="item">
          <svg>
            <circle class="circle" cx="42" cy="40" r="34" transform="rotate(-90 80 80)"></circle>
          </svg>
          <text x="80" y="85" fill="#6b778c" text-anchor="middle" class="text-content">
            <tspan class="text">0</tspan><tspan class="percent">%</tspan>
          </text>
          <audio data-play="false" id="audio" src="./test.m4a"></audio>
          <div id="action" class="audio-status"></div>
        </div>
        <div class="item">
          <svg>
            <circle class="circle" cx="42" cy="40" r="34" transform="rotate(-90 80 80)"></circle>
          </svg>
          <text x="80" y="85" fill="#6b778c" text-anchor="middle" class="text-content">
            <tspan class="text">0</tspan><tspan class="percent">%</tspan>
          </text>
          <audio data-play="false" id="audio" src="./test.m4a"></audio>
          <div id="action" class="audio-status"></div>
        </div>
        <div class="item">
          <svg>
            <circle class="circle" cx="42" cy="40" r="34" transform="rotate(-90 80 80)"></circle>
          </svg>
          <text x="80" y="85" fill="#6b778c" text-anchor="middle" class="text-content">
            <tspan class="text">0</tspan><tspan class="percent">%</tspan>
          </text>
          <audio data-play="false" id="audio" src="./test.m4a"></audio>
          <div id="action" class="audio-status"></div>
        </div>
        <div class="item">
          <svg>
            <circle class="circle" cx="42" cy="40" r="34" transform="rotate(-90 80 80)"></circle>
          </svg>
          <text x="80" y="85" fill="#6b778c" text-anchor="middle" class="text-content">
            <tspan class="text">0</tspan><tspan class="percent">%</tspan>
          </text>
          <audio data-play="false" id="audio" src="./test.m4a"></audio>
          <div id="action" class="audio-status"></div>
        </div>
        <div class="item">
          <svg>
            <circle class="circle" cx="42" cy="40" r="34" transform="rotate(-90 80 80)"></circle>
          </svg>
          <text x="80" y="85" fill="#6b778c" text-anchor="middle" class="text-content">
            <tspan class="text">0</tspan><tspan class="percent">%</tspan>
          </text>
          <audio data-play="false" id="audio" src="./test.m4a"></audio>
          <div id="action" class="audio-status"></div>
        </div>
        <div class="item">
          <svg>
            <circle class="circle" cx="42" cy="40" r="34" transform="rotate(-90 80 80)"></circle>
          </svg>
          <text x="80" y="85" fill="#6b778c" text-anchor="middle" class="text-content">
            <tspan class="text">0</tspan><tspan class="percent">%</tspan>
          </text>
          <audio data-play="false" id="audio" src="./test.m4a"></audio>
          <div id="action" class="audio-status"></div>
        </div>
        <div class="item">
          <svg>
            <circle class="circle" cx="42" cy="40" r="34" transform="rotate(-90 80 80)"></circle>
          </svg>
          <text x="80" y="85" fill="#6b778c" text-anchor="middle" class="text-content">
            <tspan class="text">0</tspan><tspan class="percent">%</tspan>
          </text>
          <audio data-play="false" id="audio" src="./test.m4a"></audio>
          <div id="action" class="audio-status"></div>
        </div>
        <div class="item">
          <svg>
            <circle class="circle" cx="42" cy="40" r="34" transform="rotate(-90 80 80)"></circle>
          </svg>
          <text x="80" y="85" fill="#6b778c" text-anchor="middle" class="text-content">
            <tspan class="text">0</tspan><tspan class="percent">%</tspan>
          </text>
          <audio data-play="false" id="audio" src="./test.m4a"></audio>
          <div id="action" class="audio-status"></div>
        </div>
      </div>
      <div class="back-list">
        <div class="back-item">
          <svg>
            <circle class="circle" cx="42" cy="40" r="34" transform="rotate(-90 80 80)"></circle>
          </svg>
          <text x="80" y="85" fill="#6b778c" text-anchor="middle" class="text-content">
            <tspan class="text">0</tspan><tspan class="percent">%</tspan>
          </text>
          <audio data-play="false" id="audio" src="./test.m4a"></audio>
          <div id="action" class="audio-status"></div>
        </div>
        <div class="back-item">
          <svg>
            <circle class="circle" cx="42" cy="40" r="34" transform="rotate(-90 80 80)"></circle>
          </svg>
          <text x="80" y="85" fill="#6b778c" text-anchor="middle" class="text-content">
            <tspan class="text">0</tspan><tspan class="percent">%</tspan>
          </text>
          <audio data-play="false" id="audio" src="./test.m4a"></audio>
          <div id="action" class="audio-status"></div>
        </div>
        <div class="back-item">
          <svg>
            <circle class="circle" cx="42" cy="40" r="34" transform="rotate(-90 80 80)"></circle>
          </svg>
          <text x="80" y="85" fill="#6b778c" text-anchor="middle" class="text-content">
            <tspan class="text">0</tspan><tspan class="percent">%</tspan>
          </text>
          <audio data-play="false" id="audio" src="./test.m4a"></audio>
          <div id="action" class="audio-status"></div>
        </div>
        <div class="back-item">
          <svg>
            <circle class="circle" cx="42" cy="40" r="34" transform="rotate(-90 80 80)"></circle>
          </svg>
          <text x="80" y="85" fill="#6b778c" text-anchor="middle" class="text-content">
            <tspan class="text">0</tspan><tspan class="percent">%</tspan>
          </text>
          <audio data-play="false" id="audio" src="./test.m4a"></audio>
          <div id="action" class="audio-status"></div>
        </div>
        <div class="back-item">
          <svg>
            <circle class="circle" cx="42" cy="40" r="34" transform="rotate(-90 80 80)"></circle>
          </svg>
          <text x="80" y="85" fill="#6b778c" text-anchor="middle" class="text-content">
            <tspan class="text">0</tspan><tspan class="percent">%</tspan>
          </text>
          <audio data-play="false" id="audio" src="./test.m4a"></audio>
          <div id="action" class="audio-status"></div>
        </div>
        <div class="back-item">
          <svg>
            <circle class="circle" cx="42" cy="40" r="34" transform="rotate(-90 80 80)"></circle>
          </svg>
          <text x="80" y="85" fill="#6b778c" text-anchor="middle" class="text-content">
            <tspan class="text">0</tspan><tspan class="percent">%</tspan>
          </text>
          <audio data-play="false" id="audio" src="./test.m4a"></audio>
          <div id="action" class="audio-status"></div>
        </div>
        <div class="back-item">
          <svg>
            <circle class="circle" cx="42" cy="40" r="34" transform="rotate(-90 80 80)"></circle>
          </svg>
          <text x="80" y="85" fill="#6b778c" text-anchor="middle" class="text-content">
            <tspan class="text">0</tspan><tspan class="percent">%</tspan>
          </text>
          <audio data-play="false" id="audio" src="./test.m4a"></audio>
          <div id="action" class="audio-status"></div>
        </div>
        <div class="back-item">
          <svg>
            <circle class="circle" cx="42" cy="40" r="34" transform="rotate(-90 80 80)"></circle>
          </svg>
          <text x="80" y="85" fill="#6b778c" text-anchor="middle" class="text-content">
            <tspan class="text">0</tspan><tspan class="percent">%</tspan>
          </text>
          <audio data-play="false" id="audio" src="./test.m4a"></audio>
          <div id="action" class="audio-status"></div>
        </div>
      </div>
    </div>
    <button id="filp">翻转效果</button>
  </body>
  <style>
    body {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
    .wrap {
      width: 100%;
      height: 764px;
      transform-style: preserve-3d;
      transition: 1s;
    }
    .list {
      width: calc(100% - 40px);
      padding: 8px 20px 8px;
      background-color: #ffb6b9;
      position: absolute;
      left: 0;
      top: 0;
      backface-visibility: hidden;
    }
    .item {
      width: 100%;
      height: 80px;
      margin: 12px 0;
      background-color: #fae3d9;
      position: relative;
    }
    .back-list {
      width: calc(100% - 40px);
      padding: 8px 20px 8px;
      background-color: #8ac6d1;
      position: absolute;
      left: 0;
      top: 0;
      transform: rotateX(180deg);
      backface-visibility: hidden;
    }
    .back-item {
      width: 100%;
      height: 80px;
      margin: 12px 0;
      background-color: #bbded6;
      position: relative;
    }
    button {
      background-color: #409eff;
      color: #fff;
      width: calc(100% - 40px);
      border: none;
      height: 64px;
      width: 100%;
      position: absolute;
      bottom: 0;
    }
    .circle {
      fill: none;
      stroke: #f26b1f;
      stroke-width: 8;
      stroke-dasharray: 213.5;
      stroke-dashoffset: 213.5;
      transform: rotate(-90deg);
      transform-origin: center;
      transform-box: fill-box;
      transition: all 0.1s;
    }
    .text-content {
      position: absolute;
      top: 30px;
      left: 100px;
    }
    .text {
      font-size: 20px;
    }
    .percent {
      font-size: 10px;
    }
    .audio-status {
      position: absolute;
      top: 8px;
      left: 10px;
      width: 64px;
      height: 64px;
      cursor: pointer;
      border-radius: 100%;
      background-color: #fb8240;
      box-shadow: 0 0 0 7px rgba(251, 130, 61, 0.2);
    }
    .audio-status::after {
      position: absolute;
      top: 22px;
      left: 26px;
      width: 0;
      height: 0;
      content: '';
      border: 10px solid #fff;
      border-color: transparent transparent transparent #fff;
      border-left-width: 18px;
      border-radius: 3px;
    }
    .audio-pause::after {
      left: 25px;
      width: 5px;
      height: 22px;
      border: none;
      background-color: #fff;
      box-shadow: 10px 0 0 0 #fff;
    }
  </style>
  <script>
    let filp = document.getElementById('filp');
    let wrap = document.getElementById('wrap');
    filp.onclick = function () {
      if (wrap.style.transform == 'rotateX(180deg)') {
        wrap.style.transform = 'rotateX(0deg)';
      } else {
        wrap.style.transform = 'rotateX(180deg)';
      }
    };
    window.onload = function () {
      let audio = document.querySelector('audio'); // 获取 audio 元素
      let action = document.querySelector('#action'); // 播放|暂停 按钮
      let duration = audio.duration; // 获取整首歌的时间
      var interval = ''; // 定义变量

      let progressLen = 213.5; // 圆周长
      const textDom = document.getElementsByClassName('text')[0]; // 数字进度
      const circleDom = document.getElementsByClassName('circle')[0]; // 环形进度条

      // 点击 播放|暂停 按钮时触发下列事件
      action.addEventListener('click', function () {
        let status = audio.getAttribute('data-play'); // 获取播放状态
        if (status == 'false') {
          // 切换播放状态
          audio.play();
          audio.setAttribute('data-play', 'true');
        } else {
          audio.pause();
          audio.setAttribute('data-play', 'false');
        }

        // 当音频处于播放状态时触发下列事件
        audio.addEventListener('playing', function () {
          clearTimeout(interval); // 取消定时操作
          action.classList.add('audio-pause'); // 为 播放|暂停 按钮添加 'audio-pause' 类名
          audio.ontimeupdate = function () {
            let currentTime = audio.currentTime; // 获取当前的播放时间
            let number = Math.round((currentTime / duration) * 100); // 更新进度
            textDom.innerHTML = number; // 更新dom
            circleDom.style['stroke-dashoffset'] = progressLen - (progressLen / 100) * number;
            console.log(progressLen - (progressLen / 100) * number);
          };
        });
        // 当音频处于暂停状态时触发下列事件
        audio.addEventListener('pause', function () {
          action.classList.remove('audio-pause'); // 为 播放|暂停 按钮移除 'audio-pause' 类名
          clearTimeout(interval); // 取消定时操作
        });
      });
    };
  </script>
</html>