马黑黑 发表于 2023-2-22 07:31

姑苏

本帖最后由 马黑黑 于 2023-2-22 07:35 编辑 <br /><br /><style>
#papa {
        margin: -80px 0 0 calc(50% - 593px);
        width: 1024px;
        height: 640px;
        background: lightblue url('https://638183.freep.cn/638183/t23/webp/gusu.webp') no-repeat center/cover;
        box-shadow: 3px 3px 20px #000;
        position: relative;
        user-select: none;
        z-index: 1;
        --state: paused;
}
#fly {
        position: absolute;
        left: 0;
        width: 360px;
        height: 200px;
        animation: fly 100s infinite alternate var(--state);
}
.mplayer {
        --tt: 6s;
        position: absolute;
        left: 0;
        width: 200px;
        height: 200px;
        border-radius: 50%;
        transform: perspective(1000px) rotateX(45deg) rotateY(30deg);
        animation: rot var(--tt) infinite var(--state);
        cursor: pointer;
        transition: .45s;
}
.mplayer:hover { filter: drop-shadow(0 0 80px green) brightness(200%); }
.mplayer:nth-of-type(2) {
        --tt: 4s;
        left: 210px;
        width: 150px;
        height: 150px;
}
.mplayer:nth-of-type(3) {
        --tt: 2s;
        left: 130px;
        width: 100px;
        height: 100px;
}
@keyframes rot { to { transform: perspective(1000px) rotateX(45deg) rotateY(30deg) rotateZ(360deg); } }
@keyframes fly { to { left: calc(100% - 360px); } }
</style>

<div id="papa">
        <div id="fly">
                <img class="mplayer" src="https://638183.freep.cn/638183/t23/1/7sh-1.png" alt="" />
                <img class="mplayer" src="https://638183.freep.cn/638183/t23/1/7sh-1.png" alt="" />
                <img class="mplayer" src="https://638183.freep.cn/638183/t23/1/7sh-1.png" alt="" />
        </div>
</div>
<audio id="aud" src="https://music.163.com/song/media/outer/url?id=1395615427.mp3" loop autoplay></audio>

<script>
(function() {
        (function(mkFS) {let setFullScreen = (user_set) => {let pa = user_set.pa;if(typeof(pa) !== 'object') return false;if(!user_set.set) user_set.set = 'color: snow; background: black; border: 2px solid snow; left: 40px; bottom: 40px;';btnMsg = document.createElement('span');btnMsg.style.cssText = `position: absolute; border-radius: 8px; padding: 4px; cursor: pointer; z-index:998; ${user_set.set}`;btnMsg.innerText = '全屏观赏';btnMsg.style.display = 'none';pa.appendChild(btnMsg);let timerId, fs = false;btnMsg.onclick = () => fs ? document.exitFullscreen() : pa.requestFullscreen();pa.addEventListener('mousemove', (e) => {clearTimeout(timerId);btnMsg.style.display = 'block';timerId = setTimeout('btnMsg.style.display = "none"', 3000);});document.addEventListener('fullscreenchange', () => {if (document.fullscreenElement !== null) {fs = true;btnMsg.innerText = '退出全屏';} else {fs = false;btnMsg.innerText = '全屏观赏';}});};mkFS.FS = setFullScreen;})(this);
        let mState = () => papa.style.setProperty('--state', aud.paused ? 'paused' : 'running');
        let btns = document.querySelectorAll('.mplayer');
        [...btns].forEach((item) => item.onclick = () => aud.paused ? aud.play() : aud.pause());
        aud.addEventListener('play', () => mState());
        aud.addEventListener('pause', () => mState());
        FS({
                pa:papa,
                set:'left: 50%; transform: translate(-50%); bottom: 20px; background: transparent; color: snow; border: 2px dotted snow;',
        });
})();
</script>

马黑黑 发表于 2023-2-22 07:34

本帖最后由 马黑黑 于 2023-2-22 07:36 编辑 <br /><br /><input id="bntOk" type="button" value="换一首歌试试" />

<script>
bntOk.onclick = () => aud.src = 'http://www.kumeiwp.com/sub/filestores/2022/03/23/b2a04f765b09cf1d25dc6852cb6a57c9.mp3';
aud.play();
</script>

马黑黑 发表于 2023-2-22 07:40

帖子代码
<style>
#papa {
        margin: -80px 0 0 calc(50% - 593px);
        width: 1024px;
        height: 640px;
        background: lightblue url('https://638183.freep.cn/638183/t23/webp/gusu.webp') no-repeat center/cover;
        box-shadow: 3px 3px 20px #000;
        position: relative;
        user-select: none;
        z-index: 1;
        --state: paused;
}
#fly {
        position: absolute;
        left: 0;
        width: 360px;
        height: 200px;
        animation: fly 100s infinite alternate var(--state);
}
.mplayer {
        --tt: 6s;
        position: absolute;
        left: 0;
        width: 200px;
        height: 200px;
        border-radius: 50%;
        transform: perspective(1000px) rotateX(45deg) rotateY(30deg);
        animation: rot var(--tt) infinite var(--state);
        cursor: pointer;
        transition: .45s;
}
.mplayer:hover { filter: drop-shadow(0 0 80px green) brightness(200%); }
.mplayer:nth-of-type(2) {
        --tt: 4s;
        left: 210px;
        width: 150px;
        height: 150px;
}
.mplayer:nth-of-type(3) {
        --tt: 2s;
        left: 130px;
        width: 100px;
        height: 100px;
}
@keyframes rot { to { transform: perspective(1000px) rotateX(45deg) rotateY(30deg) rotateZ(360deg); } }
@keyframes fly { to { left: calc(100% - 360px); } }
</style>

