姑苏
本帖最后由 马黑黑 于 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: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> 帖子代码
<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 08:00 编辑
机制解释:
音乐控制器由一个父元素 id="fly " 带三个图片(class="mplayer")组成一个可以移动、转动的有机体,左右移动是父元素的行为,3d转动是图片的行为,音乐的播放/暂停控制通过单击三张图片任意一张实现。
图片忽转忽停的效果是CSS关键帧动画调用者animation的缺省(默认)行为,左右移动其实也是使用默认的,而此前,我们通常会设置为 linear 以便令运动方式是匀速的。
JS对关键帧动画的控制通过 mState 函数完成,父元素和其里面的图片使用不同的 @keyframes 动画,但共享一个CSS变量 --state ,该变量通过帖子父元素 papa 传递。
以下是扩展知识:
需要注意的是,父元素向子元素传递CSS变量可以渗透到子层、孙子层、曾孙层……,这叫继承;但如果要向子孙层的伪元素传递,则只能通过伪元素的直接父层元素来完成,papa对此无能为力。比方说,papa 可以向自己的伪元素传递CSS变量,但不能向它的子元素 id="fly" 的 div 的伪元素传递变量,这需要 fly 自己来完成。 http://s.ssbbww.com/qq/s/20230222080119_s10_p_Chr86_1280x1024_1274x880_qa4_8_www.ssbbww.com.gif
{:4_187:}这个花播位置会移动 我欣赏美好的东东,点赞。 这个太好了,我本来因为听不到歌曲而看不到效果,点了一下换一首歌试试,就听到看到了{:4_205:} 欣赏老师佳作! 马黑黑 发表于 2023-2-22 07:58
机制解释:
音乐控制器由一个父元素 id="fly " 带三个图片(class="mplayer")组成一个可以移动、转动的 ...
yinwei 共享一个CSS变量 --state ,所以点击的时候所有动态都停止了{:4_187:} 马黑黑 发表于 2023-2-22 07:58
机制解释:
音乐控制器由一个父元素 id="fly " 带三个图片(class="mplayer")组成一个可以移动、转动的 ...
mplayer里的transition: 平日里看到的比较少呢,是在默认效果里的过渡么? 红影 发表于 2023-2-22 09:40
mplayer里的transition: 平日里看到的比较少呢,是在默认效果里的过渡么?
鼠标指针移到花花试试看 非常开心 发表于 2023-2-22 08:08
感谢光临指导 雨中悄然 发表于 2023-2-22 08:12
这个花播位置会移动
花飞飞 庶民 发表于 2023-2-22 08:49
我欣赏美好的东东,点赞。
感谢支持