JavaScript 操作

DOM 操作

如果 SVG 代码直接写在 HTML 网页之中,它就成为网页 DOM 的一部分,可以直接用 DOM 操作。

  1. <svg
  2. id="mysvg"
  3. xmlns="http://www.w3.org/2000/svg"
  4. viewBox="0 0 800 600"
  5. preserveAspectRatio="xMidYMid meet"
  6. >
  7. <circle id="mycircle" cx="400" cy="300" r="50" />
  8. <svg>

上面代码插入网页之后,就可以用 CSS 定制样式。

  1. circle {
  2. stroke-width: 5;
  3. stroke: #f00;
  4. fill: #ff0;
  5. }
  6. circle:hover {
  7. stroke: #090;
  8. fill: #fff;
  9. }

然后,可以用 JavaScript 代码操作 SVG。

  1. var mycircle = document.getElementById('mycircle');
  2. mycircle.addEventListener('click', function(e) {
  3. console.log('circle clicked - enlarging');
  4. mycircle.setAttribute('r', 60);
  5. }, false);

上面代码指定,如果点击图形,就改写circle元素的r属性。

获取 SVG DOM

使用<object><iframe><embed>标签插入 SVG 文件,可以获取 SVG DOM。

  1. var svgObject = document.getElementById('object').contentDocument;
  2. var svgIframe = document.getElementById('iframe').contentDocument;
  3. var svgEmbed = document.getElementById('embed').getSVGDocument();

注意,如果使用<img>标签插入 SVG 文件,就无法获取 SVG DOM。

读取 SVG 源码

由于 SVG 文件就是一段 XML 文本,因此可以通过读取 XML 代码的方式,读取 SVG 源码。

  1. <div id="svg-container">
  2. <svg
  3. xmlns="http://www.w3.org/2000/svg"
  4. xmlns:xlink="http://www.w3.org/1999/xlink"
  5. xml:space="preserve" width="500" height="440"
  6. >
  7. <!-- svg code -->
  8. </svg>
  9. </div>

使用XMLSerializer实例的serializeToString()方法,获取 SVG 元素的代码。

  1. var svgString = new XMLSerializer()
  2. .serializeToString(document.querySelector('svg'));

SVG 图像转为 Canvas 图像

首先,需要新建一个Image对象,将 SVG 图像指定到该Image对象的src属性。

  1. var img = new Image();
  2. var svg = new Blob([svgString], {type: "image/svg+xml;charset=utf-8"});
  3. var DOMURL = self.URL || self.webkitURL || self;
  4. var url = DOMURL.createObjectURL(svg);
  5. img.src = url;

然后,当图像加载完成后,再将它绘制到<canvas>元素。

  1. img.onload = function () {
  2. var canvas = document.getElementById('canvas');
  3. var ctx = canvas.getContext('2d');
  4. ctx.drawImage(img, 0, 0);
  5. };