马黑黑 发表于 2022-9-1 07:24

大王叫我来巡山

本帖最后由 马黑黑 于 2022-9-1 07:53 编辑 <br /><br /><style>
#papa { left: -214px; width: 1024px; height: 640px; background: gray url('https://638183.freep.cn/638183/Pic/81/dw3.jpg') no-repeat center/cover; box-shadow: 3px 3px 20px #000; overflow: hidden; user-select: none; position: relative; z-index: 1; }
#lrc { position: absolute; left: 370px; top: 40px; font: bold 1.5em sans-serif; color: #306052; text-shadow: 1px 1px 2px #000; letter-spacing: 2px; }
#mplayer { position: absolute; left: 370px; top: 80px; width: fit-content; height: fit-content; display: flex; align-items: center; gap: 8px; }
#btnwrap { width: 28px; height: 28px; background: #9AB38B; border-radius: 50%; display: grid; place-items: center; cursor: pointer; }
#btnwrap:hover { background: #418147; }
#btnplay { width: 16px; height: 16px; background: gold; clip-path: polygon(0 0, 0% 100%, 100% 50%); }
#btnpause { width: 2px; height: 20px; border-style: solid; border-width: 0px 4px; border-color: transparent gold; display: none; }
#prog { width: 200px; height: 2px; background: #CDD8DD linear-gradient(90deg,red,olive,red) no-repeat ; background-size: 1px 2px; position: relative; cursor: pointer; }
#prog::before { position: absolute; top: -5px; height: 12px; width: 200px; content: ''; }
#tmsg { left: 260px; bottom: 16px; color: #306052; }
.ball { position: absolute; left: -10px; top: 0; width: 10px; height: 10px; border-radius: 50%; background: red; animation: move 40s var(--ss) linear infinite; }
@keyframes move {
        0%, 100% { left: 0; top: 0; }
        25% { left: calc(100% - 10px); top: 0; }
        50% { left: calc(100% - 10px); top: calc(100% - 10px); }
        75% { left: 0; top: calc(100% - 10px); }
}
</style>

<div id="papa">
        <span id="lrc">lrc歌词</span>
        <span id="mplayer">
                <span id="btnwrap"><span id="btnplay"></span><span id="btnpause"></span></span>
                <span id="prog"></span>
                <span id="tmsg">00:00 | 00:00</span>
        </span>
</div>

<script>
let lrcAr = [
        ['0.00','大王叫我来巡山'],
        ['4.08','作词:赵英俊'],
        ['5.10','作曲:赵英俊'],
        ['25.02','太阳对我眨眼睛'],
        ['28.07','鸟儿唱歌给我听'],
        ['32.08','我是一个努力干活儿'],
        ['36.03','还不粘人的小妖精'],
        ['40.03','别问我从哪里来'],
        ['44.01','也别问我到哪里去'],
        ['47.09','我要摘下最美的花儿'],
        ['51.08','献给我的小公举'],
        ['57.04','大王叫我来巡山'],
        ['61.02','我把人间转一转'],
        ['65.01','打起我的鼓敲起我的锣'],
        ['68.08','生活充满节奏感'],
        ['72.06','大王叫我来巡山'],
        ['76.04','抓个和尚做晚餐'],
        ['80.01','这山涧的水无比的甜'],
        ['84.01','不羡鸳鸯不羡仙'],
        ['87.07','太阳对我眨眼睛'],
        ['91.07','鸟儿唱歌给我听'],
        ['95.08','我是一个努力干活儿'],
        ['99.01','还不粘人的小妖精'],
        ['103.03','别问我从哪里来'],
        ['106.09','也别问我到哪去'],
        ['110.10','我要摘下最美的花儿'],
        ['114.05','献给我的小公举'],
        ['120.04','大王叫我来巡山'],
        ['124.02','我把人间转一转'],
        ['127.09','打起我的鼓敲起我的锣'],
        ['131.08','生活充满节奏感'],
        ['135.06','大王叫我来巡山'],
        ['139.03','抓个和尚做晚餐'],
        ['143.00','这山涧的水无比的甜'],
        ['146.09','不羡鸳鸯不羡仙'],
        ['165.09','大王 大王'],
        ['167.08','叫我来巡山'],
        ['169.09','大王大王叫我来巡山'],
        ['173.06','大王大王叫我来巡山'],
        ['177.06','大王大王他叫我来巡山'],
        ['181.03','大王叫我来巡山'],
        ['185.02','我把人间转一转'],
        ['188.09','打起我的鼓敲起我的锣'],
        ['192.07','生活充满节奏感'],
        ['196.05','大王叫我来巡山'],
        ['200.03','抓个和尚做晚餐'],
        ['204.00','这山涧的水无比的甜'],
        ['207.10','不羡鸳鸯不羡仙']
];
let aud = new Audio(), lw = prog.offsetWidth;
aud.src = 'https://music.163.com/song/media/outer/url?id=36492807.mp3';
aud.autoplay = true;
aud.loop = true;

