Я пытаюсь добавить <svg>
в холст HTML5 с помощью jQuery
. То, что я сейчас сделал, когда я нажимаю в области холста, я извлекаю координаты x и y и добавляю элемент SVG.
var svg = "<svg><circle cx='"+x+"' cy='"+y+"' r='"+r+"' fill='red'/></svg>";
$("#canvas").append(svg);
SVG, кажется, добавляется в DOM, когда я проверяю источник (используя F12 в Mozilla Firefox) в правильной позиции (x, y), квадрат выделяется в окне браузера, когда я наводил указатель мыши на добавленный <svg>
в источнике. Но <svg>
не отображается. Код выглядит примерно так после 3 щелчков на холсте HTML5.
<canvas id="canvas">
<svg><circle cx="557.8500061035156" cy="222" r="20" fill="red"></circle></svg>
<svg><circle cx="729.8500061035156" cy="251" r="20" fill="red"></circle></svg>
<svg><circle cx="517.8500061035156" cy="109" r="20" fill="red"></circle></svg>
</canvas>
Может ли кто-нибудь помочь мне с проблемой? Я использую <svg>
потому что позже я хочу, чтобы можно было щелкнуть и перетащить круги, а не рисовать стандартные arcs
в холст контекста 2d с помощью javascript.
<div id="forsvgtopng">
<div id="svgelemntdiv">
<svg id="mySVG" xmlns="http://www.w3.org/2000/svg" version="1.1">
<rect width="150" height="150" fill="rgb(0, 255, 0)" stroke-width="1" stroke="rgb(0, 0, 0)"/>
</svg>
</div>
<div class="canvasdiv">
<canvas ></canvas>
</div>
<div class="pngdiv">
<img id="svgpng" />
</div>
</div>
вызовите функцию javascript, такую как converttsvg ('# forsvgtopng')
function convertsvg(selectors) {
[].forEach.call(document.querySelectorAll(selectors), function (div) {
try {
var sourceImage;
var imgs = document.getElementById('svgpng'),
svg = div.querySelector('svg'),
can = div.querySelector('canvas'),
ctx = can.getContext('2d');
can.width =500;
can.height = 550;
sourceImage = new Image;
sourceImage.width = can.width;
sourceImage.height = can.height;
sourceImage.onload = function () {
ctx.drawImage(sourceImage,80,90);
imgs.src = can.toDataURL();
};
sourceImage.src = svg ? svgDataURL(svg) :"";
} catch (e) { console.log(e) }
});
}
}
function svgDataURL(svg) {
var svgAsXML = (new XMLSerializer).serializeToString(svg);
return "data:image/svg+xml," + encodeURIComponent(svgAsXML);
}
Есть ли необходимость в смешивании холста и svg?
<canvas id="canvas">
<svg><circle cx="557.8500061035156" cy="222" r="20" fill="red"></circle></svg>
<svg><circle cx="729.8500061035156" cy="251" r="20" fill="red"></circle></svg>
<svg><circle cx="517.8500061035156" cy="109" r="20" fill="red"></circle></svg>
</canvas>
Я предлагаю создать оболочку для SVG. Как это:
<div id="parent">
<svg id="content">
<circle cx="557.8500061035156" cy="222" r="20" fill="red"></circle>
<circle cx="729.8500061035156" cy="251" r="20" fill="red"></circle>
<circle cx="517.8500061035156" cy="109" r="20" fill="red"></circle>
</svg>
</div>
то при добавлении другого элемента svg выполните следующее:
$("#parent").html($("#parent").html());
См. Этот вопрос для подробностей об этой проблеме, не отображая svg: link
Я не знал, что вы можете использовать элементы svg внутри холста. Обычно вы либо решили использовать холст, либо использовать svg. Это две разные технологии. Вы абсолютно уверены, что то, что вы пытаетесь, возможно?
Чтобы получить полный потенциал SVG, я предлагаю этот плагин. Его партия проще и удобна для разработчиков http://raphaeljs.com/
<canvas>
рассматривается как запасной вариант, когда браузер не поддерживает Canvas API. От MDN: резервный текст предоставляется, если браузер не может отобразить холст или не может прочитать холст. developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas