Я знаю SVG <g>
тега не имеющий X и Y атрибуты, и единственный способ передать его использует transform
как transform="translate(x,y)"
и transform="rotate(45 50 50)"
перемещение «г» тега SVG с помощью JavaScript
Я пытаюсь сделать то же самое программируемый с использованием JavaScript, где я хочу переместить тег g
, имеющий комбинацию rect
и text
, ниже мой код, так что ошибка у меня так g
не двигается/не переводится, как только я нажимаю на нее?
var NS="http://www.w3.org/2000/svg";
var SVG=function(h,w){
var svg=document.createElementNS(NS,"svg");
svg.width=w;
svg.height=h;
return svg;
}
var svg=SVG(1200,1500);
document.body.appendChild(svg);
class myRect {
constructor(x,y,h,w,fill,name) {
this.g= document.createElementNS(NS,"g");
this.name=name;
this.SVGObj= document.createElementNS(NS,"rect");
self = this.SVGObj;
self.x.baseVal.value=x;
self.y.baseVal.value=y;
self.width.baseVal.value=w;
self.height.baseVal.value=h;
self.style.fill=fill;
this.text = document.createElementNS(NS, 'text');
this.text.setAttribute('x', x+10);
this.text.setAttribute('y', y+20);
this.text.setAttribute('fill', '#000');
this.text.textContent = '2';
this.g.appendChild(self);
this.g.appendChild(this.text)
this.g.addEventListener("click",this,false);
}
}
Object.defineProperty(myRect.prototype, "node", {
get: function node() {
return this.g; // this.SVGObj;
}
});
myRect.prototype.handleEvent= function(evt){
self = this.g;
switch (evt.type){
case "click":
// alert(this.name); // this.animate();
if (typeof self.moving == 'undefined' || self.moving == false) self.moving = true;
else self.moving = false;
if(self.moving == true)
self.move = setInterval(()=>this.animate(),100);
else{
clearInterval(self.move);
self.parentNode.removeChild(self);
}
break;
default:
break;
}
}
myRect.prototype.animate = function() {
self = this.g;
self.transform="translate(200,200)";
// self.x.baseVal.value+=1;
// self.y.baseVal.value+=1;
};
var r= new myRect(50,50,30,30,'#'+Math.round(0xffffff * Math.random()).toString(16),'this is my name');
svg.appendChild(r.node);
UPDATE Я попытался self.setAttribute('transform','translate(10,10)')
, но не работал, я был в состоянии сделать один шаг только один раз перейти с помощью self.setAttribute('transform','translate(10,10)');
где GetItem (0) получает первый элемент в атрибут преобразования, например transform="translate(1, 1) scale(2)"
где getItem(0)
получает translate(1, 1)
матрицу и getItem(1)
получает scale(2)
, как описано here
Но это еще не то, что мне нужно, мне нужно непрерывное движение раз я нажимаю g
пока петля закончится.
Не могли бы вы попробовать это, но я предположил только один g-тэг. – Ray
Извините @Ray, этот 'self.childNodes [0];' сделать первый элемент в 'g' для перемещения, а не полный тег' g', перемещается только элемент 'rect', а элемент' text' остаются без движения, т. е. вы перемещаете вспомогательный элемент 'g' –