马黑黑 发表于 2022-11-2 11:56

寂静之声

<style>
#papa { left: -214px; width: 1024px; height: 806px; background: gray url('https://638183.freep.cn/638183/t22/webp/jjvu.webp') no-repeat center/cover; box-shadow: 3px 3px 20px #000; position: relative; z-index: 1; }
#mplayer { position: absolute; top: 20px; left: calc(50% - 60px); display: grid; place-items: center; }
#btnplay { position: absolute; width: 40px; height: 20px; left: 50%; top: 50%; background: hsla(120,30%,80%,.6); border-radius: 0 100%; transform-origin: 0 0; cursor: pointer; animation: rot linear 4s infinite; animation-play-state: paused; }
#btnplay::before, #btnplay::after { position: absolute; width: 100%; height: 100%; content: ''; background: inherit; border-radius: inherit; transform-origin: 0 0; transform: rotate(120deg); }
#btnplay::after { transform: rotate(240deg); }
#tmsg { fill: hsla(0,20%,100%,0.55); font: normal 1em sans-serif; }
@keyframes rot { to { transform: rotate(1turn); } }
</style>

<div id="papa">
        <div id="mplayer">
                <span id="btnplay"></span>
                <svg id="msvg" width="120" height="120" shape-rendering="geometricPrecision">
                        <g id="mama" transform="rotate(-90, 60, 60)" style="cursor: pointer;">
                                <circle id="track" cx="60" cy="60" r="50" fill="none" stroke-width="10" stroke="hsla(0,0%,90%,0.55)" />
                                <circle id="prog" cx="60" cy="60" r="50" fill="none" stroke-width="10" stroke="hsla(120,30%,20%,.75)" />
                        </g>
                        <path id="curPath" d="M 20 70 Q 60 0 100 70" fill="none" stroke="none"/>
                        <path id="durPath" d="M 20 55 Q 60 110 100 55" fill="none" stroke="none"/>
                        <g id="tmsg">
                                <text x="34" y="0"><textPath id="curMsg" xlink:href="#curPath" dominant-baseline="text-after-edge">00:00</textPath></text>
                                <text x="29" y="0"><textPath id="durMsg" xlink:href="#durPath" dominant-baseline="text-before-edge">00:00</textPath></text>
                        </g>
                </svg>
        </div>
        <audio id="aud" src="https://music.163.com/song/media/outer/url?id=27571228.mp3" autoplay loop>audio api</audio>
</div>

<script>
(function() {
        let cc = { x: 1*track.getAttribute('cx'), y: 1*track.getAttribute('cy'), len: track.getTotalLength(), };
        prog.style.strokeDasharray = prog.style.strokeDashoffset = cc.len;
        btnplay.onclick = () => aud.paused ? aud.play() : aud.pause();
        aud.addEventListener('seeked', () => aud.play());
        mama.onclick = (e) => {let deg = Math.atan2(e.offsetY - cc.y, e.offsetX - cc.x) * 180 / Math.PI;deg += (e.offsetX < cc.x && e.offsetY < cc.y) ? 450 : 90;aud.currentTime = aud.duration * deg / 360;};
        aud.addEventListener('pause', () => mState());
        aud.addEventListener('play',() => mState());
        aud.addEventListener('timeupdate', () => {prog.style.strokeDashoffset = cc.len - cc.len * aud.currentTime / aud.duration + 'px';curMsg.textContent = toMin(aud.currentTime);durMsg.textContent = toMin(aud.duration);});
        let mState = () => btnplay.style.animationPlayState = aud.paused ? 'paused' : 'running';
        let toMin = (val)=> {if (!val) return '00:00';val = Math.floor(val);let min = parseInt(val / 60), sec = parseFloat(val % 60);if(min < 10) min = '0' + min;if(sec < 10) sec = '0' + sec;return min + ':' + sec;};
        (function() {for(j=0; j<30; j++) {let leaf = document.createElement('span');leaf.style.cssText = `position: absolute;width: 40px;height: 20px;background: hsla(0,0%,100%,.25) linear-gradient(135deg,hsla(120,100%,50%,.35),hsla(60,100%,50%,.45));border-radius: 0 100%;transform: rotate(${Math.random() * 360}deg);left: ${Math.random() * 960}px;top: ${Math.random() * 700}px;`;papa.appendChild(leaf);}})();
}());
</script>

