遗失的风景
<style>#papa {
margin: 80px 0 0 calc(50% - 593px);
width: 1024px;
height: 640px;
background: gray;
box-shadow: 3px 3px 20px #000;
position: relative;
z-index: 1;
}
#papa::after {
position: absolute;
content: '';
right: 0;
top: 0;
width: 130px;
height: 80px;
background: linear-gradient(40deg, #eee 40%, #898989 50%);
filter: drop-shadow(0px 0px 8px #444);
}
#canv {
position: absolute;
display: block;
opacity: 1;
animation: opa 20s infinite alternate linear;
}
#vid { display: none; }
#mplayer {
position: absolute;
top: 10px;
right: 10px;
width: 30px;
height: 30px;
border: 2px solid var(--bd);
border-radius: 50%;
box-shadow: 0 0 10px var(--sd);
transition: .7s;
cursor: pointer;
display: grid;
place-items: center;
z-index: 2;
--play: 1; --pause: 0; --bd: #435D03; --sd: white;
}
#mplayer::before, #mplayer::after {
position: absolute;
content: '';
border-style: solid;
border-color: var(--bd);
transition: .4s;
}
#mplayer::before {
width: 0;
height: 0;
left: 10px;
border-width: 10px 12px;
border-color: transparent transparent transparent var(--bd);
opacity: var(--play);
}
#mplayer::after {
width: 2px;
height: 16px;
border-width: 0 4px 0 4px;
opacity: var(--pause);
}
#mplayer:hover { box-shadow: 0 0 10px var(--sd), 0 0 10px var(--sd) inset; }
</style>
<div id="papa">
<canvas id="canv"></canvas>
<div id="mplayer"></div>
</div>
<audio id="aud" src="https://music.163.com/song/media/outer/url?id=1366016806" loop autoplay></audio>
<video id="vid" src="https://img.tukuppt.com/video_show/3670683/00/02/00/5b4edd64165f5.mp4" poster="https://638183.freep.cn/638183/t23/webp/yufj.webp" loop muted></video>
<script>
(function () {
let ctx = canv.getContext('2d'), pic = new Image();
let ww = canv.width = papa.offsetWidth, hh = canv.height = papa.offsetHeight;
pic.src = vid.poster;
pic.onload = () => ctx.drawImage(pic,0,0,ww,hh);
let mState = () => aud.paused ? vid.pause() : vid.play();
let loop = () => {ctx.drawImage(vid, 0, 0, ww, hh);if(!vid.paused) {requestAnimationFrame(loop);return;}};
vid.addEventListener('play', loop, false);
aud.addEventListener('play', () => mState());
aud.addEventListener('pause', () => mState());
mplayer.addEventListener('click', () => aud.paused ? aud.play() : aud.pause());
})();
</script>
帖子代码
<style>
#papa {
margin: 80px 0 0 calc(50% - 593px);
width: 1024px;
height: 640px;
background: gray;
box-shadow: 3px 3px 20px #000;
position: relative;
z-index: 1;
}
#papa::after {
position: absolute;
content: '';
right: 0;
top: 0;
width: 130px;
height: 80px;
background: linear-gradient(40deg, #eee 40%, #898989 50%);
filter: drop-shadow(0px 0px 8px #444);
}
#canv {
position: absolute;
display: block;
opacity: 1;
animation: opa 20s infinite alternate linear;
}
#vid { display: none; }
#mplayer {
position: absolute;
top: 10px;
right: 10px;
width: 30px;
height: 30px;
border: 2px solid var(--bd);
border-radius: 50%;
box-shadow: 0 0 10px var(--sd);
transition: .7s;
cursor: pointer;
display: grid;
place-items: center;
z-index: 2;
--play: 1; --pause: 0; --bd: #435D03; --sd: white;
}
#mplayer::before, #mplayer::after {
position: absolute;
content: '';
border-style: solid;
border-color: var(--bd);
transition: .4s;
}
#mplayer::before {
width: 0;
height: 0;
left: 10px;
border-width: 10px 12px;
border-color: transparent transparent transparent var(--bd);
opacity: var(--play);
}
#mplayer::after {
width: 2px;
height: 16px;
border-width: 0 4px 0 4px;
opacity: var(--pause);
}
#mplayer:hover { box-shadow: 0 0 10px var(--sd), 0 0 10px var(--sd) inset; }
</style>
<div id="papa">
<canvas id="canv"></canvas>
<div id="mplayer"></div>
</div>
<audio id="aud" src="https://music.163.com/song/media/outer/url?id=1366016806" loop autoplay></audio>
<video id="vid" src="https://img.tukuppt.com/video_show/3670683/00/02/00/5b4edd64165f5.mp4" poster="https://638183.freep.cn/638183/t23/webp/yufj.webp" loop muted></video>
<script>
(function () {
let ctx = canv.getContext('2d'), pic = new Image();
let ww = canv.width = papa.offsetWidth, hh = canv.height = papa.offsetHeight;
pic.src = vid.poster;
pic.onload = () => ctx.drawImage(pic,0,0,ww,hh);
let mState = () => aud.paused ? vid.pause() : vid.play();
let loop = () => {ctx.drawImage(vid, 0, 0, ww, hh);if(!vid.paused) {requestAnimationFrame(loop);return;}};
vid.addEventListener('play', loop, false);
aud.addEventListener('play', () => mState());
aud.addEventListener('pause', () => mState());
mplayer.addEventListener('click', () => aud.paused ? aud.play() : aud.pause());
})();
</script>
本帖机制:
一个视频+一幅来自视频的图片,全在 video 标签里(72行)。video 标签有一个 poster 属性,就是视频的海报,即视频还没有播放前的首图。使用首图的用意在于兼容不开启视频自动播放的浏览器,若访问者的浏览器确实不支持视频的自动播放,则呈现poster海报画面,访问者会因之对视频感兴趣,就会点击播放按钮。
为此,canvas画布第一件要做的事情是将poster海报画面绘制出来(80行),绘制之前要有一些必要的准备(77、78、79行),这些准备有一部分也为后面绘制视频而做。
画布是整个帖子的主呈现场景,视频标签没有在帖子上出现,它在后台发力,将视频内容投射到画布之上。
音频在帖子中是独立存在的,而且它很重要,视频是否投影到画布上,根据的是音频标签的运行状态。 至于帖子右上角的卷角设计,你懂的,是将视频的logo遮掩起来。穷人办公穷开心,白嫖省钱过日子没点小心计美滋滋不起来哒。 video 标签有一个 poster 属性,就是视频的海报。
这个标签又是第一次看到呢{:4_187:} 马黑黑 发表于 2023-3-27 08:16
至于帖子右上角的卷角设计,你懂的,是将视频的logo遮掩起来。穷人办公穷开心,白嫖省钱过日子没点小心计美 ...
一进来就看到了这个小的折页效果,看得笑{:4_173:} 鹰飞鱼跃,好美。黑黑又把这个小而美的播放器做成了实例帖子{:4_187:} 红影 发表于 2023-3-27 10:27
鹰飞鱼跃,好美。黑黑又把这个小而美的播放器做成了实例帖子
它在那边已经是实例了,这里只是安插在帖子里 红影 发表于 2023-3-27 10:23
video 标签有一个 poster 属性,就是视频的海报。
这个标签又是第一次看到呢
video标签不是第一次看到,是它的 poster 属性,之前一直都不使用 红影 发表于 2023-3-27 10:25
一进来就看到了这个小的折页效果,看得笑
设计精妙吧 马黑黑 发表于 2023-3-27 08:16
至于帖子右上角的卷角设计,你懂的,是将视频的logo遮掩起来。穷人办公穷开心,白嫖省钱过日子没点小心计美 ...
{:4_170:}
土豪为穷人用心机了 黑黑这教程速度太快了,我今天稍微看了一下,作业拉下一大堆了{:4_198:} 小辣椒 发表于 2023-3-27 13:44
黑黑这教程速度太快了,我今天稍微看了一下,作业拉下一大堆了
都大同小异吧 小辣椒 发表于 2023-3-27 13:42
土豪为穷人用心机了
{:4_203:} 马黑黑 发表于 2023-3-27 17:21
都大同小异吧
反正都没有做的 马黑黑 发表于 2023-3-27 17:22
用词不当{:4_170:}
土豪为穷人精打细算了 绝美风景迷人之极 雨中悄然 发表于 2023-3-27 17:58
绝美风景迷人之极
视频的动态设计还不是很理想 小辣椒 发表于 2023-3-27 17:27
用词不当
土豪为穷人精打细算了
{:4_172:} 小辣椒 发表于 2023-3-27 17:26
反正都没有做的
中意哪一个有空了做做就好