马黑黑 发表于 2022-7-19 07:44

都是我的

<style>
#papa { left: -214px; width: 1024px; height: 800px; box-shadow: 3px 3px 30px #000; border-radius: 6px; background: rgba(0,0,0,.6) url('https://638183.freep.cn/638183/t22/hl//000.jpg') no-repeat center/cover; perspective: 2000px;position: relative; }
#ani { position: absolute; left: calc(50% - 150px); top: calc(50% - 350px); width: 600px; height: 700px; box-shadow: 2px 2px 10px #000; background: #ccc; transform-style: preserve-3d; }
#papa p { margin: 0; padding: 0; }
#papa input { border: none; outline: none; opacity: .75; cursor: pointer; }
#playbox { position: absolute; left: 20px; bottom: 20px; padding: 10px; font: normal 1em sans-serif; color: #eee; background: rgba(255,255,255,.2); border-radius: 8px; backdrop-filter: blur(1px); overflow: hidden; box-shadow: 1px 1px 2px rgba(0,0,0,.15); z-index: 100; }
#btnplay { width: 30px; height: 30px; border-radius: 50%; }
#btnplay:hover { background: #aaa; color: #ff0000; }
@keyframes ani1 { 20% { transform: rotateY(30deg); } 40% { transform: rotateY(-30deg); } 0%,60%,100% {transform: rotateY(0deg); } }
@keyframes ani2 { 20% { transform: rotateX(15deg); } 40% { transform: rotateX(-15deg); } 0%,60%,100%{transform: rotateX(0deg); } }
@keyframes ani3 { 20% { transform: rotateZ(20deg); } 40% { transform: rotateZ(-20deg); } 0%,60%,100% {transform: rotateZ(0deg); } }
@keyframes ani4 { 20% { transform: scale(1.2); } 40% { transform: scale(0.8); } 0%,60%,100% {transform: scale(1); } }
@keyframes ani5 { 20% { transform: skew(15deg); } 40% { transform: skew(-15deg); } 0%,60%,100% {transform: skew(0deg); }}
@keyframes in { from { transform: rotate(0) scale(0); } to {transform: rotate(1turn) scale(1); } }
@keyframes out{ from { transform: rotate(0) scale(1); } to {transform: rotate(-1turn) scale(0); } }
</style>

<div id="papa">
        <img id="ani" alt="" src="https://638183.freep.cn/638183/t22/hl//001.jpg">
        <div id="playbox">
                <p id="geci" style="font-size: 1.2em; text-shadow: 1px 1px 1px #222">loading ... </p>
                <p style="display: flex; align-items: center; gap: 4px; margin-top: 10px;">
                        <input id="btnplay" type="button" value=">" />
                        <input id="slider" type="range" min="0" max="100" value="0" />
                        <span id="per">00:00</span>
                </p>
        </div>
</div>
<audio id="aud" src="https://music.163.com/song/media/outer/url?id=415786856.mp3" autoplay="autoplay" loop="loop"></audio>

<script>
let flag = 0, last = 0;
let picAr = [
        'https://638183.freep.cn/638183/t22/hl//001.jpg',
        'https://638183.freep.cn/638183/t22/hl//002.jpg',
        'https://638183.freep.cn/638183/t22/hl//003.jpg',
        'https://638183.freep.cn/638183/t22/hl//004.jpg',
        'https://638183.freep.cn/638183/t22/hl//005.jpg',
        'https://638183.freep.cn/638183/t22/hl//006.jpg',
        'https://638183.freep.cn/638183/t22/hl//007.jpg',
        'https://638183.freep.cn/638183/t22/hl//008.jpg',
        'https://638183.freep.cn/638183/t22/hl//009.jpg',
        'https://638183.freep.cn/638183/t22/hl//010.jpg',

];
let aniAr = Array.from({length:5}, (_, x) => 'ani' + (x+1));
let num = (min, max) => Math.floor(Math.random() * (max-min+1)) + min;
let lrcAr = [ ['0.00','纯音乐 - All of Me'], ['240.00','祝樵歌消暑愉快'] ];

picAni();

function picAni() {
        if(flag == 0) {
                let pic = num(0, picAr.length - 1);
                if(pic == last) pic = last < 1 ? pic + 1 : pic - 1;
                ani.src = picAr;
                ani.style.animation = 'in 8s linear forwards';
                last = pic;
                flag = 1;
        } else if(flag == 1) {
                let idx = num(0,aniAr.length - 1);
                ani.style.animation = aniAr + ' 8s linear forwards';
                flag = 2
        } else {
                ani.style.animation = 'out 8s linear forwards';
                flag = 0;
        }
        setTimeout(picAni,8000);
}

slider.onmousedown = () => aud.pause();
slider.onchange = () => { aud.currentTime = slider.value * aud.duration / 100; aud.play(); }
btnplay.onclick = () => aud.paused ? aud.play() : aud.pause();
aud.addEventListener('playing', () => btnplay.value = '||');
aud.addEventListener('pause', () => btnplay.value = '>');

