【问题标题】:Animating externally loaded SVG with Keith Wood's jQuery SVG plugin使用 Keith Wood 的 jQuery SVG 插件对外部加载的 SVG 进行动画处理
【发布时间】:2011-03-20 17:03:48
【问题描述】:

我正在尝试使用 Keith Wood 的 plugin 为从外部 SVG 加载的一组路径的填充颜色设置动画。

首先我将 SVG 导入到 div 容器中:

$(document).ready(function() {
$('#header-main').svg({loadURL: 'header.svg'});
var svg = $('#header-main').svg('get');

});

SVG 文件如下所示:

<svg>
  <g id="group1">
    <path d="M0,22.943V0.223h1.413v22.721H0z"/>
    <path etc../>
  </g>
</svg>

我可以像这样更改组或单个路径的填充颜色:

svg.style('#group1 {fill: black}');

现在,当我尝试像这样为路径设置动画时:

$('path').animate({svgFill: 'blue'}, 500);

或 $('#group1').animate({svgFill: 'blue'}, 500);

或任何其他选择器,例如路径的 id,什么都不会发生。 但如果我要创建一条路径,并像这样对其进行动画处理:

    var path1 = svg.createPath(); 
svg.path(path1.move(50, 90).curveC(0, 90, 0, 30, 50, 30). 
    line(150, 30).curveC(200, 30, 200, 90, 150, 90).close(),  
    {fill: 'none', stroke: '#D90000', strokeWidth: 10});
$('path').animate({svgFill: 'blue'}, 500);

我创建动画的路径,但从 header.svg 文件导入的其他路径什么都不做。

我在这里做错了什么,还是插件无法为外部 svg 设置动画?

【问题讨论】:

    标签: jquery svg jquery-animate


    【解决方案1】:

    我能够完成大约。同样的事情......两种不同的方式......在下面的代码顶部......你会看到简单的CSS悬停标签(这有效,至少对于简单的事情)......而且我也能够得到笔触和填充在整个 9 码中通过颜色等脉动...但在 Firefox 3.6 中没有,呃。

    坦率地说,我什至无法让 jQuery SVG 1.4.3 正确地将一个该死的 SVG 放入 DOM。我不知道它到底有什么问题。我发誓我做的一切都是正确的......所以我不知道以下是否有帮助..但要记住一件事..您可能无法按原样使用它...看来您要么必须包含 xmlns:xlink 命名空间链接并使用 xlink 转换...或者您可以将这些东西吹走,然后通过 CSS 来实现...

    浏览器兼容性的大杂烩 re:SVG 是一个集群-f**k,并且正在使带有矢量元素的开发变得如此困难,即使它可能非常酷!可惜每个人都没有 Safari 或 Chrome,对吧?

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG Tiny 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
    <svg xmlns="http://www.w3.org/2000/svg" version="1.1"  baseProfile="tiny" xmlns:xlink="http://www.w3.org/1999/xlink">
    <style>     
        g #front {fill:white; fill-opacity:.9; stroke-dasharray:none; stroke-dashoffset:0}
        g:hover #front {fill: red; fill-opacity:.5; stroke-dasharray:30,20;}
        g #back {fill:white;fill-opacity:.8; stroke-dashoffset:0;}
        g:hover #back {stroke-dasharray:30,20; stroke-dashoffset:20; fill: grey; }
    </style>
    <g id="folderIcon" transform="translate(-15.1,-40.1)">
    <g id="sides" transform="translate(-173,-364)">
    <path d="m 198,406 0,9 -8,0 0,92 122,0 0,-92 -86,0 0,-9 -28,0 z" id="back" style="stroke:black;stroke-width:3.75;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;" />
     <rect height="84.7" id="front" style="stroke:black; stroke-width:3.608; stroke-linecap:round; stroke-linejoin:round; stroke-miterlimit:4; stroke-opacity:1;" transform="matrix(1,0,-0.397,0.918,0,0)" width="122" x="410" y="468" />
    </g>
    </g>
    <animate xlink:href="#front"
        attributeName="fill" 
        attributeType="CSS"
        from="#ff0" to="#00f" dur="10s" fill="freeze" />
    <animate xlink:href="#back"
        attributeName="stroke" 
        attributeType="CSS"
        from="#88ff88"
            to="#880088"
        dur="10s"
        fill="freeze" />
    </svg>
    

    PS:如果您除了在原始问题(我已经尝试过)中发布的内容之外还有任何提示,可以让内联或“链接”SVG 与那个法国人的 jQ 插件一起工作。any help would be appreciated...

    【讨论】:

      【解决方案2】:

      您绝对可以为加载的 SVG 元素或组的填充颜色设置动画。在示例中,“blue.svg”是一个矩形。

      陷阱:

      • 您必须使用 FF4+ 或 Chrome,我没有尝试过 Opera 或 Safari。
      • 并非所有动画都支持组,AFAIK 并非全部 Keith Wood 的 jquery 扩展中的动画在 FF 中工作。一些 动画可以用 css 完成。
      • 它的“rect2816”不是“svgblue”或“svgbox”,因为它是单独的矩形 您正在制作动画的元素,而不是整个 svg。
      • 在寻址元素和它们所在的 div 时,不要忘记 CSS 选择器 #...“#rect2816”“#svgbox”
      • 使用 jquery svg 扩展时,它的“svgFill”不是“fill”
      • 使用 Inkscape 创建 SVG

      加载这些库:

      <script type="text/javascript" src="js/jquery.js"></script>
      <script type="text/javascript" src="js/jquery.svg.js"></script>
      <script type="text/javascript" src="js/jquery.svganim.js" ></script>
      

      加载 SVG:

      $(document).ready(function(){
        getsvg();  
      })
      function getsvg(){
        $("#svgbox").svg({  
          loadURL: 'blue.svg',  
          onLoad: main,  
          settings: {}  
        } );
      }
      

      动画矩形的代码,显示了两种改变填充的方法:

      function main(){
      
      $('#svgblue').mouseover(function(){
          $('#rect2816').animate({ svgFill: red },2000);
      });
         $('#svgblue').mouseout(function(){
      $('#rect2816').css("fill", blue);
         });
      }
      

      注意-在我的盒子上,重复的鼠标悬停动画不会花费指定的 2 秒,所以我可能在鼠标悬停时做错了。

      【讨论】:

        【解决方案3】:

        据我所见,svgFill 动画为“填充”属性设置动画。一个小测试表明 CSS 'fill' 属性总是覆盖 SVG 'fill' 属性的值。我想这是预期的行为。

        我可以像这样更改组或单个路径的填充颜色:

        svg.style('#group1 {fill: black}');

        现在,当我尝试像这样为路径设置动画时:

        $('path').animate({svgFill: 'blue'}, 500);

        您在 css 中设置初始值,并尝试为属性设置动画。正如你所发现的,它不起作用。至少在我的 Firefox 中没有。

        一种解决方案是,不对属性进行动画处理,而是对 CSS 填充属性进行动画处理。为了使颜色动画化,您需要 jquery-color: https://github.com/jquery/jquery-color

        为了能够为 css 填充属性设置动画,您需要将其挂钩:

        jQuery.Color.hook( "fill" );
        

        *-派克

        【讨论】:

          猜你喜欢
          • 2013-02-16
          • 1970-01-01
          • 2012-02-20
          • 1970-01-01
          • 1970-01-01
          • 2019-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多