<div id="papa">
        <div id="fly">
                <img class="mplayer" src="https://638183.freep.cn/638183/t23/1/7sh-1.png" alt="" />
                <img class="mplayer" src="https://638183.freep.cn/638183/t23/1/7sh-1.png" alt="" />
                <img class="mplayer" src="https://638183.freep.cn/638183/t23/1/7sh-1.png" alt="" />
        </div>
</div>
<audio id="aud" src="https://music.163.com/song/media/outer/url?id=1395615427.mp3" loop autoplay></audio>

<script>
(function() {
        (function(mkFS) {let setFullScreen = (user_set) => {let pa = user_set.pa;if(typeof(pa) !== 'object') return false;if(!user_set.set) user_set.set = 'color: snow; background: black; border: 2px solid snow; left: 40px; bottom: 40px;';btnMsg = document.createElement('span');btnMsg.style.cssText = `position: absolute; border-radius: 8px; padding: 4px; cursor: pointer; z-index:998; ${user_set.set}`;btnMsg.innerText = '全屏观赏';btnMsg.style.display = 'none';pa.appendChild(btnMsg);let timerId, fs = false;btnMsg.onclick = () => fs ? document.exitFullscreen() : pa.requestFullscreen();pa.addEventListener('mousemove', (e) => {clearTimeout(timerId);btnMsg.style.display = 'block';timerId = setTimeout('btnMsg.style.display = "none"', 3000);});document.addEventListener('fullscreenchange', () => {if (document.fullscreenElement !== null) {fs = true;btnMsg.innerText = '退出全屏';} else {fs = false;btnMsg.innerText = '全屏观赏';}});};mkFS.FS = setFullScreen;})(this);
        let mState = () => papa.style.setProperty('--state', aud.paused ? 'paused' : 'running');
        let btns = document.querySelectorAll('.mplayer');
        [...btns].forEach((item) => item.onclick = () => aud.paused ? aud.play() : aud.pause());
        aud.addEventListener('play', () => mState());
        aud.addEventListener('pause', () => mState());
        FS({
                pa:papa,
                set:'left: 50%; transform: translate(-50%); bottom: 20px; background: transparent; color: snow; border: 2px dotted snow;',
        });
})();
</script>


马黑黑 发表于 2023-2-22 07:58

本帖最后由 马黑黑 于 2023-2-22 08:00 编辑

机制解释:

音乐控制器由一个父元素 id="fly " 带三个图片(class="mplayer")组成一个可以移动、转动的有机体,左右移动是父元素的行为,3d转动是图片的行为,音乐的播放/暂停控制通过单击三张图片任意一张实现。

图片忽转忽停的效果是CSS关键帧动画调用者animation的缺省(默认)行为,左右移动其实也是使用默认的,而此前,我们通常会设置为 linear 以便令运动方式是匀速的。

JS对关键帧动画的控制通过 mState 函数完成,父元素和其里面的图片使用不同的 @keyframes 动画,但共享一个CSS变量 --state ,该变量通过帖子父元素 papa 传递。

以下是扩展知识:

需要注意的是,父元素向子元素传递CSS变量可以渗透到子层、孙子层、曾孙层……,这叫继承;但如果要向子孙层的伪元素传递,则只能通过伪元素的直接父层元素来完成,papa对此无能为力。比方说,papa 可以向自己的伪元素传递CSS变量,但不能向它的子元素 id="fly" 的 div 的伪元素传递变量,这需要 fly 自己来完成。

非常开心 发表于 2023-2-22 08:08

http://s.ssbbww.com/qq/s/20230222080119_s10_p_Chr86_1280x1024_1274x880_qa4_8_www.ssbbww.com.gif

雨中悄然 发表于 2023-2-22 08:12

{:4_187:}这个花播位置会移动

庶民 发表于 2023-2-22 08:49

我欣赏美好的东东,点赞。

红影 发表于 2023-2-22 09:24

这个太好了,我本来因为听不到歌曲而看不到效果,点了一下换一首歌试试,就听到看到了{:4_205:}

海笑 发表于 2023-2-22 09:28

欣赏老师佳作!

红影 发表于 2023-2-22 09:39

马黑黑 发表于 2023-2-22 07:58
机制解释:

音乐控制器由一个父元素 id="fly " 带三个图片(class="mplayer")组成一个可以移动、转动的 ...

yinwei 共享一个CSS变量 --state ,所以点击的时候所有动态都停止了{:4_187:}

红影 发表于 2023-2-22 09:40

马黑黑 发表于 2023-2-22 07:58
机制解释:

音乐控制器由一个父元素 id="fly " 带三个图片(class="mplayer")组成一个可以移动、转动的 ...

mplayer里的transition: 平日里看到的比较少呢,是在默认效果里的过渡么?

醉美水芙蓉 发表于 2023-2-22 11:19

醉美水芙蓉 发表于 2023-2-22 11:54

醉美水芙蓉 发表于 2023-2-22 11:57

醉美水芙蓉 发表于 2023-2-22 11:59

醉美水芙蓉 发表于 2023-2-22 12:00

马黑黑 发表于 2023-2-22 12:47

红影 发表于 2023-2-22 09:40
mplayer里的transition: 平日里看到的比较少呢,是在默认效果里的过渡么?

鼠标指针移到花花试试看

马黑黑 发表于 2023-2-22 12:48

非常开心 发表于 2023-2-22 08:08


感谢光临指导

马黑黑 发表于 2023-2-22 12:48

雨中悄然 发表于 2023-2-22 08:12
这个花播位置会移动

花飞飞

马黑黑 发表于 2023-2-22 12:48

庶民 发表于 2023-2-22 08:49
我欣赏美好的东东,点赞。

感谢支持
页: [1] 2 3 4 5
查看完整版本: 姑苏