马黑黑 发表于 2022-11-2 11:56

本帖测试三叶草按钮。代码
<style>
#papa { margin: auto; width: 1024px; height: 806px; background: gray url('https://638183.freep.cn/638183/t22/webp/jjvu.webp') no-repeat center/cover; box-shadow: 3px 3px 20px #000; position: relative; z-index: 1; }
#mplayer { position: absolute; top: 20px; left: calc(50% - 60px); display: grid; place-items: center; }
#btnplay { position: absolute; width: 40px; height: 20px; left: 50%; top: 50%; background: hsla(120,30%,80%,.6); border-radius: 0 100%; transform-origin: 0 0; cursor: pointer; animation: rot linear 4s infinite; animation-play-state: paused; }
#btnplay::before, #btnplay::after { position: absolute; width: 100%; height: 100%; content: ''; background: inherit; border-radius: inherit; transform-origin: 0 0; transform: rotate(120deg); }
#btnplay::after { transform: rotate(240deg); }
#tmsg { fill: hsla(0,20%,100%,0.55); font: normal 1em sans-serif; }
@keyframes rot { to { transform: rotate(1turn); } }
</style>

<div id="papa">
        <div id="mplayer">
                <span id="btnplay"></span>
                <svg id="msvg" width="120" height="120" shape-rendering="geometricPrecision">
                        <g id="mama" transform="rotate(-90, 60, 60)" style="cursor: pointer;">
                                <circle id="track" cx="60" cy="60" r="50" fill="none" stroke-width="10" stroke="hsla(0,0%,90%,0.55)" />
                                <circle id="prog" cx="60" cy="60" r="50" fill="none" stroke-width="10" stroke="hsla(120,30%,20%,.75)" />
                        </g>
                        <path id="curPath" d="M 20 70 Q 60 0 100 70" fill="none" stroke="none"/>
                        <path id="durPath" d="M 20 55 Q 60 110 100 55" fill="none" stroke="none"/>
                        <g id="tmsg">
                                <text x="34" y="0"><textPath id="curMsg" xlink:href="#curPath" dominant-baseline="text-after-edge">00:00</textPath></text>
                                <text x="29" y="0"><textPath id="durMsg" xlink:href="#durPath" dominant-baseline="text-before-edge">00:00</textPath></text>
                        </g>
                </svg>
        </div>
        <audio id="aud" src="https://music.163.com/song/media/outer/url?id=27571228.mp3" autoplay loop>audio api</audio>
</div>

<script>
(function() {
        let cc = { x: 1*track.getAttribute('cx'), y: 1*track.getAttribute('cy'), len: track.getTotalLength(), };
        prog.style.strokeDasharray = prog.style.strokeDashoffset = cc.len;
        btnplay.onclick = () => aud.paused ? aud.play() : aud.pause();
        aud.addEventListener('seeked', () => aud.play());
        mama.onclick = (e) => {let deg = Math.atan2(e.offsetY - cc.y, e.offsetX - cc.x) * 180 / Math.PI;deg += (e.offsetX < cc.x && e.offsetY < cc.y) ? 450 : 90;aud.currentTime = aud.duration * deg / 360;};
        aud.addEventListener('pause', () => mState());
        aud.addEventListener('play',() => mState());
        aud.addEventListener('timeupdate', () => {prog.style.strokeDashoffset = cc.len - cc.len * aud.currentTime / aud.duration + 'px';curMsg.textContent = toMin(aud.currentTime);durMsg.textContent = toMin(aud.duration);});
        let mState = () => btnplay.style.animationPlayState = aud.paused ? 'paused' : 'running';
        let toMin = (val)=> {if (!val) return '00:00';val = Math.floor(val);let min = parseInt(val / 60), sec = parseFloat(val % 60);if(min < 10) min = '0' + min;if(sec < 10) sec = '0' + sec;return min + ':' + sec;};
        (function() {for(j=0; j<30; j++) {let leaf = document.createElement('span');leaf.style.cssText = `position: absolute;width: 40px;height: 20px;background: hsla(0,0%,100%,.25) linear-gradient(135deg,hsla(120,100%,50%,.35),hsla(60,100%,50%,.45));border-radius: 0 100%;transform: rotate(${Math.random() * 360}deg);left: ${Math.random() * 960}px;top: ${Math.random() * 700}px;`;papa.appendChild(leaf);}})();
}());
</script>

