我无法在mdn(我知道这不是官方参考书)或其他任何地方找到此文件;所以,我以为我会问一个简单的问题:
例如,我有以下代码片段:
var can = document.getElementById("can");
var ctx = can.getContext("2d");
var w = can.width; var h = can.height;
var ys = [1, 3, 2, 4, 5, 3, 2, 4, 5, 6, 7, 3];
ctx.beginPath();
for (var i = 0, iMax = ys.length; i < iMax; i++) {
ctx.lineTo(i, ys[i]);
}
ctx.stroke();
它可以在chrome,firefox,ie11中使用,但是我想知道代码和跨浏览器支持的有效性。我找不到任何提及,但我认为必须有所提及。
因此,我的问题是,应该在使用
ctx.moveTo
之前先使用ctx.lineTo
还是先使用ctx.lineTo
(在ctx.beginPath
之后)完全可以,为什么? (我无法找到答案,但是如果它是重复的,则抱歉。) 最佳答案
不,如果您只是调用moveTo
,则无需在lineTo
之前调用beginPath
。
根据specs:
调用lineTo(x,y)方法时,必须运行以下步骤:
如果两个参数中的任何一个为无限或NaN,则返回。
如果对象的路径没有子路径,请确保存在(x,y)的子路径。
否则,使用直线将子路径中的最后一个点连接到给定点(x,y),然后将给定点(x,y)添加到子路径。
调用beginPath
之后,对象的路径没有子路径,因此,我们以该算法的第二个项目符号结束。
ensure there is a subpath的算法为:
当用户代理要确保路径上有坐标(x,y)的子路径时,用户代理必须检查以查看该路径是否设置了需要的新子路径标志。如果是这样,则用户代理必须创建一个新的子路径,将点(x,y)作为其第一个(也是唯一的)点,就好像调用了moveTo()方法一样,然后必须取消设置该路径的需要新的子路径旗。
因此,在lineTo
实际上转换为beginPath
调用之后,您首先调用moveTo
。
var ctx = canvas.getContext('2d');
ctx.beginPath();
ctx.lineTo(120, 120); // converted to moveTo
ctx.lineTo(200, 150);
ctx.stroke();
<canvas id="canvas"></canvas>
请注意,只有在确保有子路径算法之后,才将
lineTo
的算法设置为立即停止,这意味着在插入moveTo
之后,其他方法将继续绘制。var ctx = canvas.getContext('2d');
ctx.beginPath();
ctx.arc(60, 60, 30, 0, Math.PI);
// first we'll get new (x, y) coordinates of the first point of our arc (90, 60)
// since there is no subpath yet, we implicitely call moveTo(90, 60)
// then we draw the arc as usual
ctx.stroke();
<canvas id="canvas"></canvas>