0
如何使用html5畫布實現動畫背景?我想爲此動畫添加鼠標事件。我在背景上有文字問題,因爲它在畫布上繪畫時消失了。使用z座標處理無法正常工作。帶畫布的動畫背景
如何使用html5畫布實現動畫背景?我想爲此動畫添加鼠標事件。我在背景上有文字問題,因爲它在畫布上繪畫時消失了。使用z座標處理無法正常工作。帶畫布的動畫背景
Animated background with canvas
好了,所以由它的聲音,你可能想找到一個頁面,你感興趣(如canvasRenderingContext2d頁)來檢測出MDN,並從那裏開始閱讀(你會學到ALOT真快速)。但是,又回到了這個帖子的點,我會建議(從你那裏列出的問題判斷)是:
window
的光標事件的光標位置。下面顯示了這種實現的演示示例。在下面的例子中,光標的座標顯示在光標位置,相對於光標位置的黃色圓點背景位於頁面中心。請享用!
var bgcanvas = document.getElementById('backgroundCanvas'),
bgcontext = bgcanvas.getContext('2d'),
mouseX = 0,
mouseY = 0,
mouseChanged = false;
window.addEventListener('mousemove', function(evt){
if (mouseX !== evt.clientX)
mouseX = evt.clientX, mouseChanged = true;
if (mouseY !== evt.clientY)
mouseY = evt.clientY, mouseChanged = true;
});
var repaintBGcanvasCUR = 0;
var repaintBGcanvas = function(){
requestAnimationFrame(repaintBGcanvas);
if ((++repaintBGcanvasCUR%2) // only modify the canvas half the time to reduce the CPU strain
&& mouseChanged){ // if the mouse has changed
mouseChanged = false;
bgcontext.clearRect(
0,0,bgcanvas.width,bgcanvas.height);
bgcontext.beginPath();
// create the yellow circle path:
bgcontext.arc(mouseX, mouseY,
// pythagorean theorem:
Math.hypot(mouseX-bgcanvas.width/2, mouseY-bgcanvas.height/2)/4,
0, 2 * Math.PI);
bgcontext.closePath();
bgcontext.fillStyle = "rgba(255,255,0,.5)";
// fill in the yellow circle
bgcontext.fill();
bgcontext.textAlign = 'center'; // horozontally center the text
bgcontext.textBaseline = 'middle'; // vertically center the text
bgcontext.font = '48px monospace'; // make the text fancy
bgcontext.fillStyle = 'red'; // make the text fancy
bgcontext.fillText(mouseX + ' X ' + mouseY, mouseX, mouseY);
}
}
window.addEventListener(
'load', repaintBGcanvas);
var resizeBackgroundCanvas = function(){
bgcanvas.width = window.innerWidth;
bgcanvas.height = window.innerHeight;
}
window.addEventListener(
'resize', resizeBackgroundCanvas);
window.addEventListener(
'load', resizeBackgroundCanvas);
// speed up canvas:
bgcontext.imageSmoothingEnabled = false;
html, body, #backgroundCanvas {
width: 100%;
height: 100%;
margin: 0;
cursor: none;
}
#backgroundCanvas {
z-index: -2147483647; /*maximum far back*/
position: fixed;
top: 0; left: 0;
}
p {
margin: 3em 2em;
}
<canvas id="backgroundCanvas"></canvas>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut eu felis eros. Donec tellus risus, dapibus luctus velit nec, molestie pulvinar tellus. Nulla cursus placerat risus in fermentum. Vestibulum rutrum rhoncus leo in sagittis. Morbi blandit, nibh et ornare faucibus, lectus massa vestibulum nulla, et pellentesque augue nunc ut tellus. Cras interdum, diam nec tincidunt rhoncus, dolor tortor lobortis ante, quis pretium lectus enim at lectus. Suspendisse consectetur, neque sed vulputate cursus, ex erat tempor magna, eu efficitur purus odio id libero. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas pellentesque suscipit justo ut tristique. Ut finibus congue nisi. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin feugiat eget nulla rhoncus semper. Proin placerat efficitur tortor, id porta est maximus ut. Phasellus tincidunt nisi sagittis consectetur laoreet. Cras eget consectetur mauris. Maecenas ornare, neque ac finibus sagittis, quam orci finibus nunc, vel cursus enim orci a arcu.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut eu felis eros. Donec tellus risus, dapibus luctus velit nec, molestie pulvinar tellus. Nulla cursus placerat risus in fermentum. Vestibulum rutrum rhoncus leo in sagittis. Morbi blandit, nibh et ornare faucibus, lectus massa vestibulum nulla, et pellentesque augue nunc ut tellus. Cras interdum, diam nec tincidunt rhoncus, dolor tortor lobortis ante, quis pretium lectus enim at lectus. Suspendisse consectetur, neque sed vulputate cursus, ex erat tempor magna, eu efficitur purus odio id libero. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas pellentesque suscipit justo ut tristique. Ut finibus congue nisi. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin feugiat eget nulla rhoncus semper. Proin placerat efficitur tortor, id porta est maximus ut. Phasellus tincidunt nisi sagittis consectetur laoreet. Cras eget consectetur mauris. Maecenas ornare, neque ac finibus sagittis, quam orci finibus nunc, vel cursus enim orci a arcu.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut eu felis eros. Donec tellus risus, dapibus luctus velit nec, molestie pulvinar tellus. Nulla cursus placerat risus in fermentum. Vestibulum rutrum rhoncus leo in sagittis. Morbi blandit, nibh et ornare faucibus, lectus massa vestibulum nulla, et pellentesque augue nunc ut tellus. Cras interdum, diam nec tincidunt rhoncus, dolor tortor lobortis ante, quis pretium lectus enim at lectus. Suspendisse consectetur, neque sed vulputate cursus, ex erat tempor magna, eu efficitur purus odio id libero. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas pellentesque suscipit justo ut tristique. Ut finibus congue nisi. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin feugiat eget nulla rhoncus semper. Proin placerat efficitur tortor, id porta est maximus ut. Phasellus tincidunt nisi sagittis consectetur laoreet. Cras eget consectetur mauris. Maecenas ornare, neque ac finibus sagittis, quam orci finibus nunc, vel cursus enim orci a arcu.</p>
可能要接受一些以前的答案,同時也發佈一些代碼。在基於z屬性的渲染循環中使用簡單的排序應該可行。 – Loktar 2012-01-03 15:49:35
這個問題很模糊,但是你看過像[fabric.js](http://kangax.github.com/fabric.js/)這樣的畫布庫嗎? – kangax 2012-01-03 20:01:07
這裏至少有五個問題:如何繪製到畫布,如何使用畫布進行動畫處理,如何使用畫布處理鼠標事件,如何將文本寫入畫布,如何將HTML元素浮動到畫布上。 – puk 2012-01-03 20:57:27