为什么当我使用 HTML dom 动态添加 SMIL 动画时它不起作用
why doesn't SMIL animation work when I add it dynamically using HTML dom
我有一个动态创建 svg 六边形(多边形)的文件,我将每个六边形作为一个对象实例,以便稍后引用它们。
这是我的六边形class
function Hexagon(cx,cy,side,id){
//console.log('hexagon');
this.cx=cx;
this.cy=cy;
this.side=side;
this.id=id;
this.isBtn=false;
};
Hexagon.prototype.makeHex =makeHex; //You set the prototype, but don't actually execute the function
Hexagon.prototype.setBtn=setBtn;
Hexagon.prototype.shine=shine;
对象中的大多数原型函数都按预期工作,但 shine 函数除外。
shine 方法添加(至少尝试添加)SMIL 动画到引用六边形,这是方法
function shine(){
var hex=document.getElementById(this.id)
var smil=document.createElement('animate');
smil.setAttribute('attributeName','fill');
smil.setAttribute('to','#332299');
smil.setAttribute('dur','2s');
smil.setAttribute('begin',this.id+'.mouseover')
hex.appendChild(smil);
}
现在添加了 html 节点,但 smil 动画似乎不起作用。
https://jsfiddle.net/Snedden27/d6qbLzjv/
如果您检查第二个橙色六边形正下方的六边形。它确实包含 smil 动画标签,但动画似乎不起作用。
PS:另外为了证明如果不动态应用 smil 也能工作,我创建了一个带有 smil 动画的矩形,如果你删除用六边形填充屏幕的 onload 事件你可以看到它
您不能通过 createElement 创建任何 SVG 元素(包括动画),您需要使用 createElementNS 并将 SVG 命名空间作为第一个参数传递,例如
var smil=document.createElementNS('http://www.w3.org/2000/svg', 'animate');
这是你的fixed version测试
我有一个动态创建 svg 六边形(多边形)的文件,我将每个六边形作为一个对象实例,以便稍后引用它们。
这是我的六边形class
function Hexagon(cx,cy,side,id){
//console.log('hexagon');
this.cx=cx;
this.cy=cy;
this.side=side;
this.id=id;
this.isBtn=false;
};
Hexagon.prototype.makeHex =makeHex; //You set the prototype, but don't actually execute the function
Hexagon.prototype.setBtn=setBtn;
Hexagon.prototype.shine=shine;
对象中的大多数原型函数都按预期工作,但 shine 函数除外。
shine 方法添加(至少尝试添加)SMIL 动画到引用六边形,这是方法
function shine(){
var hex=document.getElementById(this.id)
var smil=document.createElement('animate');
smil.setAttribute('attributeName','fill');
smil.setAttribute('to','#332299');
smil.setAttribute('dur','2s');
smil.setAttribute('begin',this.id+'.mouseover')
hex.appendChild(smil);
}
现在添加了 html 节点,但 smil 动画似乎不起作用。
https://jsfiddle.net/Snedden27/d6qbLzjv/
如果您检查第二个橙色六边形正下方的六边形。它确实包含 smil 动画标签,但动画似乎不起作用。
PS:另外为了证明如果不动态应用 smil 也能工作,我创建了一个带有 smil 动画的矩形,如果你删除用六边形填充屏幕的 onload 事件你可以看到它
您不能通过 createElement 创建任何 SVG 元素(包括动画),您需要使用 createElementNS 并将 SVG 命名空间作为第一个参数传递,例如
var smil=document.createElementNS('http://www.w3.org/2000/svg', 'animate');
这是你的fixed version测试