Array.from({length: 60}).forEach((item,key) => {
        item = document.createElement('span');
        item.className = 'ball';
        item.style.cssText = `--ss: ${key * 0.5}s; background: #${Math.random().toString(16).substr(-6)};`;
        papa.appendChild(item);
});

prog.onclick = (e) => aud.currentTime = aud.duration * e.offsetX / prog.offsetWidth;

btnwrap.onclick = () => aud.paused ? aud.play() : aud.pause();
aud.addEventListener('playing', ()=> btnstate());
aud.addEventListener('pause', ()=> btnstate());

aud.addEventListener('timeupdate', () => {
        prog.style.backgroundSize = lw * aud.currentTime / aud.duration + 'px 2px';
        tmsg.innerText = toMin(aud.currentTime) + ' | ' + toMin(aud.duration);
        for(j = 0; j < lrcAr.length;j ++) {
                if(aud.currentTime >= lrcAr) lrc.innerText = lrcAr;
        }
});

let btnstate = () => aud.paused ? (btnplay.style.display = 'block', btnpause.style.display = 'none') : (btnplay.style.display = 'none', btnpause.style.display = 'block');

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;
}
</script>

马黑黑 发表于 2022-9-1 07:33

巡山珠子代码:

① CSS ——

.ball { position: absolute; left: -10px; top: 0; width: 10px; height: 10px; border-radius: 50%; background: red; animation: move 40s var(--ss) linear infinite; }
@keyframes move {
      0%, 100% { left: 0; top: 0; }
      25% { left: calc(100% - 10px); top: 0; }
      50% { left: calc(100% - 10px); top: calc(100% - 10px); }
      75% { left: 0; top: calc(100% - 10px); }
}
</style>

② JS ——

Array.from({length: 60}).forEach((item,key) => {
      item = document.createElement('span');
      item.className = 'ball';
      item.style.cssText = `--ss: ${key * 0.5}s; background: #${Math.random().toString(16).substr(-6)};`;
      papa.appendChild(item);
});

马黑黑 发表于 2022-9-1 07:30

本帖最后由 马黑黑 于 2022-9-1 07:44 编辑

