简体   繁体   English

JavaScript围绕特定点`transform:rotation()`旋转SVG对象

[英]JavaScript rotate a SVG object around specific point `transform: rotate()`

I've the below code that is functioning properly, create the path, and rotate it upon the click. 我的以下代码可以正常运行,创建路径,并在单击时旋转它。

I want to rotate the path about specific point, when i use the rotate(45 50 50) below instead of the rotate(x) i get this error: VM267:85 Uncaught SyntaxError: missing ) after argument list what shall I do? 我想绕特定点旋转路径,当我使用下面的rotate(45 50 50)而不是rotate(x)以下错误: VM267:85 Uncaught SyntaxError: missing ) after argument list该怎么办?

Note NOt interested to use any ready library to handle the task, need to so it using the standard API only. 注意:不希望使用任何现成的库来处理任务,因此只需要使用标准API即可。 thanks 谢谢

 var NS="http://www.w3.org/2000/svg"; var SVG=function(el){ return document.createElementNS(NS,el); } svg = SVG('svg'); svg.setAttribute("width", "100%"); svg.setAttribute("height", "100%"); // svg.width='50em'; // Not working document.body.appendChild(svg); var bbox = svg.getBoundingClientRect(); var center = { x: bbox.left + bbox.width/2, y: bbox.top + bbox.height/2 }; class myPath { constructor(cx,cy) { this.path=SVG('path'); // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/d // https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths var d="M" + cx + " " + cy; d = d + "L175 120 L125 120 Z"; this.path.setAttribute("d", d); this.path.setAttribute("fill", "#F7931E"); this.path.addEventListener("click",this,false); } get draw(){ return this.path; } } myPath.prototype.rotate = function(x) { /* var path = this.path.getBoundingClientRect(); var Pc = { x: bbox.left + bbox.width/2, y: bbox.top + bbox.height/2 }; */ return svg.createSVGTransformFromMatrix(svg.createSVGMatrix().rotate(x)); // https://developer.mozilla.org/en/docs/Web/SVG/Attribute/transform } myPath.prototype.animate = function() { self = this.path; self.transform.baseVal.appendItem(this.rotate(5)); }; myPath.prototype.handleEvent= function(evt){ self = evt.target; console.log(self.getAttribute('d')); self.move = setInterval(()=>this.animate(),100); } svg.appendChild(new myPath(center.x,center.y).draw); 

rotate(45 50 50) is the format for the transform XML attribute. rotate(45 50 50)transform XML属性的格式。 For example: 例如:

<path d="..." transform="rotate(45 50 50)" .../>

But you are using the Javascript rotate() function on the SVGTransform object. 但是,您正在SVGTransform对象上使用Javascriptrotate rotate()函数。 JS functions require commas between parameters. JS函数要求参数之间使用逗号。 Try: 尝试:

rotate(45, 50, 50)

https://developer.mozilla.org/en/docs/Web/API/SVGTransform https://developer.mozilla.org/en/docs/Web/API/SVGTransform

I was able to solve it using translate(<x>, <y>) rotate(<a>) translate(-<x>, -<y>) as per this link 我能够用它来解决translate(<x>, <y>) rotate(<a>) translate(-<x>, -<y>)按照这个链接

 var NS="http://www.w3.org/2000/svg"; var SVG=function(el){ return document.createElementNS(NS,el); } svg = SVG('svg'); svg.setAttribute("width", "100%"); svg.setAttribute("height", "100%"); svg.setAttribute("fill", "green"); document.body.appendChild(svg); bbox = svg.getBoundingClientRect(); center = { x: this.bbox.left + this.bbox.width/2, y: this.bbox.top + this.bbox.height/2 }; class myPath { constructor(cx,cy) { this.path=SVG('path'); // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/d // https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths var d="M" + cx + " " + cy; d = d + "h75 v75 h-75 z"; this.path.setAttribute("d", d); this.path.setAttribute("fill", "#F7931E"); this.path.addEventListener("click",this,false); this.Pbox = svg.getBoundingClientRect(); this.Pc = { x: this.Pbox.left + this.Pbox.width/2, y: this.Pbox.top + this.Pbox.height/2 }; } get draw(){ return this.path; } } myPath.prototype.rotate = function(x) { return svg.createSVGTransformFromMatrix(svg.createSVGMatrix().rotate(x)); // https://developer.mozilla.org/en/docs/Web/SVG/Attribute/transform } myPath.prototype.move = function(x,y) { return svg.createSVGTransformFromMatrix(svg.createSVGMatrix().translate(x,y)); // https://developer.mozilla.org/en/docs/Web/SVG/Attribute/transform } myPath.prototype.animate = function() { self = this.path; self.transform.baseVal.appendItem(this.move(this.Pc.x,this.Pc.y)); self.transform.baseVal.appendItem(this.rotate(5)); self.transform.baseVal.appendItem(this.move(-this.Pc.x,-this.Pc.y)); }; myPath.prototype.handleEvent= function(evt){ self = evt.target; console.log(self.getAttribute('d')); self.move = setInterval(()=>this.animate(),100); } svg.appendChild(new myPath(center.x,center.y).draw); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM