2013-10-29 33 views
10

私はこの雨滴キャンバスのスクリプトを100%幅と高さにしたいと考えていますが、私は何もしないようです。私は、キャンバス領域でCSSと高さ/幅を変更しようとしましたが、何も変わらないか、全く機能しません。私は実際にフルサイズにしたものを試してみましたが、雨滴には奇妙な効果があるように見えました。それらはすべてぼやけて大きくなりましたので、キャンバスを大きくするのではなく実際に伸ばしているに違いありません。デフォルトの800x800ピクセルキャンバスのコードは次のとおりです。キャンバスHTML5キャンバス100%高さと幅

<script type="text/javascript"> 
var canvas = null; 
var context = null; 
var bufferCanvas = null; 
var bufferCanvasCtx = null; 
var flakeArray = []; 
var flakeTimer = null; 
var maxFlakes = 200; // Here you may set max flackes to be created 

function init() { 
    canvas = document.getElementById('canvasRain'); 
    context = canvas.getContext("2d"); 

    bufferCanvas = document.createElement("canvas"); 
    bufferCanvasCtx = bufferCanvas.getContext("2d"); 
    bufferCanvasCtx.canvas.width = context.canvas.width; 
    bufferCanvasCtx.canvas.height = context.canvas.height; 


    flakeTimer = setInterval(addFlake, 200); 

    Draw(); 

    setInterval(animate, 30); 

} 
function animate() { 

    Update(); 
    Draw(); 

} 
function addFlake() { 

    flakeArray[flakeArray.length] = new Flake(); 
    if (flakeArray.length == maxFlakes) 
     clearInterval(flakeTimer); 
} 
function blank() { 
    bufferCanvasCtx.fillStyle = "rgba(0,0,0,0.8)"; 
    bufferCanvasCtx.fillRect(0, 0, bufferCanvasCtx.canvas.width, bufferCanvasCtx.canvas.height); 

} 
function Update() { 
    for (var i = 0; i < flakeArray.length; i++) { 
     if (flakeArray[i].y < context.canvas.height) { 
      flakeArray[i].y += flakeArray[i].speed; 
      if (flakeArray[i].y > context.canvas.height) 
       flakeArray[i].y = -5; 
      flakeArray[i].x += flakeArray[i].drift; 
      if (flakeArray[i].x > context.canvas.width) 
       flakeArray[i].x = 0; 
     } 
    } 

} 
function Flake() { 
    this.x = Math.round(Math.random() * context.canvas.width); 
    this.y = -10; 
    this.drift = Math.random(); 
    this.speed = Math.round(Math.random() * 5) + 1; 
    this.width = (Math.random() * 3) + 2; 
    this.height = this.width; 
} 
function Draw() { 
    context.save(); 

    blank(); 

    for (var i = 0; i < flakeArray.length; i++) { 
     bufferCanvasCtx.fillStyle = "white"; 
     bufferCanvasCtx.fillRect(flakeArray[i].x, flakeArray[i].y, flakeArray[i].width, flakeArray[i].height); 
    } 


    context.drawImage(bufferCanvas, 0, 0, bufferCanvas.width, bufferCanvas.height); 
    context.restore(); 
} 

</script> 

そして最後に、ここ

<body onload="init()"> 
    <canvas id="canvasRain" width="800px" height="800px">Canvas Not Supported</canvas> 
</body> 
+0

をあなたはcanvas要素のCSSの高さと幅を設定してみましたか? – aet

+0

@aetはい、私は両方とも100%試しましたが、実際には間違ったコードを入れてしまいました。私はこれも動作しないと思います。 –

+0

ボディの幅と高さを100%に、キャンバスを100%にします。両方ともCSS。 – MeiSign

答えて

11

body, #canvasRain {width:100%; height:100%; margin:0px;}体が適切にあなたのサイズを設定しますが、あなたの問題はあなたのキャンバスの高さ/幅のことですだため

スタイル

<style> 
    article, aside, figure, footer, header, hgroup, 
    menu, nav, section { display: block; } 
</style> 

スクリプトあなたはあなたの描画を行うために使用しているが、適切なものを拾うことはありませんpxの値を%で設定するときに値を設定します。そしてそれがファジー・フレークでスケーリングが起こる場所です。デフォルトのキャンバスサイズがあり、ビューの100%に伸びます。何かを追加すると、

bufferCanvas.width = canvas.width = window.innerWidth; 
bufferCanvas.height = canvas.height = window.innerHeight; 

のようになります。そして、あなたはそれを再計算するために、サイズ変更イベントを扱いたい/必要とするかもしれません。ここにはsampleがあります。私はjsFiddleを私のために働かせることができなかったので、それだけのことです。

+0

ありがとうございました!それは素晴らしい作品です。ウィンドウのサイズを変更するときに雨滴が同じサイズと形状になるようにする方法を知っていますか?サイズを変更すると、雨滴が歪んで表示されます。キャンバスのサイズをページが最初に読み込まれたときのどんな位置にあっても強制的に固定するのであれば、ほとんど修正する必要があります。オーバーフローが隠されている場合、スクロールバーにも問題はありません。 –

+0

@SteveWorth CSSから幅/高さ100%を取り出しました。これにより、キャンバスはコード内に設定されたサイズになります。私のサンプルをもう一度チェックして見てください。 'window.onresize'を処理して、その関数で幅と高さを再設定することもできます。 – mafafu

1

シンプルなCSSを使用してキャンバスのサイズを変更する方法を示すフィドルを設定しました。

http://jsfiddle.net/C7LfU/1/

$('#canvasRain').css({ 
    "height": window.innerHeight, 
    "width": window.innerWidth 
}); 

また、私は先に行って、requestAnimationFrameのを使用するようにアニメーションを更新しました。おそらく、あなたのフレークがぼやけていた原因は:setTimeoutのアニメーションは、ブラウザが実際に別のフレームを描画する準備ができてからスケールされません。

window.requestAnimFrame = (function() { 
    return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function (callback) { 
     window.setTimeout(callback, 1000/60); 
    }; 
})(); 

function animate() { 
    requestAnimFrame(animate); 
    Update(); 
    Draw(); 
} 

あなたがでrequestAnimationFrameのを使うべき理由についてもう少し読む:http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/

関連する問題