在OS X音频播放器应用程序Bowtie中有一个名为Passed的主题,它显示歌曲标题,进度条是标题上的简单水平颜色变化。见这里:http://rhyguy.deviantart.com/art/Passed-185291024
开始&只需单击标题本身即可完成停止。你无法寻求。
我主要做PHP& CSS,但我有很少的Javascript经验。我想知道是否以及如何在一个带有Javascript&的网页上实现这一点。 CSS,或者在那里存在类似的东西。欢迎任何想法。
感谢。
答案 0 :(得分:0)
你可以这样做:
preload
和src
属性
canplay
事件)时,文字会呈现,画布会点击一个警告:
画布需要适当调整大小。要执行此操作,您可以如下呈现文本,然后获取文本的宽度,猜测高度(因为此时没有可用的信息)并设置画布大小。但是,这将清除画布,因此需要重新呈现文本。出于这个原因,最好还动态创建画布,并在渲染大小和文本时将其插入DOM。
免责声明:所使用的音乐版权归我所有,可以免费用于测试目的。
var url = "https://epistemex.github.io/particlejs/demos/audio/pvp_colibris.mp3",
audio = document.createElement("audio"), // create audio element
progbar = document.getElementById("progbar"), // progress bar for demo
canvas = document.createElement("canvas"), // clickable canvas (play/pause)
ctx = canvas.getContext("2d"),
title = "KEN FYRSTENBERG - COLIBRIS",
textWidth, inited = false;
// make canvas clickable when audio is ready
audio.addEventListener("canplay", function() {
if (inited) return; // prevent multiple inits...
inited = true;
initText(); // initial text render
textWidth = ctx.measureText(title).width; // get width of text in pixels
// -- solve caveat - set proper canvas size
canvas.width = textWidth;
canvas.height = 40;
initText();
document.body.appendChild(canvas);
canvas.addEventListener("click", function() { // toggle play/pause clicking title
if (audio.paused) {
initText();
audio.play();
loop();
}
else audio.pause();
});
});
audio.preload = "auto";
audio.src = url; // load audio
// main animation loop
function loop() {
drawBar();
if (!audio.paused && !audio.ended) requestAnimationFrame(loop);
}
// This will clear the canvas and redraw the text
function initText() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.globalCompositeOperation = "source-over";
ctx.fillStyle = "#ccc";
ctx.font = "36px impact, sans-serif";
ctx.textBaseline = "top";
ctx.fillText(title, 0, 0);
ctx.globalCompositeOperation = "source-atop";
ctx.fillStyle = "#fff";
}
// This will composite a white progress bar on the rendered text
function drawBar() {
var pst = audio.currentTime / audio.duration;
ctx.fillRect(0, 0, textWidth * pst || 0, canvas.height);
}
body {background:rgb(11,28,52)} canvas {cursor:pointer}