霜染枫丹 发表于 2026-4-17 01:14

桃花春水 (播放器)

<style>
    @import 'https://638183.freep.cn/638183/web/tz/tz.v4.css';
    .pa {
      --offsetX: 81px;
      --bg: url('https://ff.xiaoqiaodali.top:5401/i/2026/04/16/69e100c5354c0.gif') no-repeat center/cover;
    }
    /* 图片播放按钮 */
    .play-btn {
      position: absolute;
      bottom: 30px;
      left: 50%;
      transform: translateX(-50%);
      width: 20%;
      height: 20%;
      border-radius: 50%;

      display: flex;
      align-items: center;
      justify-content: center;
      cursor: pointer;
      z-index: 100;
      transition: all 0.3s ease;
      overflow: hidden;
    }
    .play-btn:hover {
      transform: translateX(-50%) scale(1.15);

    }
    .play-img {
      width: 65%;
      height: 65%;
      object-fit: contain;
      pointer-events: none;
    }

    /* 椭圆遮罩样式 */
    .pd-vid {
      opacity: 1;
      --ellipse-w: 15%;
      --ellipse-h: 20%;
      --ellipse-x:80%;
      --ellipse-y: 50%;
      clip-path: ellipse(var(--ellipse-w) var(--ellipse-h) at var(--ellipse-x) var(--ellipse-y));
      cursor: move;
      position: relative;
    }
    @keyframes flash {
      from { opacity: 1; }
      to { opacity: 0.7; }
    }
    /* 旋转动画 */
    @keyframes rotate {
      from { transform: rotate(0deg); }
      to { transform: rotate(360deg); }
    }

    /* 播放状态下的旋转效果 */
    .play-img.playing {
      animation: rotate 8s linear infinite;
    }

    /* 歌词显示样式:右侧竖式显示 */
    .lyrics-container {
      position: absolute;
      top: 30%;
      right: 20px;
      transform: translateY(-50%);
      width: auto;
      text-align: center;
      z-index: 99;
      pointer-events: none;
      padding: 10px 20px;
      border-radius: 10px;
      max-height: 80vh;
      overflow-y: auto;
      writing-mode: vertical-rl;
      text-orientation: mixed;
    }
    .lyrics-text {
      font-size: 48px;
      color: #ef5b9c;
      text-shadow: 2px 2px 4px rgba(0,0,0,0.8);
      font-family: "LiSu", "隶书", serif;
      margin: 0 8px;
      line-height: 1.5;
      white-space: pre-line;
      overflow-wrap: break-word;
    }
    /* 隐藏原生音频播放条 */
    audio {
      display: none !important;
    }
</style>

<div id="pa" class="pa">
    <div class="lyrics-container">
      <div id="lyrics-text" class="lyrics-text"></div>
    </div>
    <div id="playBtn" class="play-btn">
      <img src="https://ff.xiaoqiaodali.top:5401/i/2025/12/13/693c562039ba9.png" class="play-img">
    </div>
</div>

<script type="module">
    import TZ from 'https://638183.freep.cn/638183/web/tz/tz.v4.js';
    const tz = TZ.TZ('pa');

    const audioEl = tz.add('audio', '', '', {
      src: 'http://cccimg.com/view.php/0fb59fceea9320abf6cd432cd9c154f1.mp3'
    });
    const audio = audioEl.el || document.querySelector('audio');

    const videoEl = tz.add('video', 'http://cccimg.com/view.php/3e8ea5a337c2db1ae322937e2c90d16d.mp4', 'pd-vid', {
      src: '',
      autoplay: true,
      muted: true,
      loop: true
    });

    tz.bgprog().style('width: 280px; bottom: 25px; color: cyan');
    tz.fs().style('top: 30px');

    const playBtn = document.getElementById('playBtn');
    const lyricsText = document.getElementById('lyrics-text');
    const playImg = document.querySelector('.play-img');

    // —————— 核心修改:页面加载后自动播放音乐 + 自动旋转 ——————
    window.addEventListener('load', () => {
      audio.muted = false;
      audio.play().then(() => {
            playImg.classList.add('playing'); // 同步旋转
            lyricsText.textContent = lyrics;
      }).catch(err => {
            lyricsText.textContent = '点击图标播放音乐';
      });
    });

    // 点击按钮切换播放/暂停 + 旋转/停止
    playBtn.addEventListener('click', () => {
      if (audio.paused) {
            audio.play();
            playImg.classList.add('playing');
      } else {
            audio.pause();
            playImg.classList.remove('playing');
      }
    });

const lrcString = `
桃花春水
作词:歌奴
作曲:歌奴
演唱:梦瑶
春风拂岸柳丝荡
桃花满野吐芬芳
春水悠悠映斜阳
相思悄悄落心房
轻舟摇碎波光影
蝶舞花间意难平
往事如烟随风行
唯有春情不细听
桃花春水两相融
一抹温柔入梦中
岁月匆匆情更浓
痴心只为一人懂
春风拂岸柳丝荡
桃花满野吐芬芳
春水悠悠映斜阳
相思悄悄落心房
桃花春水映碧空
几分眷恋在心中
流年辗转爱相拥
此生不负这相逢
桃花春水满江红
万般情思与君同
尘缘漫漫心相通
不负春来不负侬
春水长流情不散
桃花岁岁伴君梦
`;

