jQuery、SVG:如何对属性值(不是样式属性)进行动画处理?

发布于 2024-09-14 23:07:46 字数 1983 浏览 3 评论 0原文

我需要对 SVG 元素的属性进行动画处理,该属性没有 CSS 对应项 - 我怎样才能实现这一目标?

或者,我可以使用替代方案,例如,如果我可以使用 CSS 的 top 或类似的方法对 进行动画处理。

有什么经验吗?

谢谢,Ondra

请注意,这不是 如何使用 jQuery 为属性值(不是样式属性)设置动画? 因为这是关于 HTML 的。

另请参阅SVG 下的 jQuery

更新

最后,我做了一个手动动画,如 使用 JQuery 和 Jquery-svg 可拖动的 SVG< /a> .

仍然欢迎 jQuery 解决方案。

无论如何,这给我带来了其他问题 - 单位不匹配。 evt.clientX 以像素为单位,但 circle.cx.baseVal.value 采用某些相对单位。因此,当我将

    onmousedown="
      this.moving=true; 
      this.pt0 = {x: evt.clientX, y: evt.clientY}; 
      this.origPos = {x: this.cx.baseVal.value, y: this.cy.baseVal.value};
    "
 onmouseup="this.moving=false;"
 onmouseout="this.moving=false;"
 onmouseover="this.moving=false;"
 onmousemove="if( this.moving ){
   this.cx.baseVal.value = this.origPos.x + (evt.clientX - this.pt0.x);
 }

设置为比 SVG“自己”大小大 3 倍时,圆圈的移动速度比指针快 3 倍。

更新

我什至尝试过

this.origPos = {
    x: this.cx.baseVal.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PX), 
    y: this.cy.baseVal.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PX)
};

...


this.cx.baseVal.newValueSpecifiedUnits(
   SVGLength.SVG_LENGTHTYPE_PX, this.origPos.x + (evt.clientX - this.pt0.x) );

但是convertToSpecifiedUnits()返回undefined,这似乎是在实现http://www.w3.org/TR/SVG/types.html#InterfaceSVGLength< /a> .

I need to animate an attribute of an SVG element, which has no CSS counterpart -
<circle cx="..." /> How can I achieve that?

Or, I can use an alternative, e.g. if I could animate <g/> using CSS's top or similar.

Any experience?

Thanks, Ondra

Note this is not a duplicate of How can I animate an attribute value (not style property) with jQuery? since that's about HTML.

See also jQuery under SVG

Update

In the end, I did a manual animation as in SVG draggable using JQuery and Jquery-svg .

jQuery solution still welcome.

Anyway, that brought me to other problem - units mismatch. evt.clientX is in pixels, but circle.cx.baseVal.value is in some relative units. So when I do

    onmousedown="
      this.moving=true; 
      this.pt0 = {x: evt.clientX, y: evt.clientY}; 
      this.origPos = {x: this.cx.baseVal.value, y: this.cy.baseVal.value};
    "
 onmouseup="this.moving=false;"
 onmouseout="this.moving=false;"
 onmouseover="this.moving=false;"
 onmousemove="if( this.moving ){
   this.cx.baseVal.value = this.origPos.x + (evt.clientX - this.pt0.x);
 }

And have <embed> 3x larger than the SVG's "own" size, then the circle moves 3x faster than the pointer.

Update

I even tried

this.origPos = {
    x: this.cx.baseVal.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PX), 
    y: this.cy.baseVal.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PX)
};

...


this.cx.baseVal.newValueSpecifiedUnits(
   SVGLength.SVG_LENGTHTYPE_PX, this.origPos.x + (evt.clientX - this.pt0.x) );

But convertToSpecifiedUnits() returns undefined, which seems to be a lack in implementation of http://www.w3.org/TR/SVG/types.html#InterfaceSVGLength .

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦在深巷 2024-09-21 23:07:47

jQuery 本身可能无法满足您对简单 svg 拖放的要求(此时),因此您要么必须使其执行您想要的操作,要么使用另一个 js 框架。例如,我建议您查看 raphaël

event.clientX/Y 中的值不是用户单位,需要进行转换。请参阅例如 http://www.codedread.com/code.php#dragsvg拖动 svg 对象的示例。

jQuery itself might not meet your requirements for simple svg drag&drop (at this time), so you either have to make it do what you want or use another js framework. I'd recommend having a look at raphaël for example.

The values from event.clientX/Y are not in user units, they need to be converted. See e.g http://www.codedread.com/code.php#dragsvg for an example of dragging svg objects.

无妨# 2024-09-21 23:07:47

对于任何仍然感兴趣的人,jQuery 插件项目 http://keith-wood.name/svg.html 对于动画 SVG 元素非常有用。

For anyone still interested, a jQuery plugin project http://keith-wood.name/svg.html is very useful for animating SVG elements.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文