小辣椒 发表于 2022-11-2 12:38

这个纯播放器的,里面加了小风扇{:4_199:}

小辣椒 发表于 2022-11-2 12:39

三叶草我以为是小风扇{:4_189:}

马黑黑 发表于 2022-11-2 12:39

小辣椒 发表于 2022-11-2 12:38
这个纯播放器的,里面加了小风扇

三叶草,什么小风扇{:4_170:}

马黑黑 发表于 2022-11-2 12:41

小辣椒 发表于 2022-11-2 12:39
三叶草我以为是小风扇

我为了避免让人误会为扇叶,还特地加了随机的叶子,以此给出正确的引导暗示,你倒好,小风扇{:4_196:}

小辣椒 发表于 2022-11-2 12:43

马黑黑 发表于 2022-11-2 12:41
我为了避免让人误会为扇叶,还特地加了随机的叶子,以此给出正确的引导暗示,你倒好,小风扇

哈哈~~~看见了这么多树叶

马黑黑 发表于 2022-11-2 12:44

小辣椒 发表于 2022-11-2 12:43
哈哈~~~看见了这么多树叶

{:4_169:}

小辣椒 发表于 2022-11-2 12:45

这个小树叶走路径的

小辣椒 发表于 2022-11-2 12:46

黑黑,你好强大,这种制作真漂亮。这个效果也是可以用其他帖里面

马黑黑 发表于 2022-11-2 12:46

小辣椒 发表于 2022-11-2 12:45
这个小树叶走路径的

没有,静态的

马黑黑 发表于 2022-11-2 12:47

小辣椒 发表于 2022-11-2 12:46
黑黑,你好强大,这种制作真漂亮。这个效果也是可以用其他帖里面

应该可以吧

小辣椒 发表于 2022-11-2 12:47

马黑黑 发表于 2022-11-2 12:46
没有,静态的

静态可以这个效果?

小辣椒 发表于 2022-11-2 12:47

和播放器转动按钮一样

马黑黑 发表于 2022-11-2 12:48

小辣椒 发表于 2022-11-2 12:47
静态可以这个效果?

当然。每次打开帖子,叶子的分布都会不同,但在帖子里面,叶子是静态的。

马黑黑 发表于 2022-11-2 12:50

小辣椒 发表于 2022-11-2 12:47
和播放器转动按钮一样

两种叶子各自制作:

按钮的三叶草,在CSS里完成;随机分布的叶子,在JS里设定,最后一行。

小辣椒 发表于 2022-11-2 12:52

马黑黑 发表于 2022-11-2 12:48
当然。每次打开帖子,叶子的分布都会不同,但在帖子里面,叶子是静态的。

哦,晚上再欣赏了

小辣椒 发表于 2022-11-2 12:53

马黑黑 发表于 2022-11-2 12:50
两种叶子各自制作:

按钮的三叶草,在CSS里完成;随机分布的叶子,在JS里设定,最后一行。

还是有点复杂的,叶子还得二次

马黑黑 发表于 2022-11-2 12:54

小辣椒 发表于 2022-11-2 12:47
和播放器转动按钮一样
随机分布的叶子(全部由JS制作):

(function() {
      for (j = 0; j < 30; j++) {
                let leaf = document.createElement('span');
                leaf.style.cssText = `
                        position: absolute;
                        width: 40px;
                        height: 20px;
                        background: hsla(0,0%,100%,.25) linear-gradient(135deg,hsla(120,100%,50%,.35),hsla(60,100%,50%,.45));
                        border-radius: 0 100%;
                        transform: rotate(${Math.random() * 360}deg);
                        left: ${Math.random() * 960}px;
                        top: ${Math.random() * 700}px;
                `;
                papa.appendChild(leaf);
      }
})();

马黑黑 发表于 2022-11-2 12:55

小辣椒 发表于 2022-11-2 12:53
还是有点复杂的,叶子还得二次

播放按钮的叶子,一拖二,一个元素带两个伪元素,两个伪元素依次扭转120度、240度,就形成了三叶草
页: [1] 2 3 4
查看完整版本: 寂静之声