aud.addEventListener('timeupdate', () => {
        let prog = 100 * aud.currentTime / aud.duration;
        slider.value = prog;
        per.innerText = toMin(aud.currentTime) + ' | ' + toMin(aud.duration);
        for(j=0; j<lrcAr.length; j++){
                if(aud.currentTime >= lrcAr) geci.innerHTML = lrcAr;
        }
});

let toMin = (val) => {
        if(!val) return '00:00';
        val = Math.floor(val);
        let min = parseInt(val / 60);
        let sec = parseFloat(val % 60);
        if(min < 10) min = '0' + min;
        if(sec < 10) sec = '0' + sec;
        return min + ':' + sec;
}
</script>

马黑黑 发表于 2022-7-19 07:45

代码分享:(昨晚睡前弄的,没有严格测试过,欢迎指正)
<style>
#papa { left: -214px; width: 1024px; height: 800px; box-shadow: 3px 3px 30px #000; border-radius: 6px; background: rgba(0,0,0,.6) url('https://638183.freep.cn/638183/t22/hl//000.jpg') no-repeat center/cover; perspective: 2000px;position: relative; }
#ani { position: absolute; left: calc(50% - 150px); top: calc(50% - 350px); width: 600px; height: 700px; box-shadow: 2px 2px 10px #000; background: #ccc; transform-style: preserve-3d; }
#papa p { margin: 0; padding: 0; }
#papa input { border: none; outline: none; opacity: .75; cursor: pointer; }
#playbox { position: absolute; left: 20px; bottom: 20px; padding: 10px; font: normal 1em sans-serif; color: #eee; background: rgba(255,255,255,.2); border-radius: 8px; backdrop-filter: blur(1px); overflow: hidden; box-shadow: 1px 1px 2px rgba(0,0,0,.15); z-index: 100; }
#btnplay { width: 30px; height: 30px; border-radius: 50%; }
#btnplay:hover { background: #aaa; color: #ff0000; }
@keyframes ani1 { 20% { transform: rotateY(30deg); } 40% { transform: rotateY(-30deg); } 0%,60%,100% {transform: rotateY(0deg); } }
@keyframes ani2 { 20% { transform: rotateX(15deg); } 40% { transform: rotateX(-15deg); } 0%,60%,100%{transform: rotateX(0deg); } }
@keyframes ani3 { 20% { transform: rotateZ(20deg); } 40% { transform: rotateZ(-20deg); } 0%,60%,100% {transform: rotateZ(0deg); } }
@keyframes ani4 { 20% { transform: scale(1.2); } 40% { transform: scale(0.8); } 0%,60%,100% {transform: scale(1); } }
@keyframes ani5 { 20% { transform: skew(15deg); } 40% { transform: skew(-15deg); } 0%,60%,100% {transform: skew(0deg); }}
@keyframes in { from { transform: rotate(0) scale(0); } to {transform: rotate(1turn) scale(1); } }
@keyframes out{ from { transform: rotate(0) scale(1); } to {transform: rotate(-1turn) scale(0); } }
</style>

<div id="papa">
        <img id="ani" alt="" src="https://638183.freep.cn/638183/t22/hl//001.jpg">
        <div id="playbox">
                <p id="geci" style="font-size: 1.2em; text-shadow: 1px 1px 1px #222">loading ... </p>
                <p style="display: flex; align-items: center; gap: 4px; margin-top: 10px;">
                        <input id="btnplay" type="button" value=">" />
                        <input id="slider" type="range" min="0" max="100" value="0" />
                        <span id="per">00:00</span>
                </p>
        </div>
</div>
<audio id="aud" src="https://music.163.com/song/media/outer/url?id=415786856.mp3" autoplay="autoplay" loop="loop"></audio>

<script>
let flag = 0, last = 0;
let picAr = [
        'https://638183.freep.cn/638183/t22/hl//001.jpg',
        'https://638183.freep.cn/638183/t22/hl//002.jpg',
        'https://638183.freep.cn/638183/t22/hl//003.jpg',
        'https://638183.freep.cn/638183/t22/hl//004.jpg',
        'https://638183.freep.cn/638183/t22/hl//005.jpg',
        'https://638183.freep.cn/638183/t22/hl//006.jpg',
        'https://638183.freep.cn/638183/t22/hl//007.jpg',
        'https://638183.freep.cn/638183/t22/hl//008.jpg',
        'https://638183.freep.cn/638183/t22/hl//009.jpg',
        'https://638183.freep.cn/638183/t22/hl//010.jpg',

];
let aniAr = Array.from({length:5}, (_, x) => 'ani' + (x+1));
let num = (min, max) => Math.floor(Math.random() * (max-min+1)) + min;
let lrcAr = [ ['0.00','纯音乐 - All of Me'], ['240.00','祝樵歌消暑愉快'] ];

picAni();