function parseLRC(lrcText) {
    const lines = lrcText.split('\n');
    const lyricsArray = [];
    const timeRegex = /\[(\d{2}):(\d{2})\.(\d{2})\]/;

    for (let line of lines) {
      const match = line.match(timeRegex);
      if (match) {
            const minutes = parseInt(match);
            const seconds = parseInt(match);
            const centiseconds = parseInt(match);
            const timeInSeconds = minutes * 60 + seconds + centiseconds / 100;
            const text = line.replace(timeRegex, '').trim();
            if (text) {
                lyricsArray.push();
            }
      }
    }
    return lyricsArray;
}

const lyrics = parseLRC(lrcString);
let currentLyricIndex = 0;

audio.addEventListener('timeupdate', () => {
    const currentTime = audio.currentTime;
    for (let i = lyrics.length - 1; i >= 0; i--) {
      if (currentTime >= lyrics) {
            if (currentLyricIndex !== i) {
                currentLyricIndex = i;
                lyricsText.textContent = lyrics;
            }
            break;
      }
    }
});

audio.addEventListener('ended', () => {
    lyricsText.textContent = '播放结束';
    playImg.classList.remove('playing');
});



    const vidElement = document.querySelector('.pd-vid');
    let isDragging = false;
    let startX, startY;
    let startEllipseX, startEllipseY;

    vidElement.addEventListener('mousedown', (e) => {
      isDragging = true;
      startX = e.clientX;

      startEllipseX = parseFloat(getComputedStyle(vidElement).getPropertyValue('--ellipse-x'));

      vidElement.style.userSelect = 'none';

    });

    document.addEventListener('mousemove', (e) => {
      if (!isDragging) return;
      const deltaX = (e.clientX - startX) / vidElement.offsetWidth * 100;

      const newX = Math.max(0, Math.min(100, startEllipseX + deltaX));

      vidElement.style.setProperty('--ellipse-x', `${newX}%`);

    });

    document.addEventListener('mouseup', () => {
      isDragging = false;
      vidElement.style.userSelect = '';

    });

    vidElement.addEventListener('wheel', (e) => {
      e.preventDefault();
      let ellipseW = parseFloat(getComputedStyle(vidElement).getPropertyValue('--ellipse-w'));

      const step = e.deltaY > 0 ? -2 : 2;
      const newW = Math.max(10, Math.min(100, ellipseW + step));

      vidElement.style.setProperty('--ellipse-w', `${newW}%`);

    }, { passive: false });
</script>

也曾年轻 发表于 2026-4-17 06:58

https://wx1.sinaimg.cn/mw1024/c91c596aly4h93j1kl362g208c08caan.gif

梦油 发表于 2026-4-17 11:04

优美的制作无与伦比。{:5_116:}

杨帆 发表于 2026-4-17 12:31

漂亮~谢谢枫丹老师精彩分享{:4_204:}

红影 发表于 2026-4-17 16:42

好漂亮,欣赏枫丹好帖{:4_187:}

霜染枫丹 发表于 2026-4-17 17:18

也曾年轻 发表于 2026-4-17 06:58


感谢也曾年轻的支持,下午好!{:4_204:}{:4_190:}

霜染枫丹 发表于 2026-4-17 17:21

梦油 发表于 2026-4-17 11:04
优美的制作无与伦比。

梦老下午好~~感谢您的鼓励,过誉了{:4_173:},很荣幸。祝您安好!{:4_204:}{:4_190:}

霜染枫丹 发表于 2026-4-17 17:22

杨帆 发表于 2026-4-17 12:31
漂亮~谢谢枫丹老师精彩分享

感谢扬帆的支持,下午好!喜欢听这首歌就又做了这个。祝您制作愉快~~{:4_204:}{:4_190:}

霜染枫丹 发表于 2026-4-17 17:28

红影 发表于 2026-4-17 16:42
好漂亮,欣赏枫丹好帖

红影下午好~~

播放器这种模式流行了这么多年,我一直不算喜欢,就是感到没有视频内容丰富,来到这里才开始学习的。现在AI出图丰富了内容,我开始做了才有了体会,觉得这个东东的张力很大,以前观点片面了些。谢你的支持!{:4_204:}{:4_190:}

梦油 发表于 2026-4-18 11:06

霜染枫丹 发表于 2026-4-17 17:21
梦老下午好~~感谢您的鼓励,过誉了,很荣幸。祝您安好!

枫丹朋友别客气。

红影 发表于 2026-4-18 23:11

霜染枫丹 发表于 2026-4-17 17:28
红影下午好~~

播放器这种模式流行了这么多年,我一直不算喜欢,就是感到没有视频内容丰富,来到这里才 ...

任何时候开始喜欢都来得及的啊,喜欢了就会好好地去玩了呢{:4_187:}
页: [1]
查看完整版本: 桃花春水 (播放器)