range播放器(初稿)
<style>#mplayer {
--track: lightgreen;
--prog: darkgreen;
width: 400px;
height: fit-content;
font-size: 16px;
color: var(--prog);
background: none;
display: flex;
flex-direction: row;
align-items: center;
gap: 6px;
margin: 20px auto;
}
#prog {
-webkit-appearance: none;
flex-grow: 1;
background: none;
}
#prog::-webkit-slider-runnable-track {
background: linear-gradient(90deg, var(--track), var(--track)) no-repeat center / 100% 2px;
}
#prog::-webkit-slider-thumb {
-webkit-appearance: none;
height: 20px;
width: 20px;
border-radius: 50%;
background: radial-gradient(var(--track) 30%, var(--prog) 40%, var(--prog) 100%);
cursor: pointer;
}
#prog::-moz-range-track {
background: linear-gradient(90deg, lightgreen, lightgreen) no-repeat center / 100% 6px;
}
#prog::-moz-range-thumb {
-webkit-appearance: none;
height: 20px;
width: 20px;
border-radius: 50%;
background: radial-gradient(lightgreen 40%, green 45%, darkgreen 100%);
cursor: pointer;
}
#btnPlay {
width: 28px;
height: 28px;
border-radius: 25%;
box-shadow: inset 0 0 3px 0 var(--prog);
cursor: pointer;
display: grid;
place-items: center;
}
#btnPlay:hover::after {
opacity: .7;
}
#btnPlay::after {
content:'';
width: 16px;
height: 16px;
background: var(--prog);
clip-path: var(--clip);
}
.play {
--clip: polygon(10% 0, 100% 50%, 10% 100%);
}
.pause {
--clip: polygon(40% 0, 40% 100%, 20% 100%, 20% 0, 80% 0, 80% 100%, 60% 100%, 60% 0);
}
</style>
<div id="mplayer">
<div id="btnPlay" class="pause" title="Alt+X"></div>
<input id="prog" type="range" step="0.5" value="0" min="0" max="100" />
<div id="timebox">00:00/00:00</div>
</div>
<audio src="https://music.163.com/song/media/outer/url?id=1436384887" autoplay loop></audio>
<script>
let busy = false;
const aud = document.querySelector('audio');
const mState = () => {
if (aud.paused) {
btnPlay.className = 'play';
} else {
btnPlay.className = 'pause';
}
};
const formatTime = (seconds) => {
const mins = Math.floor(seconds / 60);
const secs = Math.floor(seconds % 60);
return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
};
aud.addEventListener('playing', mState);
aud.addEventListener('pause', mState);
aud.addEventListener('timeupdate', (e) => {
if (!busy) {
prog.value = aud.currentTime / aud.duration * 100;
timebox.innerText = formatTime(aud.currentTime) + '/' + formatTime(aud.duration);
}
});
btnPlay.addEventListener('click', () => aud.paused ? aud.play() : aud.pause());
prog.addEventListener('mousedown', () => busy = true);
prog.addEventListener('mouseup', () => {
aud.currentTime = aud.duration * prog.value / 100;
busy = false;
});
prog.addEventListener('input', () =>
timebox.innerText = formatTime(aud.duration * prog.value / 100) +
'/' + formatTime(aud.duration)
);
document.addEventListener('keydown', (e) => {
if (e.altKey && e.key === 'x') btnPlay.click();
});
</script>
代码:
<style>
#mplayer {
--track: lightgreen;
--prog: darkgreen;
width: 400px;
height: fit-content;
font-size: 16px;
color: var(--prog);
background: none;
display: flex;
flex-direction: row;
align-items: center;
gap: 6px;
margin: 20px auto;
}
#prog {
-webkit-appearance: none;
flex-grow: 1;
background: none;
}
#prog::-webkit-slider-runnable-track {
background: linear-gradient(90deg, var(--track), var(--track)) no-repeat center / 100% 2px;
}
#prog::-webkit-slider-thumb {
-webkit-appearance: none;
height: 20px;
width: 20px;
border-radius: 50%;
background: radial-gradient(var(--track) 30%, var(--prog) 40%, var(--prog) 100%);
cursor: pointer;
}
#prog::-moz-range-track {
background: linear-gradient(90deg, lightgreen, lightgreen) no-repeat center / 100% 6px;
}
#prog::-moz-range-thumb {
-webkit-appearance: none;
height: 20px;
width: 20px;
border-radius: 50%;
background: radial-gradient(lightgreen 40%, green 45%, darkgreen 100%);
cursor: pointer;
}
#btnPlay {
width: 28px;
height: 28px;
border-radius: 25%;
box-shadow: inset 0 0 3px 0 var(--prog);
cursor: pointer;
display: grid;
place-items: center;
}
#btnPlay:hover::after {
opacity: .7;
}
#btnPlay::after {
content:'';
width: 16px;
height: 16px;
background: var(--prog);
clip-path: var(--clip);
}
.play {
--clip: polygon(10% 0, 100% 50%, 10% 100%);
}
.pause {
--clip: polygon(40% 0, 40% 100%, 20% 100%, 20% 0, 80% 0, 80% 100%, 60% 100%, 60% 0);
}
</style>
<div id="mplayer">
<div id="btnPlay" class="pause" title="Alt+X"></div>
<input id="prog" type="range" step="0.5" value="0" min="0" max="100" />
<div id="timebox">00:00/00:00</div>
</div>
<audio src="https://music.163.com/song/media/outer/url?id=1436384887" autoplay loop></audio>
<script>
let busy = false;
const aud = document.querySelector('audio');
const mState = () => {
if (aud.paused) {
btnPlay.className = 'play';
} else {
btnPlay.className = 'pause';
}
};
const formatTime = (seconds) => {
const mins = Math.floor(seconds / 60);
const secs = Math.floor(seconds % 60);
return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
};
aud.addEventListener('playing', mState);
aud.addEventListener('pause', mState);
aud.addEventListener('timeupdate', (e) => {
if (!busy) {
prog.value = aud.currentTime / aud.duration * 100;
timebox.innerText = formatTime(aud.currentTime) + '/' + formatTime(aud.duration);
}
});
btnPlay.addEventListener('click', () => aud.paused ? aud.play() : aud.pause());
prog.addEventListener('mousedown', () => busy = true);
prog.addEventListener('mouseup', () => {
aud.currentTime = aud.duration * prog.value / 100;
busy = false;
});
prog.addEventListener('input', () =>
timebox.innerText = formatTime(aud.duration * prog.value / 100) +
'/' + formatTime(aud.duration)
);
document.addEventListener('keydown', (e) => {
if (e.altKey && e.key === 'x') btnPlay.click();
});
</script> 这个让播放器暂停以及进度条都和音乐对应起来了,真好{:4_199:} 红影 发表于 2025-3-22 20:00
这个让播放器暂停以及进度条都和音乐对应起来了,真好
这个简单呀,类似的以前做过的,只是现在重绘UI而已 黑黑真快啊,这么快就弄好了呢{:4_187:} 红影 发表于 2025-3-22 20:04
黑黑真快啊,这么快就弄好了呢
其实早就弄好了,就是自己测试一下 马黑黑 发表于 2025-3-22 20:01
这个简单呀,类似的以前做过的,只是现在重绘UI而已
还是要费心思的{:4_187:} 马黑黑 发表于 2025-3-22 20:05
其实早就弄好了,就是自己测试一下
测试结果很完美(还没出生的儿子){:4_173:} 红影 发表于 2025-3-22 21:18
测试结果很完美(还没出生的儿子)
{:4_172:} 红影 发表于 2025-3-22 21:18
还是要费心思的
心思倒没啥的,熟门熟路了 播放器出来了{:4_199:} 等实例出来,等套用了{:4_170:} 马黑黑 发表于 2025-3-22 21:49
引用你的原话{:4_173:} 马黑黑 发表于 2025-3-22 21:50
心思倒没啥的,熟门熟路了
也还是要花心思的啊,黑黑辛苦{:4_187:} 谢谢黑黑老师辛苦!{:4_190:} 梦江南 发表于 2025-3-23 09:24
谢谢黑黑老师辛苦!
{:4_191:} 红影 发表于 2025-3-22 22:21
也还是要花心思的啊,黑黑辛苦
花心?俺心不花的{:4_170:} 马黑黑 发表于 2025-3-23 12:38
花心?俺心不花的
男性花心不是挺自豪的么,你咋不嘚瑟一下啊{:4_173:} 红影 发表于 2025-3-23 19:52
男性花心不是挺自豪的么,你咋不嘚瑟一下啊
俺不花心,没资本嘚瑟 马黑黑 发表于 2025-3-23 19:56
俺不花心,没资本嘚瑟
这是标榜自己好男人的人设呗{:4_173:}