萧瑟鸣风
<style>#papa {
margin: 100px 0 0 calc(50% - 593px);
width: 1024px;
height: 640px;
background: gray url('https://638183.freep.cn/638183/t23/webp/xsmf.webp') center/cover no-repeat;
box-shadow: 3px 3px 20px #000;
position: relative;
z-index: 1;
--state: paused;
}
#mplayer {
width: 80px;
height: 160px;
left: 10px;
bottom: 10px;
background: black;
border-radius: 8px;
box-shadow: 6px 4px 12px snow;
transition: .6s;
position: absolute;
pointer-events: none;
}
#mplayer::before, #mplayer::after {
position: absolute;
content: '';
}
#mplayer::before {
width: 30px;
height: 30px;
left: calc(50% - 15px);
bottom: 15px;
border-radius: 50%;
background: #333;
pointer-events: auto;
cursor: pointer;
border: 2px solid snow;
box-shadow: 0 0 10px blue;
animation: flash .3s infinite alternate var(--state);
}
#mplayer::after {
content:attr(data-tt);
top: 6px; right: 6px; bottom: 60px; left: 6px;
background: #333;
color: lightblue;
font-size: 14px;
text-align: center;
padding: 4px;
white-space:pre;
}
#mplayer:active { transform: rotate(5deg); }
#vid { display: none; }
#canv {
position: absolute;
display: block;
right: 10px;
top: 10px;
border-radius: 50%;
opacity: .35;
}
@keyframes flash {
to { box-shadow: 0 0 30px white; }
}
</style>
<div id="papa">
<canvas id="canv"></canvas>
<div id="mplayer" data-tt="HCPlayer 00:00 00:00"></div>
</div>
<audio id="aud" src="https://music.163.com/song/media/outer/url?id=30148242" loop></audio>
<video id="vid" src="https://img.tukuppt.com/video_show/2475824/00/02/06/5b50065e45b04.mp4" loop muted></video>
<script>
let ctx = canv.getContext('2d');
let ww = canv.width = 400, hh = canv.height = 400;
let loop = () => {ctx.drawImage(vid, 0, 0, ww, hh);if(!vid.paused) {requestAnimationFrame(loop);return;}}
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;};
let mState = () => aud.paused ? (papa.style.setProperty('--state', 'paused'),vid.pause()) : (papa.style.setProperty('--state', 'running'),vid.play());
vid.playbackRate = 0.5;
vid.addEventListener('play', loop, false);
aud.addEventListener('play', () => mState());
aud.addEventListener('pause', () => mState());
aud.addEventListener('timeupdate', () => mplayer.dataset.tt = '萧瑟鸣风\n\n' + toMin(aud.duration) + '\n' + toMin(aud.currentTime));
mplayer.addEventListener('click', () => aud.paused ? aud.play() : aud.pause());
</script>
帖子代码
<style>
#papa {
margin: 100px 0 0 calc(50% - 593px);
width: 1024px;
height: 640px;
background: gray url('https://638183.freep.cn/638183/t23/webp/xsmf.webp') center/cover no-repeat;
box-shadow: 3px 3px 20px #000;
position: relative;
z-index: 1;
--state: paused;
}
#mplayer {
width: 80px;
height: 160px;
left: 10px;
bottom: 10px;
background: black;
border-radius: 8px;
box-shadow: 6px 4px 12px snow;
transition: .6s;
position: absolute;
pointer-events: none;
}
#mplayer::before, #mplayer::after {
position: absolute;
content: '';
}
#mplayer::before {
width: 30px;
height: 30px;
left: calc(50% - 15px);
bottom: 15px;
border-radius: 50%;
background: #333;
pointer-events: auto;
cursor: pointer;
border: 2px solid snow;
box-shadow: 0 0 10px blue;
animation: flash .3s infinite alternate var(--state);
}
#mplayer::after {
content:attr(data-tt);
top: 6px; right: 6px; bottom: 60px; left: 6px;
background: #333;
color: lightblue;
font-size: 14px;
text-align: center;
padding: 4px;
white-space:pre;
}
#mplayer:active { transform: rotate(5deg); }
#vid { display: none; }
#canv {
position: absolute;
display: block;
right: 10px;
top: 10px;
border-radius: 50%;
opacity: .35;
}
@keyframes flash {
to { box-shadow: 0 0 30px white; }
}
</style>
<div id="papa">
<canvas id="canv"></canvas>
<div id="mplayer" data-tt="HCPlayer
00:00
00:00"></div>
</div>
<audio id="aud" src="https://music.163.com/song/media/outer/url?id=30148242" loop></audio>
<video id="vid" src="https://img.tukuppt.com/video_show/2475824/00/02/06/5b50065e45b04.mp4" loop muted></video>
<script>
let ctx = canv.getContext('2d');
let ww = canv.width = 400, hh = canv.height = 400;
let loop = () => {ctx.drawImage(vid, 0, 0, ww, hh);if(!vid.paused) {requestAnimationFrame(loop);return;}}
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;};
let mState = () => aud.paused ? (papa.style.setProperty('--state', 'paused'),vid.pause()) : (papa.style.setProperty('--state', 'running'),vid.play());
vid.playbackRate = 0.5;
vid.addEventListener('play', loop, false);
aud.addEventListener('play', () => mState());
aud.addEventListener('pause', () => mState());
aud.addEventListener('timeupdate', () => mplayer.dataset.tt = '萧瑟鸣风\n\n' + toMin(aud.duration) + '\n' + toMin(aud.currentTime));
mplayer.addEventListener('click', () => aud.paused ? aud.play() : aud.pause());
</script>
媒体未设置为自动播放。若需要,仅需在 audio 标签加入 autoplay 属性即可:
<audio id="aud" src="..." loop autoplay></audio> 帖子遥控器是一个单标签。单标签能具备如此丰富的功能,得益于mplayer两个伪元素的加持与JS对CSS的操作能力:荧屏与按钮使用用::before和::after实现,JS通过操控dataset和CSS变量令其动态变化。 #mplayer选择器的伪类 :active 用在这里效果不是特别明显。
在此,:active 伪类给元素设定一个效果,即,当遥控器处于活动中时,旋转 5 度——
#mplayer:active { transform: rotate(5deg); }
啥情况是处于活动之时?比如,点击操作。把点击动作放慢一点,这个旋转效果会明显看到。 欣赏学习老师佳帖!赞!!!{:4_187:} 这是极光吗?这小小的遥控器设计的真妙。 梦油 发表于 2023-3-24 10:26
这是极光吗?这小小的遥控器设计的真妙。
是极光 焱鑫磊 发表于 2023-3-24 09:30
欣赏学习老师佳帖!赞!!!
中午好 原来不是自动播放的,进帖子听不到声音还以为是我网的问题呢{:4_173:} 点击播放后,视频也出来了,很漂亮大气的制作。这个遥控器用在帖子里还挺漂亮的呢{:4_199:} 红影 发表于 2023-3-24 12:57
原来不是自动播放的,进帖子听不到声音还以为是我网的问题呢
嗯,这是为了测试遥控器。生活中,通过遥控器才能启动什么。 红影 发表于 2023-3-24 12:59
点击播放后,视频也出来了,很漂亮大气的制作。这个遥控器用在帖子里还挺漂亮的呢
小而美就是酱紫的{:4_170:} 马黑黑 发表于 2023-3-24 12:00
是极光
很漂亮 马黑黑 发表于 2023-3-24 12:59
嗯,这是为了测试遥控器。生活中,通过遥控器才能启动什么。
还有这样的说法啊,有意思{:4_170:} 马黑黑 发表于 2023-3-24 13:01
小而美就是酱紫的
而且还挺实用,一点击各种效果就都出来了{:4_173:} 极地极光,真美,小巧清秀的机体状控制器够打眼。点开了迷幻和惊艳,这设计给力! 黑黑好棒,遥控器可以控制视频停止和播放 这个也是好玩的,很喜欢的效果{:4_178:} js操控css不懂,就觉得js可控视频,灵动短暂的5度旋归也很有创意,点赞问好!