Raphael JS - Animate删除了元素

时间:2014-02-26 13:56:06

标签: jquery animation raphael

我使用Raphael JS创建和动画SVG

想法:

第1步

当用户每次创建新折线并向画布/纸张添加时向下滚动。正在添加的行也从不透明度0到1进行动画处理。因此,它会产生错误,即行跟随用户滚动延迟。

第2步

然后,当用户从下到上逐个向上滚动线条时,它们将被移除。

示例: http://codepen.io/anon/pen/onclB

问题:

我已经成功迈出了第一步,但我无法迈出第二步。

我找不到一种方法来为最后插入的行设置动画,然后将其删除。到目前为止,当用户向上滚动时,我采用底部元素,我将其设置为不透明度0,然后使用animate函数内的回调函数,我将其删除。问题是,当用户再次向上滚动时,动画还没有完成,所以最后一个元素是当前动画的元素,而不是前一个元素。

我可以做的一个解决方案是跟踪元素的id,并使我自己的底部元素成为我想要动画的元素,无论其他元素是否已经完成/删除。

但我想知道是否有更简单的解决方案,如

paper.remove().animate(...) //我知道没有。仅仅是为了说明需求。

因此可以为删除的项目设置动画;

另外我注意到当我使用R.bottom.remove();(R是Raphael对象)时,它会移除第一个元素,而不是最后一个元素!

到目前为止的代码

HTML

<div id="canvas">
</div>
<div class="container">
  <h1>SVG Animation Testing</h1>
</div>
<div class="container">
 <p>Long long long text</p>
</div>

JS

var R, winW, winH, anglex, lastScrollTop;

jQuery(function($){

    $window = $(window);
    winW = $window.width();
    winH = $window.height();
    anglex = 1 + Math.floor(Math.random() * winW);
    lastScrollTop = 0;

    $(window).load(function() {
            R = Raphael('canvas', '100%', '100%');
    });

    $window.scroll(function() {

        var top = $(window).scrollTop();
        if(top > lastScrollTop){
            var polygonPoints = '0,0 ' + anglex + ',' + top + ' '+winW+',0';
            var convertedPath = polygonPoints.replace(/([0-9.]+),([0-9.]+)/g, function($0, x, y) {
                return 'L ' + Math.floor(x) + ',' + Math.floor(y) + ' ';
            }).replace(/^L/, 'M'); // replace first L with M (moveTo)
            R.path(convertedPath).attr({
                'fill': 'none',
                'stroke': '#662F8F',
                'stroke-width': '4px',
                'opacity': '0'
            }).animate({opacity: 0.5}, 2000, 'bounce');
        }else{


            R.bottom.animate({opacity: 0}, 2000, 'bounce', function() {
                    this.remove();
            });


        }
        lastScrollTop = top;

    });

});

CSS

#canvas{
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    position: absolute;
    position: fixed;
    z-index: -1000;
}

.container{
    max-width: 960px;
    width: 100%;
    margin: 0 auto;
    text-align: center;
}

1 个答案:

答案 0 :(得分:1)

我发现大多数Raphael问题的解决方案就是在Raphael特定代码周围创建某种对象和数组结构来存储和管理元素。 Raphael不像jQuery,你可以很容易地找到带选择器的元素 - 它自己选择元素的功能非常有限。

如果我已经理解了问题,那么你试图选择然后移除最新的Raphael元素并完成其淡入动画(这是对的吗?),你已经尝试过使用paper.bottom,它不会给你太多控制权。我建议改为在Raphael之外创建一个结构,让你在需要时获得你需要的元素。

一个简单的方法是,在淡入动画的回调函数中,将元素推送到一个数组,然后按顺序包含所有淡入元素。然后,您可以通过获取数组的最后一项来获取最新完成的动画,并且如果需要,您可以在数组中向后工作。

你还有额外的控制权,例如你可以立即从数组中删除它,然后开始淡出动画,删除回调中的元素 - 所以它立即不再你感兴趣的最新元素并且不再被选中,但在动画完成之前不会从DOM中删除。

你可能还想记录最后一个用户操作是向上还是向下滚动,并在此淡入回调函数中检查:如果在动画完成时向下滚动,则推送到阵列,同时如果向上滚动,最好立即将其淡出然后移除它而不进入阵列,以避免计时问题。

在大多数复杂的Raphael项目中,我最终选择了一些交叉引用对象,数组和Raphael集合,这些集合为我提供了各种项目特定的方式来访问Raphael元素。