使用Snap.svg选择多个路径

时间:2013-11-25 11:13:19

标签: svg raphael javascript snap.svg

背景:我正在使用snap.svg为​​内联svg中的路径设置动画,我正在尝试在一个函数中设置几个路径的动画。

问题:使用下面的代码,我只能在一个抓取功能中选择一个路径。在下面的代码中,我使用了多个选择器,但动画只影响rect#rect-one。如何在Snap.svg中选择多个路径?

感谢您的帮助!

HTML /内联SVG

<a id="one">link</a>

<svg>
<rect  id="rect-one" fill="#231F20" width="39" height="14"/>
<rect id="rect-two" x="54" fill="#231F20" width="39" height="14"/>
<rect id="rect-three" x="104" fill="#231F20" width="39" height="14"/>
</svg>

对齐

window.onload = function () {
    var grabLink = Snap.select('body a#one'),
        grabPathRectangles = Snap.select('#rect-one, #rect-two, #rect-three');

    function colorPathRectangles(){
        grabPathRectangles.animate({fill: 'red'}, 100, mina.ease);
    } 
    function resumePathRectangles(){
        grabPathRectangles.animate({fill: 'green'}, 100, mina.ease);
    }   
    grabLink.hover(colorPathRectangles, resumePathRectangles);  
};

2 个答案:

答案 0 :(得分:5)

我认为问题在于您无法将动画应用于集合(编辑:现在可能),因此您必须将其应用于每个元素。为此你可以使用forEach命令,所以......

 grabPathRectangles.forEach( function(elem,i) {
        elem.animate({fill: 'red'}, 1000, mina.ease);
  });

Jsfiddle在这里...... http://jsfiddle.net/DZ4wZ/3/

或者我怀疑你可以将它们放入一个组中,并将该组动画为一个,如果这更有意义的话。这是一个示例http://jsfiddle.net/DZ4wZ/5/但是,我必须删除原始填充。

编辑:看起来你现在可以将动画应用到一个集合中,我认为这个功能以前不起作用,或者是有缺陷的,所以不是历史使用的。因此,如果使用它,您可能需要确保拥有最新版本的Snap。

答案 1 :(得分:5)

不幸的是,@ Ian的回答是不正确的,尽管他的小提琴默默地解决了实际问题。

问题是您使用Snap.select代替Snap.selectAll来查询多个元素。 Select将只返回满足选择器的第一个实例,而selectAll将获取所有这些并返回Element对象的集合或数组。这就是为什么只有一个元素响应动画。

此外,你绝对可以同时在一组元素上调用animate,因此不需要使用额外的for循环来复杂化。

来自Set.animate()上的文档:

  

动画集同步中的每个元素。

这是一个使用Stack Snippets的工作演示。

首先记录select和SelectAll的不同输出

console.log("select:    ", Snap.select(   '#rect-1, #rect-2, #rect-3'));
console.log("selectAll: ", Snap.selectAll('#rect-1, #rect-2, #rect-3'));

var grabLink = Snap.select('#one'),
    grabPathRectangles = Snap.selectAll('#rect-1, #rect-2, #rect-3');

function colorPathRectangles(){
  grabPathRectangles.animate({fill: 'red'}, 1000, mina.ease);
} 
function resumePathRectangles(){
  grabPathRectangles.animate({fill: 'green'}, 1000, mina.ease);
}   

grabLink.hover(colorPathRectangles, resumePathRectangles);  
a#one {
  display: block;
  border: 1px solid blue;
  margin-bottom: 15px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/snap.svg/0.3.0/snap.svg-min.js"></script>

<a id="one">Hover Me</a>

<svg>
  <rect id="rect-1" fill="#231F20" width="39" height="14"/>
  <rect id="rect-2" fill="#231F20" width="39" height="14" x="54" />
  <rect id="rect-3" fill="#231F20" width="39" height="14" x="104" />
</svg>