-2

請幫忙弄清爲什麼這不起作用。 drawTest函數(顯示爲概念證明)可用,但不是drawGrid函數。我究竟做錯了什麼?畫布Javascript:gridDraw(ctx)功能不工作不會在Chrome上產生錯誤

'use strict'; 
window.onload = init; 
function init() { 
    let can = document.getElementById('canvas'); 
    let ctx = can.getContext('2d'); 
    drawTest(ctx); 
    drawGrid(ctx); 
} 

function drawTest(ctx) { 
    ctx.fillStyle = 'rgb(200, 0, 0)'; 
    ctx.fillRect(10, 10, 50, 50); 
    ctx.fillStyle = 'rgba(0, 0, 200, 0.5)'; 
    ctx.fillRect(30, 30, 50, 50); 
} 

function drawGrid(ctx, elSize = 10, width = .3, color = 'green') { 
    ctx.lineWidth = width; 
    ctx.stroke.style = color; 
    var lineX = ctx.width/elSize - 1; 
    var lineY = ctx.height/elSize - 1; 
    for (var i = 1; i <= lineX; i++) { 
     ctx.beginPath(); 
     ctx.moveTo(elSize * i, 0); 
     ctx.lineTo(elSize * i, ctx.height); 
     ctx.stroke(); 
    } 
    for (var i = 1; i <= lineY; i++) { 
     ctx.beginPath(); 
     ctx.moveTo(0, elSize * i); 
     ctx.lineTo(ctx.width, elSize * i); 
     ctx.stroke(); 
    } 
} 

回答

1

上下文不具有寬度,因此ctx.width和ctx.height是不確定的。相反,請使用ctx.canvas.width和ctx.canvas.height。

function drawGrid(ctx, elSize = 10, width = .3, color = 'green') { 
    ctx.lineWidth = width; 
    ctx.stroke.style = color; 
    var lineX = ctx.canvas.width/elSize - 1; 
    var lineY = ctx.canvas.height/elSize - 1; 
    for (var i = 1; i <= lineX; i++) { 
     ctx.beginPath(); 
     ctx.moveTo(elSize * i, 0); 
     ctx.lineTo(elSize * i, ctx.canvas.height); 
     ctx.stroke(); 
    } 
    for (var i = 1; i <= lineY; i++) { 
     ctx.beginPath(); 
     ctx.moveTo(0, elSize * i); 
     ctx.lineTo(ctx.canvas.width, elSize * i); 
     ctx.stroke(); 
    } 
} 

fiddle

+0

謝謝you.it工作!但是,我應該如何正確地使用javascript OOP將長度和寬度附加到ctx對象中?例如,我應該創建一個函數返回一個對象的屬性設置?你能用帆布的例子展示我嗎? –

+0

畫布寬度和高度屬性是描述畫布中像素的標準屬性,因此,如示例中所示訪問這些寬度和高度屬性是完全可以接受的。請注意,畫布*樣式*寬度和高度屬性可能會使畫布看起來比canvas.width/canvas.height屬性更大或更小。樣式和畫布屬性之間的差異將創建一個看起來拉伸或濃縮的可視化。 –