小辣椒 发表于 2022-12-21 21:09
那是肯定不会太累的
累累更健康
马黑黑 发表于 2022-12-21 22:05
累累更健康
我最怕累{:4_203:}
小辣椒 发表于 2022-12-21 22:09
我最怕累
累是一种锻炼
马黑黑 发表于 2022-12-21 22:11
累是一种锻炼
这个锻炼我不喜欢的{:4_189:}
小辣椒 发表于 2022-12-21 22:12
这个锻炼我不喜欢的
所以身体弱
马黑黑 发表于 2022-12-21 22:12
所以身体弱
我走路都难得做的{:4_170:}
小辣椒 发表于 2022-12-21 22:15
我走路都难得做的
{:4_203:}
36. 3d四面体播放器
(一)插件代码
(function(mkPlayer) {let defaults = {lrcAr: [,],ttAr: ['花潮','论坛','LRC','在线'],lrc_css: 'top: 20px; left: 50%; transform: translateX(-50%);',player_css: 'bottom: 20px; left: calc(50% - 60px);', total: 20,playerCode: `<style>#mplayer {--bg: silver;position: absolute;height: 200px;width: 160px;color: #fff;transform-style: preserve-3d;animation: spin 10s linear infinite;transform-origin: 58px 100px 58px;cursor: pointer;}#mplayer > div {position: absolute;border-style: solid;border-width: 100px 0 100px 173px;transform-origin: 0 0;border-color: transparent transparent transparent var(--bg);}#mplayer > div:after {position: absolute;content: attr(data-txt);text-box: 1px 1px 2px #000;left: -130px;top: -20px;text-align: center;font: bold 2em sans-serif;}#mplayer > div:nth-of-type(1){transform: rotateY(-19.5deg) rotateX(180deg) translateY(-200px);opacity: .6;}#mplayer > div:nth-of-type(2) {transform: rotateY(90deg) rotateZ(60deg) rotateX(180deg) translateY(-200px);opacity: .7;}#mplayer > div:nth-of-type(3) {transform: rotateX(60deg) rotateY(19.5deg);opacity: .8;}#mplayer > div:nth-of-type(4) {transform: rotateX(-60deg) rotateY(19.5deg) translateX(-58px) translateY(-100px) translateZ(163px);opacity: .9;}#btnMsg { position: absolute; color: snow; background: #666; opacity: 0; border: 2px solid snow; border-radius: 8px; padding: 4px; transition: all .75s; cursor: pointer; z-index: 901; }#lrc { --motion: cover2; --tt: 1s; --state: running; --bg: linear-gradient(180deg,hsla(100,10%,50%,.75),hsla(100,100%,20%,.65)); position: absolute; font: bold 2.4em sans-serif; color: hsl(100, 100%, 90%); white-space: pre; -webkit-background-clip: text; filter: drop-shadow(1px 1px 2px hsla(0, 100%, 0%, .85)); z-index: 900; }#lrc::before { position: absolute; content: attr(data-lrc); width: 20%; height: 100%; color: transparent; overflow: hidden; white-space: pre; background: var(--bg); filter: inherit; -webkit-background-clip: text; animation: var(--motion) var(--tt) linear forwards; animation-play-state: var(--state); }@keyframes spin {from { transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg); }to { transform: rotateX(360deg) rotateY(360deg) rotateZ(360deg); }}@keyframes cover1 { from { width: 0; }to { width: 100%; } }@keyframes cover2 { from { width: 0; } to { width: 100%; } }</style><div id="lrc" data-lrc="HCPlayer">HCPlayer</div><div id="mplayer"><div data-txt="花潮"></div><div data-txt="花潮"></div><div data-txt="花潮"></div><div data-txt="花潮"></div></div><span id="btnMsg">全屏观赏</span>`,};let playCode = (user_config) => {let data = Object.assign({}, defaults, user_config);papa.innerHTML += data.playerCode;mplayer.style.cssText += data.player_css;lrc.style.cssText += data.lrc_css;let mKey = 0, mFlag = true, fs = false, tnow = Date.now(), timerId;;data.ttAr.forEach( (item,key) => {let divs = mplayer.children;divs.setAttribute('data-txt',item);});mplayer.onclick = () => aud.paused ? aud.play() : aud.pause();btnMsg.onclick = () => fs ? document.exitFullscreen() : papa.requestFullscreen();papa.onmousemove = (e) => {clearTimeout(timerId);btnMsg.style.opacity = '.95';timerId = setTimeout('btnMsg.style.opacity = "0"', 3000);};document.addEventListener("fullscreenchange", () => {if (document.fullscreenElement !== null) {fs = true;btnMsg.innerText = '退出全屏';} else {fs = false;btnMsg.innerText = '全屏观赏';}});aud.addEventListener('pause', () => mState());aud.addEventListener('play', () => mState());aud.addEventListener('seeked', () => calcKey());let mState = () => aud.paused ? (lrc.style.setProperty('--state','paused'), mplayer.style.animationPlayState='paused') : (lrc.style.setProperty('--state','running'), mplayer.style.animationPlayState='running');aud.addEventListener('timeupdate', () => {for (j = 0; j < data.lrcAr.length; j++) {if (aud.currentTime >= data.lrcAr) {if (mKey === j) showLrc(data.lrcAr);else continue;}}});let showLrc = (time) => {let name = mFlag ? 'cover1' : 'cover2';lrc.innerHTML = data.lrcAr;lrc.dataset.lrc = data.lrcAr.replace(/<br>/, '\n');lrc.style.setProperty('--motion', name);lrc.style.setProperty('--tt', time + 's');lrc.style.setProperty('--state', 'running');mKey += 1;mFlag = !mFlag;};let calcKey = () => {for (j = 0; j < data.lrcAr.length; j++) {if (aud.currentTime <= data.lrcAr) {mKey = j - 1;break;}}if (mKey < 0) mKey = 0;if (mKey > data.lrcAr.length - 1) mKey = data.lrcAr.length - 1;let time = data.lrcAr - (aud.currentTime - data.lrcAr);showLrc(time);};};mkPlayer.HCPlayer = playCode;})(this);
(二)插件接口 4 个
① lrcAr :花潮格式lrc歌词数组(请参考其它插件的说明)
② ttAr :四面体每一面的文字,各面的文字最多两个字,多了会破坏结构。请用数组方式定义每一面的文本,方法如下:
HCPlayer({
//其他接口参数
ttAr: ['花潮','论坛','琴师','二胡'],
//其他接口参数
});
③ lrc_css :歌词显示设置(请参考其它插件的说明)
④ player_css :一个CSS变量,--bg: 颜色; ,用于设置四面体各面的颜色(四面同色);若干CSS属性设置,主要用于定位播放控制器即四面体的位置,可通过 left / right和 top / bottom 两两配对定位四面体到所需位置,以及文本颜色等。例如:
HCPlayer({
//其他接口参数
ttAr: ['花潮','论坛','琴师','二胡'],
//其他接口参数
player_css: '--bg: tan; bottom: 20px; left: 80%; color: snow;',
});
(三)插件接口参数配置举例
<script>
//这里是插件代码(略)
let lrcAr = [
,
,
//......其他歌词
];
HCPlayer({
lrcAr: lrcAe,
ttAr: ['花潮','论坛','琴师','二胡'],
lrc_css: '--bg: linear-gradient()180deg, tan, orange; left: 20px; top: 20px; color: #ccc;',
player_css: '--bg: tan; bottom: 20px; left: 80%; color: snow;',
});
</script>
(四)应用实例
琴师 - 欢乐水吧 - 花潮论坛 - Powered by Discuz! (huachaowang.com)
37 专辑插件(基于滑杆)
(一)插件代码
(function(mkPlayer) {let defaults = {player_css: 'bottom: 0; left: 50%; transform: translateX(-50%);',mlist_css: 'top: 0; left: 0;',fs_btn: 'left: 0; top: 0;',playerCode: `<style>#mplayer {position: absolute;display: grid;grid-template-areas: 'cur btnplay dur''prog prog prog';gap: 8px 2px;place-items: end center;color: var(--color);font: normal 16px sans-serif;padding-bottom: 20px;z-index: 999;--ww: 260px;--color: hsla(0,0%,100%,.75);--track: hsla(90,100%,95%,.65);--prog: linear-gradient(90deg,hsla(90,30%,50%,.55),hsla(280,40%,50%,.75),hsla(30,100%,50%,.65));}#cur { grid-area: cur; color: var(--color); }#dur { grid-area: dur; color: var(--color); }#btnplay {--state: paused;grid-area: btnplay;background: conic-gradient(red,orange,yellow,green,teal,blue,purple);mask: radial-gradient(transparent 3px,red 0);-webkit-mask: radial-gradient(transparent 3px,red 0);border-radius: 50%;width: 35px;height: 35px;cursor: pointer;animation: rot linear 3s infinite;animation-play-state: var(--state);}#prog {--xx: 0px;grid-area: prog;width: var(--ww);height: 4px;background: var(--track);position: relative;display: grid;place-items: center;border-radius: 4px;}#prog::before, #prog::after { position: absolute; content: ''; }#prog::before {left: 0;width: var(--xx);height: 100%;border-radius: 6px;background: var(--prog);border-radius: 4px;}#prog::after {left: calc(var(--xx) - 12px);opacity: .85;width: 16px;height: 16px;background: radial-gradient(transparent 2px, teal 0, black);border-radius: 50%;cursor: pointer;}#mlist { --color1: lightgreen; --color2: pink;position: absolute; padding: 20px; }#mlist > a { color: var(--color1); cursor: pointer; text-shadow: 1px 1px 2px black; text-decoration: none; }#mlist >a:hover { color: var(--color2); }.sColor { color: var(--color2); }#btnMsg {position: absolute;color: snow;background: black;opacity: 0;border: 2px solid snow;border-radius: 8px;padding: 4px;transition: all .75s;cursor: pointer;z-index: 1000;}@keyframes rot { to { transform: rotate(1turn); } }</style><div id="mlist"></div><div id="mplayer"><span id="btnplay"></span><span id="prog"></span><span id="cur">00:00</span><span id="dur">00:00</span></div><span id="btnMsg">全屏观赏</span>`,};let playCode = (user_config) => {let data = Object.assign({}, defaults, user_config);papa.innerHTML += data.playerCode;mplayer.style.cssText += data.player_css;mlist.style.cssText += data.mlist_css;btnMsg.style.cssText += data.fs_btn;let mDrag = false, timerId, fs = false;let aud = document.createElement('audio');papa.appendChild(aud);(function addList() {let str = '';data.m_ar.forEach( (item,key) => {str += `<a>${key+1} ${data.m_ar}</a><br>`;});mlist.innerHTML = str;})();btnplay.onclick = () => aud.paused ? aud.play() : aud.pause();btnMsg.onclick = () => fs ? document.exitFullscreen() : papa.requestFullscreen();papa.onmousemove = (e) => {clearTimeout(timerId);btnMsg.style.opacity = '.95';timerId = setTimeout('btnMsg.style.opacity = "0"', 3000);};aud.addEventListener('timeupdate', () => {cur.innerText = toMin(aud.currentTime);dur.innerText = toMin(aud.duration);if(mDrag===false) prog.style.setProperty('--xx', aud.currentTime * prog.offsetWidth / aud.duration + 'px');});aud.addEventListener('pause', () => mState());aud.addEventListener('play', () => mState());aud.addEventListener('ended', () => mplay());aud.onerror = () => mplay();prog.onmousedown = () => mDrag = true;document.onmouseup = () => mDrag = false;mplayer.onmouseup = (e) => { if(mDrag) aud.currentTime = aud.duration * e.offsetX / prog.offsetWidth; };mplayer.onmousemove = (e) => { if(mDrag) moveBar(e.offsetX); };let mState = () => aud.paused ? btnplay.style.setProperty('--state', 'paused'): btnplay.style.setProperty('--state', 'running');mplay = (idx=-1) => {if (idx < 0) idx = Math.floor(Math.random() * data.m_ar.length);aud.src = data.m_ar;aud.play();setRed(idx);};document.addEventListener("fullscreenchange", () => {if (document.fullscreenElement !== null) {fs = true;btnMsg.innerText = '退出全屏';} else {fs = false;btnMsg.innerText = '全屏观赏';}});let setRed= (idx) => {let str = mlist.innerHTML;str = str.replace(/<\/?span[^\>]*\>/g,'');str = str.replace(`${idx+1} ${m_ar}`, `${idx+1} <span class="sColor">${m_ar}</span>`);mlist.innerHTML = str;};let moveBar = (x) => {if(x < 0) x = 0;if(x > prog.offsetWidth - 5) x = prog.offsetWidth - 5;prog.style.setProperty('--xx', x + 'px');};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;};mplay();};mkPlayer.HCPlayer = playCode;})(this);
(二)参数说明
① player_css :播放控制器设定,请参考其他有说明的插件
② mlist_css :歌曲列表相关,主要是位置设置(left / right 和 top / bottom 两两配对)、文本颜色(--color1 :歌词列表文本颜色;--color2 :鼠标滑过以及正在播放的歌曲名称文本颜色)。例如:
HCPlayer({
//其他接口代码
mlist_css: 'top: 0; left: 0; --color1: blue; --color2: lightblue;',
//其他接口代码
});
③ fs_btn :全屏按钮设置。可用 CSS 的 color 属性设置文本颜色、background属性设置按钮背景色,以及,用 left / right 和 top / bottom 两两配对设置按钮在帖子中的位置。例如:
HCPlayer({
//其他接口代码
mlist_css: 'top: 0; left: 0; --color1: blue; --color2: lightblue;',
fs_btn: 'left: 0; top: 0;',
});
(三)接口参数配置距离:
HCPlayer({
player_css: '--ww: 300px; --color: hsla(0,0%,100%,.75); --track: hsla(90,100%,95%,.65); --prog: linear-gradient(90deg, tan ,green,yellow); bottom: 0; left: 50%; transform: translateX(-50%);',
mlist_css: 'top: 0; left: 0; --color1: blue; --color2: lightblue;',
fs_btn: 'left: 0; top: 0;',
});
(四)应用实例
婕茜:甜言蜜语者 - 音乐沙龙 - 花潮论坛 - Powered by Discuz! (huachaowang.com)
马黑黑 发表于 2022-11-18 21:01
一、圆环播放器
老师晚上好!我在你“叶水相逢”背景滚动代码中https://www.huachaowang.com/forum.phpmod=viewthread&tid=75034&extra=page%3D1,加了这个歌词+播放器。发帖地址:https://www.huachaowang.com/forum.php?mod=viewthread&tid=75220&page=1&extra=#pid2089896
但是,我引用js文件地址却无法正常显示播放器和背景滚动图。不知道问题出在哪里!“圆环进度条”代码地址:http://mhh.52qingyin.cn/api/player/
你能否给我看看,完整代码如下:
<style>
#papa { margin:0 0 0 calc(50% - 593px);
width: 1024px;
height: 600px;
box-shadow: 3px 3px 6px #333;
z-index: 1; }
#canv { cursor: pointer; }
</style>
<div id="papa">
<audio id="aud" src="https://od.lk/s/NzBfMTY1MzM3MDlf/042-%E8%8A%B1%E5%BC%80%E7%9A%84%E6%97%B6%E5%80%99%E4%BD%A0%E5%B0%B1%E6%9D%A5%E7%9C%8B%E6%88%91-%E9%98%BF%E5%AE%9D_%E5%BC%A0%E5%86%AC%E7%8E%B2.mp3" autoplay loop></audio>
<canvas id="canv" width="1200" height="600" style="border: 1px solid gray" title="播放/暂停"></canvas>
</div>
<script>/* 画面移动代码改自Firefox工程师的示例 */
(function() {
let script = document.createElement('script');
script.src = ' https://638183.freep.cn/638183/web/api/circle_lrc.js';
script.charset = 'utf-8';
document.head.appendChild(script);
script.onload = () => {
let geci = [
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
];
HCPlayer({
papa: '#papa',
lrcAr: geci,
lrc_css: `
top: 20px;
color: silver;
--bg: linear-gradient(rgba(10,200,100,.4),rgba(10,200,100,.7));
`,
player_css: `
bottom: 10px;
--track: rgba(255,255,255,.6);
--prog: rgba(10,250,10,.6);
--color: snow;
`,
fs_css: `
left: 20px;
top: 20px;
--color: snow;
--bg: #333;
`,
});
};
})();
(function () {
let ctx = canv.getContext("2d");
let img = new Image();
img.src = "https://pic.imgdb.cn/item/660a18b59f345e8d03e9375a.jpg";
let CanvasXSize = papa.offsetWidth,
CanvasYSize = papa.offsetHeight,
speed = 30,
scale = 1.05,
x = 0,
y = -4.5,
dx = 0.75;
let imgW, imgH, clearX, clearY, mTimer;
let draw = () => {
ctx.clearRect(0, 0, clearX, clearY);
if(imgW <= CanvasXSize) {
if(x > CanvasXSize) x = -imgW + x;
if(x > 0) ctx.drawImage(img, -imgW + x, y, imgW, imgH);
if(x - imgW > 0)
ctx.drawImage(img, -imgW * 2 + x, y, imgW, imgH);
}else{
if(x > CanvasXSize) x = CanvasXSize - imgW;
if(x > CanvasXSize - imgW) ctx.drawImage(img, x - imgW + 1, y, imgW, imgH);
}
ctx.drawImage(img, x, y, imgW, imgH);
x += dx;
};
let mState = () => mTimer = aud.paused ? clearInterval(mTimer) : setInterval(draw, speed);
img.onload = () => {
imgW = img.width * scale;
imgH = img.height * scale;
if(imgW > CanvasXSize) x = CanvasXSize - imgW;
clearX = imgW > CanvasXSize ? imgW : CanvasXSize;
clearY = imgH > CanvasYSize ? imgH : CanvasYSize;
draw();
};
aud.onpause = aud.onplaying = () => mState();
canv.onclick = () => aud.paused ? aud.play() : aud.pause();
})();
</script>
执著 发表于 2024-4-1 20:32
老师晚上好!我在你“叶水相逢”背景滚动代码中https://www.huachaowang.com/forum.phpmod=viewthread&ti ...
你这个将多种实现代码编程一个帖子,这需要较为坚实的基础,暂时不建议这么玩。
马黑黑 发表于 2024-4-1 21:26
你这个将多种实现代码编程一个帖子,这需要较为坚实的基础,暂时不建议这么玩。
这样呀!谢谢老师指点{:4_204:}
执著 发表于 2024-4-1 22:30
这样呀!谢谢老师指点
拼凑代码还不是时候,先模仿,等有一定基础了,再拼凑
马黑黑 发表于 2024-4-1 22:38
拼凑代码还不是时候,先模仿,等有一定基础了,再拼凑
嗯嗯,OK{:4_190:}
执著 发表于 2024-4-1 22:45
嗯嗯,OK
{:4_190:}