代码<style>
#papa { left: -214px; width: 1024px; height: 640px; background: gray url('https://638183.freep.cn/638183/Pic/81/dw3.jpg') no-repeat center/cover; box-shadow: 3px 3px 20px #000; overflow: hidden; user-select: none; position: relative; }
#lrc { position: absolute; left: 370px; top: 40px; font: bold 1.5em sans-serif; color: #306052; text-shadow: 1px 1px 2px #000; letter-spacing: 2px; }
#mplayer { position: absolute; left: 370px; top: 80px; width: fit-content; height: fit-content; display: flex; align-items: center; gap: 8px; }
#btnwrap { width: 28px; height: 28px; background: #9AB38B; border-radius: 50%; display: grid; place-items: center; cursor: pointer; }
#btnwrap:hover { background: #418147; }
#btnplay { width: 16px; height: 16px; background: gold; clip-path: polygon(0 0, 0% 100%, 100% 50%); }
#btnpause { width: 2px; height: 20px; border-style: solid; border-width: 0px 4px; border-color: transparent gold; display: none; }
#prog { width: 200px; height: 2px; background: #CDD8DD linear-gradient(90deg,red,olive,red) no-repeat ; background-size: 1px 2px; position: relative; cursor: pointer; }
#prog::before { position: absolute; top: -5px; height: 12px; width: 200px; content: ''; }
#tmsg { left: 260px; bottom: 16px; color: #306052; }
.ball { position: absolute; left: -10px; top: 0; width: 10px; height: 10px; border-radius: 50%; background: red; animation: move 40s var(--ss) linear infinite; }
@keyframes move {
        0%, 100% { left: 0; top: 0; }
        25% { left: calc(100% - 10px); top: 0; }
        50% { left: calc(100% - 10px); top: calc(100% - 10px); }
        75% { left: 0; top: calc(100% - 10px); }
}
</style>

<div id="papa">
        <span id="lrc">lrc歌词</span>
        <span id="mplayer">
                <span id="btnwrap"><span id="btnplay"></span><span id="btnpause"></span></span>
                <span id="prog"></span>
                <span id="tmsg">00:00 | 00:00</span>
        </span>
</div>

<script>
let lrcAr = [
        ['0.00','大王叫我来巡山'],
        ['4.08','作词:赵英俊'],
        ['5.10','作曲:赵英俊'],
        ['25.02','太阳对我眨眼睛'],
        ['28.07','鸟儿唱歌给我听'],
        ['32.08','我是一个努力干活儿'],
        ['36.03','还不粘人的小妖精'],
        ['40.03','别问我从哪里来'],
        ['44.01','也别问我到哪里去'],
        ['47.09','我要摘下最美的花儿'],
        ['51.08','献给我的小公举'],
        ['57.04','大王叫我来巡山'],
        ['61.02','我把人间转一转'],
        ['65.01','打起我的鼓敲起我的锣'],
        ['68.08','生活充满节奏感'],
        ['72.06','大王叫我来巡山'],
        ['76.04','抓个和尚做晚餐'],
        ['80.01','这山涧的水无比的甜'],
        ['84.01','不羡鸳鸯不羡仙'],
        ['87.07','太阳对我眨眼睛'],
        ['91.07','鸟儿唱歌给我听'],
        ['95.08','我是一个努力干活儿'],
        ['99.01','还不粘人的小妖精'],
        ['103.03','别问我从哪里来'],
        ['106.09','也别问我到哪去'],
        ['110.10','我要摘下最美的花儿'],
        ['114.05','献给我的小公举'],
        ['120.04','大王叫我来巡山'],
        ['124.02','我把人间转一转'],
        ['127.09','打起我的鼓敲起我的锣'],
        ['131.08','生活充满节奏感'],
        ['135.06','大王叫我来巡山'],
        ['139.03','抓个和尚做晚餐'],
        ['143.00','这山涧的水无比的甜'],
        ['146.09','不羡鸳鸯不羡仙'],
        ['165.09','大王 大王'],
        ['167.08','叫我来巡山'],
        ['169.09','大王大王叫我来巡山'],
        ['173.06','大王大王叫我来巡山'],
        ['177.06','大王大王他叫我来巡山'],
        ['181.03','大王叫我来巡山'],
        ['185.02','我把人间转一转'],
        ['188.09','打起我的鼓敲起我的锣'],
        ['192.07','生活充满节奏感'],
        ['196.05','大王叫我来巡山'],
        ['200.03','抓个和尚做晚餐'],
        ['204.00','这山涧的水无比的甜'],
        ['207.10','不羡鸳鸯不羡仙']
];
let aud = new Audio(), lw = prog.offsetWidth;
aud.src = 'https://music.163.com/song/media/outer/url?id=36492807.mp3';
aud.autoplay = true;
aud.loop = true;

Array.from({length: 60}).forEach((item,key) => {
        item = document.createElement('span');
        item.className = 'ball';
        item.style.cssText = `--ss: ${key * 0.5}s; background: #${Math.random().toString(16).substr(-6)};`;
        papa.appendChild(item);
});

