我有这个小提琴。
当我单击路径时,我要对其进行缩放。但是在缩放之后,单击的路径失去了他的当前位置。
这是我的jQuery代码:
var svg = $("#svg-container");
svg.load("svg/fondcarte-collec_actuelle.svg", function(data) {
svg.children().find("path").click(function(e) {
$("#Layer_1 path").removeAttr("style");
var x = e.pageX - svg.width() - $(this).offset().left - this.getBoundingClientRect().width + svg.find("svg").offset().left + 250;
var y = e.pageY - svg.height() - $(this).offset().top - this.getBoundingClientRect().height + svg.find("svg").offset().top + 250;
console.log(this.x, this.y)
$(this).css("transform", "translate(" + x + "px, " + y + "px) scale(1.3)");
$(this).css("fill", "green");
})
})
如何做呢?
注意:我问它是否没有插件,因为我想了解这个缩放概念。
MortenMuulder的解决方案就在那里。但是,这还不是全部解决方案。
将百分比值transform:orgin
应用于SVG元素时,目前存在工作方式问题。Chrome和Firefox彼此不一致。从技术上讲,Firefox是遵循当前规范的一种。您可以在有关该主题的其他SO问题中阅读有关此内容的更多信息。
要解决此问题,您需要自己计算区域的中心。您可以通过调用getBBox()
元素来做到这一点。这将返回元素的位置,宽度和高度。
var bbox = this.getBBox();
var centreX = bbox.x + bbox.width/2;
var centreY = bbox.y + bbox.height/2;
您需要做的另一件事是将当前区域移到所有其他区域的前面。为此,您需要移动它,使其成为最后一个元素。我们可以这样做:
this.parentElement.appendChild(this);
我们获取父元素,并将当前元素附加到其子元素的末尾。这具有移动它的效果。
因此,最终点击处理程序将如下所示:
svg.children().find("path").click(function(e) {
$("#Layer_1 path").removeAttr("style");
$this = $(this);
var bbox = this.getBBox();
var centreX = bbox.x + bbox.width/2;
var centreY = bbox.y + bbox.height/2;
$this.css("transform-origin", centreX + 'px ' + centreY + 'px');
$this.css("transform", "scale(2)");
$this.css("stroke", "white");
$this.css("fill", "green");
this.parentElement.appendChild(this);
})
更新2020
Firefox和Chrome行为不同的问题现已解决。CSS组添加了一个新的CSS属性transform-box
,该属性允许您指定百分比transform-origin
的计算方式。
现在,通过将设置transform-box
为,可以在所有浏览器中重现Chrome基于元素边界框计算百分比的旧的(错误的)行为fill-box
。这稍微简化了代码。
$this.css("transform-origin", "50% 50%");
$this.css("transform-box", "fill-box");
$this.css("transform", "scale(2)");
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句