function picAni() {
        if(flag == 0) {
                let pic = num(0, picAr.length - 1);
                if(pic == last) pic = last < 1 ? pic + 1 : pic - 1;
                ani.src = picAr;
                ani.style.animation = 'in 8s linear forwards';
                last = pic;
                flag = 1;
        } else if(flag == 1) {
                let idx = num(0,aniAr.length - 1);
                ani.style.animation = aniAr + ' 8s linear forwards';
                flag = 2
        } else {
                ani.style.animation = 'out 8s linear forwards';
                flag = 0;
        }
        setTimeout(picAni,8000);
}

slider.onmousedown = () => aud.pause();
slider.onchange = () => { aud.currentTime = slider.value * aud.duration / 100; aud.play(); }
btnplay.onclick = () => aud.paused ? aud.play() : aud.pause();
aud.addEventListener('playing', () => btnplay.value = '||');
aud.addEventListener('pause', () => btnplay.value = '>');

aud.addEventListener('timeupdate', () => {
        let prog = 100 * aud.currentTime / aud.duration;
        slider.value = prog;
        per.innerText = toMin(aud.currentTime) + ' | ' + toMin(aud.duration);
        for(j=0; j<lrcAr.length; j++){
                if(aud.currentTime >= lrcAr) geci.innerHTML = lrcAr;
        }
});

let toMin = (val) => {
        if(!val) return '00:00';
        val = Math.floor(val);
        let min = parseInt(val / 60);
        let sec = parseFloat(val % 60);
        if(min < 10) min = '0' + min;
        if(sec < 10) sec = '0' + sec;
        return min + ':' + sec;
}
</script>

浣溪沙 发表于 2022-7-19 07:47

你的都很美{:4_172:}

浣溪沙 发表于 2022-7-19 07:48

哥蹭养眼{:4_170:}

马黑黑 发表于 2022-7-19 07:55

原理:

一、关于关键帧动画(@keyframes)

每一位模特的表演分出场、展示、退场三种类型,通过 flag 标识变量依次执行,完了换下一个模特。这意味着定时器 setTimeout 要运行3个8秒钟才换人。换人时随机的,换人时尽量避免一位模特连续出场。

展示关键帧动画共有5种模式,也是随机但可以连续重复,一切看概率。

二、关于布局

其实简单,图片居中、往右边挪一点,都是在CSS中用 calc 来计算。

可能有人会想,好端端的T台不走,往边靠干嘛呢。嗯,这是野路子服展,不拘一格。

马黑黑 发表于 2022-7-19 07:59

本帖最后由 马黑黑 于 2022-7-19 08:05 编辑

服装模特是个好职业。职业的技能人人可学,这里有个秘籍,一般人我不告诉他:

出来时怎么走都行,表情要放松,是出来逛街的样纸就好,然后尿急了,要找WC,左看看,没有,右看看,也没有,好吧,回家尿尿去。

马黑黑 发表于 2022-7-19 08:06

浣溪沙 发表于 2022-7-19 07:47
你的都很美

早啊!据说早晨看镁铝,一整天都可以上班摸鱼。

马黑黑 发表于 2022-7-19 08:06

浣溪沙 发表于 2022-7-19 07:48
哥蹭养眼

妹吧

加林森 发表于 2022-7-19 09:10

知道知道,都是你的。{:4_189:}

加林森 发表于 2022-7-19 09:10

7个动画在转,老黑厉害。{:4_199:}

樵歌 发表于 2022-7-19 09:57

知道都是你的,没人和你抢{:4_334:}

梦油 发表于 2022-7-19 10:36

爽心悦目!赞!

马黑黑 发表于 2022-7-19 12:33

加林森 发表于 2022-7-19 09:10
知道知道,都是你的。

樵歌说的吧

马黑黑 发表于 2022-7-19 12:34

梦油 发表于 2022-7-19 10:36
爽心悦目!赞!

谢谢,请用茶{:4_190:}

马黑黑 发表于 2022-7-19 12:36

加林森 发表于 2022-7-19 09:10
7个动画在转,老黑厉害。

这都数出来了,厉害哈

马黑黑 发表于 2022-7-19 12:36

樵歌 发表于 2022-7-19 09:57
知道都是你的,没人和你抢

看歌曲的最后一句

加林森 发表于 2022-7-19 12:41

马黑黑 发表于 2022-7-19 12:36
这都数出来了,厉害哈

我跟着你又制作出来一个。你帮着看看。谢谢!

加林森 发表于 2022-7-19 12:42

马黑黑 发表于 2022-7-19 12:33
樵歌说的吧

这个就不清楚了。

马黑黑 发表于 2022-7-19 12:42

加林森 发表于 2022-7-19 12:42
这个就不清楚了。

去了解一下

马黑黑 发表于 2022-7-19 12:43

加林森 发表于 2022-7-19 12:41
我跟着你又制作出来一个。你帮着看看。谢谢!

早看到了
页: [1] 2 3 4 5
查看完整版本: 都是我的