【问题标题】:Optimizing Interactive SVG JavaScript Animation优化交互式 SVG JavaScript 动画
【发布时间】:2017-01-14 15:22:00
【问题描述】:

我正在尝试使用 JavaScript 在网络浏览器中为 SVG 设置动画。我目前的方法是使用 innerHTML:

var e = new entity();

function draw() {
  element = document.getElementById("canvas");
  e.radius += .1;
  e.pos[0] += .1; e.pos[1] += .1;
  var insides = "";
  insides += '<svg height="80%" viewBox="0 0 100 100">' + e.show() + '</svg>';
  element.innerHTML = insides;
}

function entity() {
  this.pos = [0, 0];
  this.radius = 1;
  this.show = function() {
    return '<circle cx="' + String(this.pos[0]) + '" cy="' + String(this.pos[1]) + '" r="' + String(this.radius) + '" />';
  }
}
window.setInterval(draw, 60);
&lt;div id="canvas" style="text-align:center;"&gt;&lt;/div&gt;

我想确保我不会浪费太多资源,那么在 HTML 文档/JavaScript 中是否有任何方法可以减少资源密集型以使用 SVG 进行受控的交互式动画,例如这样?

【问题讨论】:

  • SMIL 会更有效率。
  • 我试图避免使用 SMIL,因为它的兼容性有限。
  • 如果你使用 fakeSmile polyfill leunen.me/fakesmile,它具有很好的兼容性,因为它可以在所有浏览器上运行
  • 好的,我会调查 fakeSmile,谢谢!

标签: javascript css svg optimization svg-animate


【解决方案1】:

每次都重新创建整个 SVG 效率极低。只需更新几何属性。

var e = new entity();

function draw() {
  element = document.getElementById("canvas");
  e.radius += .1;
  e.pos[0] += .1; e.pos[1] += .1;
  e.show();
}

function entity() {
  this.element = document.getElementById("mycircle");
  this.pos = [0, 0];
  this.radius = 1;
  this.show = function() {
    this.element.cx.baseVal.value = this.pos[0];
    this.element.cy.baseVal.value = this.pos[1];
    this.element.r.baseVal.value = this.radius;
  }
}

window.setInterval(draw, 60);
<div id="canvas" style="text-align:center;">
  <svg height="80%" viewBox="0 0 100 100">
    <circle id="mycircle" cx="0" cy="0" r="0" />
  </svg>
</div>

【讨论】:

  • 您认为在加载 DOM 后向画布添加形状的最佳方式是什么?
  • 使用document.createElementNS()。在此处查看其他问题,了解如何执行此操作。 SO上有很多例子。这是一个常见问题。
  • 另外,编辑多个实体的位置值会在每次编辑后触发重新绘制,还是仅在脚本运行完成后重新绘制?
  • 这通常会在浏览器下一次空闲时发生。在 javascript 循环中增加坐标不能用作动画。您需要在每个超时、间隔或动画帧上执行此操作。
猜你喜欢
  • 1970-01-01
  • 2016-12-02
  • 2016-08-02
  • 1970-01-01
  • 2017-11-06
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多