画布线宽度随着浏览器窗口大小的变化而变化,任何想法都可以解决
Canvas line width changes as browser window size changes, any idea to work around?
我在div里面有一个画布,它填充了整个div。我在画布上画了一条线,但是当我调整浏览器窗口的大小时,画布上的线的宽度改变了,当我增加浏览器窗口的大小时,它的厚度增加了,并增加了一些模糊的线条。我发现问题出现在这里;我不使用画布的固定大小,而是使用%100的宽度和高度。
#myCanvas{
margin:0;
padding: 0;
border:0;
width: 100%;
height: 100%;
background-color: white;
}当我使用固定大小的像素宽度和高度,它是可以的。但是我想在不影响内部绘图的情况下调整画布的大小。你可以在这里试试:http://codepen.io/ertugrulmurat/pen/nxhof
只是尝试改变浏览器窗口的高度。
不幸的是,这是相当复杂的修复。基本上你需要:
- 为调整大小事件和 的窗口添加一个事件侦听器
- 改变
width
/height
属性的画布标签(不是css,保持在100%)每次窗口调整大小 - 你还需要在每次调整大小时重新绘制线条。
请记住width
/height
属性是无单位的,所以请确保将其设置为width="100"
而不是width="100px"
这是你的代码的相关部分,在适当的地方进行了修改:
if (canvas.getContext){
var ctx = canvas.getContext('2d');
ctx.canvas.width = ctx.canvas.clientWidth;
ctx.canvas.height = ctx.canvas.clientHeight;
var draw = function(){
ctx.lineWidth = 0.5;
ctx.shadowBlur = 0;
ctx.strokeStyle="#FF0000";
ctx.beginPath();
ctx.lineWidth=0.5;
ctx.lineCap="round";
ctx.moveTo(20,20);
ctx.lineTo(200,20);
ctx.stroke();
ctx.closePath();
}
window.addEventListener('resize', function(){
ctx.canvas.width = ctx.canvas.clientWidth;
ctx.canvas.height = ctx.canvas.clientHeight;
draw();
});
draw();
}
我看了一下,似乎canvas元素不能很好地处理CSS,最好将宽度和高度定义为标记的一部分,例如
<canvas width="200" height="100"></canvas>
当然,唯一的问题是这些值只在px中。我的工作将是使用javascript,因此收集父大小,并在resize事件上输入新的值。我已经把所有这些写在一个jfiddle中,如果你调整大小,它会很好地工作。
请注意,每次调整大小时我都会调用redraw函数。如果您没有这样做,它将变为空白,直到下一次单击。
http://jsfiddle.net/N23w2/1/相关文章:
- 我想遍历一个对象数组,我不想要任何重复项
- 如何在javascript中调用onclick事件?我没有'我不想在我的HTML页面中使用任何事件
- 如何在呈现页面后使用 Java 脚本检测 dom 元素值的值是否有任何变化(例如,任何输入或复选框值更改)
- Ajax 报告成功,但数据库没有任何变化
- 如果我只想从数组中打印任何一个元素.任何数组.那么代码会是什么
- 在过去24小时内,谷歌应用程序脚本或可视化API的任何变化
- 我需要创建一个事件侦听器.但是我不想使用任何框架
- 我想将任何xml文件导出到excel文件(xls或制表符分隔)
- 我想在 td 的值发生变化时更改突出显示的 td
- 我想在客户端单击中生成作业序列号.如果有任何建议,请提供帮助
- 我正在使用带有 c# 代码的 Asp.net,我有一个带有网格视图的页面,我想使用没有任何 ajax 的 javascr
- 一旦 JavaScript 中任何 HTML 元素的值发生变化,就会更新画布
- 我想在单击图像时显示一些文本,并在单击图像或任何其他图像时将其隐藏
- Mongo/Node/Meteor 的新手,想知道为什么 Meteor 没有获得任何数据
- 想要关闭弹出窗口并在控制器上执行 PHP 脚本后重定向到相应的页面,没有任何事件
- 选择标签的形式,如果其中任何一个发生更改,我想触发一个事件
- 我想让用户在谷歌硬盘上创建文件夹,而不需要任何进一步的签名
- 如何编写一个返回单个值的java脚本函数,并将返回的值分配给我们想要的任何变量
- 我想获得任何页面的所有元标签,也包括重新指定的元标签
- Javascript Function.prototype.bind的变化我想确保我理解