javascript - 使用
问题描述
我试图让生成的 SVG 在画布内绘制。下面的代码在 Chrome 中可以正常工作,但在 Firefox 中不行。
<html>
<body>
<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" style="width: 100px; height; 100px">
<rect x="0" width="100" height="100" rx="15" fill="pink" />
<circle cx="50" cy="50" r="25"/>
</svg>
<canvas style="border: 1px dashed black; height: 100px; width: 100px">
</canvas>
<script>
const canvas = document.querySelector("canvas")
const svg = document.querySelector("svg")
const outerHTML = svg.cloneNode(true).outerHTML
const blob = new Blob([outerHTML],{type:'image/svg+xml;charset=utf-8'});
let url = window.URL || window.webkitURL || window;
let blobURL = url.createObjectURL(blob);
const img = document.createElement("img")
document.querySelector("body").appendChild(img)
img.onload = () => {
try {
canvas.height = 100
canvas.width = 100
let ctx = canvas.getContext('2d');
ctx.fillRect(0,0,100,100);
ctx.clearRect(10,20,30,40);
ctx.drawImage(img, 0, 0, 100, 100);
} catch(e) {
console.log(e)
}
};
img.src = blobURL
</script>
</body>
</html>
一切似乎都在这里工作——包括图像加载——除了drawImage
调用。带有黑色圆圈的粉红色小圆角矩形是 SVG。底部的大的是加载到元素中的相同img
内容。(“0.5ms”是因为这是通过 Rails 应用程序加载的,但这无关紧要)
虚线框是我要绘制的画布。和fillRect
工作clearRect
。我在 onload 里面,所以我知道图像已经完成加载。尺寸都是正确的。图像被加载到img
元素中,所以我知道浏览器可以处理 blob。
我不知道这里还有什么问题。
解决方案
感谢 ggorlen 对可运行片段工作的评论,我在 Chrome 中尝试了这个并且它有效。这使我走上了一条新的谷歌搜索路径,在那里我发现了不久前的这个 SO 问题,指出这个确切的问题可以通过在根元素上放置width
和属性来解决。height
<svg>
而且,事实上,它确实解决了问题!
推荐阅读
- c - 为什么 Mingw-w64 gcc 编译器会生成有关 %zd 和 %a 格式的错误警告
- css - 3 个月前的 Cucumber/Java 验证结果日期
- .net - 实体框架一对多关系错误
- vue.js - Nuxt & Vue - Element UI 在浏览器后退按钮事件上保持活动菜单项
- debian - Wireguard 安装错误:无法纠正问题,您持有损坏的软件包。但是,没有包裹
- bash - 使用 shellscript 编译我的源代码 (C)
- jquery - 如何使用jquery在HTML5中设置表格单元格的背景和字体颜色
- android - 如何获取仅包含 POST 响应最后一部分的字符串?
- javascript - 使用 javascript (Trix/ActiveText) 设置富文本区域的草稿值
- html - 将文本对齐设置为 CSS 不工作的中心