prog.onclick = (e) => aud.currentTime = aud.duration * e.offsetX / prog.offsetWidth;

btnwrap.onclick = () => aud.paused ? aud.play() : aud.pause();
aud.addEventListener('playing', ()=> btnstate());
aud.addEventListener('pause', ()=> btnstate());

aud.addEventListener('timeupdate', () => {
        prog.style.backgroundSize = lw * aud.currentTime / aud.duration + 'px 2px';
        tmsg.innerText = toMin(aud.currentTime) + ' | ' + toMin(aud.duration);
        for(j = 0; j < lrcAr.length;j ++) {
                if(aud.currentTime >= lrcAr) lrc.innerText = lrcAr;
        }
});

let btnstate = () => aud.paused ? (btnplay.style.display = 'block', btnpause.style.display = 'none') : (btnplay.style.display = 'none', btnpause.style.display = 'block');

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;
}
</script>

红影 发表于 2022-9-1 09:18

这么多彩珠,太有趣了{:4_199:}

红影 发表于 2022-9-1 09:22

小珠子们整装待发,一起开始巡山了{:4_205:}

红影 发表于 2022-9-1 09:23

可以再多点或者距离拉开点,让它们首尾相接也不错{:4_173:}

东篱闲人 发表于 2022-9-1 09:55

黑黑总玩这技术含量高的。。。。{:5_116:}

梦油 发表于 2022-9-1 10:08

图美、曲好,特别是那游动的彩珠真漂亮。无与伦比!!!

加林森 发表于 2022-9-1 11:45

好活跃的帖子。好玩好玩。

马黑黑 发表于 2022-9-1 12:10

红影 发表于 2022-9-1 09:18
这么多彩珠,太有趣了

太多了老旧电脑的风扇会增速转动{:4_173:}

马黑黑 发表于 2022-9-1 12:11

东篱闲人 发表于 2022-9-1 09:55
黑黑总玩这技术含量高的。。。。

几个珠子而已,没啥含量

马黑黑 发表于 2022-9-1 12:11

红影 发表于 2022-9-1 09:22
小珠子们整装待发,一起开始巡山了

珠子就是小妖精{:4_173:}

马黑黑 发表于 2022-9-1 12:14

红影 发表于 2022-9-1 09:23
可以再多点或者距离拉开点,让它们首尾相接也不错

对的,但巡逻队伍一般不会首尾相接。你看大鹅对付小乌龟的“打反击”,也就是让出几个村子,小乌龟“得胜”之后都纷纷奔赴黄泉。这叫“网开一面”的战术,巡逻也是如此,逻辑上不会采用闭合手法。

马黑黑 发表于 2022-9-1 12:14

加林森 发表于 2022-9-1 11:45
好活跃的帖子。好玩好玩。

符合题意{:4_173:}

马黑黑 发表于 2022-9-1 12:15

梦油 发表于 2022-9-1 10:08
图美、曲好,特别是那游动的彩珠真漂亮。无与伦比!!!

“小妖精”都是漂漂亮亮的{:4_170:}

加林森 发表于 2022-9-1 12:15

马黑黑 发表于 2022-9-1 12:14
符合题意

就是,特别好玩。

马黑黑 发表于 2022-9-1 12:16

加林森 发表于 2022-9-1 12:15
就是,特别好玩。

合适玩玩之用

加林森 发表于 2022-9-1 12:18

马黑黑 发表于 2022-9-1 12:16
合适玩玩之用

我也去试一试。

马黑黑 发表于 2022-9-1 12:19

加林森 发表于 2022-9-1 12:18
我也去试一试。

嗯,加入自己的创意,尽量避免100%套用

加林森 发表于 2022-9-1 12:37

马黑黑 发表于 2022-9-1 12:19
嗯,加入自己的创意,尽量避免100%套用

好的。
页: [1] 2 3 4 5 6
查看完整版本: 大王叫我来巡山