在没有viewBox的情况下围绕中心缩放?

Posted

技术标签:

【中文标题】在没有viewBox的情况下围绕中心缩放?【英文标题】:Scaling around center without viewBox? 【发布时间】:2017-03-31 17:38:49 【问题描述】:

我知道对此进行了很多辩论,但我想知道是否有一种方法可以在不使用 viewBox 的情况下围绕其中心缩放元素(据我所知,它必须应用于 svg,并且不是单个对象)。在本练习中,我正在努力了解 svg 缩放的逻辑,我希望在单击黄色矩形时出现(不可见的)红色圆圈,然后缩放(好像它弹出一样)。有谁能够帮助我?提前致谢

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   id="star"
   x="170px"
   y="385px"
   
   
   xml:space="preserve"
   inkscape:version="0.48.5 r10040"
   sodipodi:docname="Exercise n.1.svg"><metadata
   id="metadata17"><rdf:RDF><cc:Work
       rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
         rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
   id="defs15" /><sodipodi:namedview
   pagecolor="#ffffff"
   bordercolor="#666666"
   borderopacity="1"
   objecttolerance="10"
   gridtolerance="10"
   guidetolerance="10"
   inkscape:pageopacity="0"
   inkscape:pageshadow="2"
   inkscape:window-
   inkscape:window-
   id="namedview13"
   showgrid="false"
   inkscape:zoom="2.36"
   inkscape:cx="-22.881356"
   inkscape:cy="50"
   inkscape:window-x="-8"
   inkscape:window-y="-8"
   inkscape:window-maximized="1"
   inkscape:current-layer="star" />
    
<rect
   style="fill:#ffcc00;fill-opacity:1;stroke:none"
   id="yelrect"
   
   
   x="14.457626"
   y="25.847458"
   ry="1.6126924" />
<path
   sodipodi:type="arc"
   style="fill:#ff0000;fill-opacity:1;stroke:none;opacity:0"
   id="redcircle"
   sodipodi:cx="70.338982"
   sodipodi:cy="15.466102"
   sodipodi:rx="9.3220339"
   sodipodi:ry="8.2627115"
   d="m 79.661016,15.466102 a 9.3220339,8.2627115 0 1 1 -18.644068,0 9.3220339,8.2627115 0 1 1 18.644068,0 z"
   transform="matrix(0.96545455,0,0,1.0892308,1.1926041,24.577574)" />
 <animateTransform
     id="redcircle_anim1"
     xlink:href="#redcircle"
     attributeName="transform"
	   type="scale"
     begin="yelrect.click"
     by="1"
     dur="1s"
     fill="freeze" />
 <animate
     id="redcircle_anim2"
     xlink:href="#redcircle"
     attributeName="opacity"
     begin="redcircle_anim1.begin"
     from="0"
	   to="1"
     dur="1s"
     fill="freeze" />
</svg>

【问题讨论】:

您可以嵌套 svg 元素,并根据需要将 viewBox 属性放在嵌套的 svg 元素上。 谢谢罗伯特·朗森。你能告诉我在这个例子中嵌套另一个 svg 是如何做到的吗?对不起,但我是新手,似乎我自己做不到。我设法通过另一个嵌套的 svg 移动了红色圆圈,但它在缩放时仍然移动。 我真的不知道你想做什么。我只是纠正了您在括号中的第一个句子中的错误假设。 能否缩放红圈以保持其中心点? 我看不到红色圆圈,只有黄色方块。 【参考方案1】:

缩放元素时,不仅缩放它的大小,还缩放它的位置。如您所见。

有多种方法可以实现该解决方案,但它们背后的一般原则是,圆必须围绕它自己的原点进行缩放,而不是 SVG 的原点(即左上角)。

一种方法是将圆的定位责任转移给父组,从而有效地将圆置于其自己的坐标空间中。

<g transform="translate(31,20)">
  <circle cx="0" cy="0" ... />
</g>

所以现在,就圆而言,它位于原点 (0,0)。当您使用动画缩放它时,它会围绕原点缩放 - 因此不会移动。但其最终位置仍由其父组的平移变换决定。

<svg id="star"  >
    
<rect
   style="fill:#ffcc00;fill-opacity:1;stroke:none"
   id="yelrect"
   
   
   x="14.457626"
   y="25.847458"
   ry="1.6126924" />
<g transform="translate(31,20)">
  <ellipse cx="0" cy="0" rx="9.3220339" ry="8.2627115"
           style="fill:#ff0000;fill-opacity:1;stroke:none;opacity:0"
           id="redcircle" />
</g>

<animateTransform
     id="redcircle_anim1"
     xlink:href="#redcircle"
     attributeName="transform"
	   type="scale"
     begin="yelrect.click"
     by="1"
     dur="1s"
     fill="freeze" />
<animate
     id="redcircle_anim2"
     xlink:href="#redcircle"
     attributeName="opacity"
     begin="redcircle_anim1.begin"
     from="0"
	   to="1"
     dur="1s"
     fill="freeze" />
</svg>

【讨论】:

非常感谢 Paul LeBeau,这澄清并解决了问题!

以上是关于在没有viewBox的情况下围绕中心缩放?的主要内容,如果未能解决你的问题,请参考以下文章

颤动 - 如何使用画布围绕中心旋转图像

Android,围绕自我中心旋转位图而不缩放它

微信小程序movable-view组件缩放中心的问题

HTML5 Canvas - 在不翻译上下文的情况下相对于对象的中心进行缩放

如何相对于其中心点旋转或缩放(变换)SVG 路径?

如何在three.js中围绕对象的中心旋转?