【问题标题】:GreenSock, tween function argumentsGreenSock,补间函数参数
【发布时间】:2015-08-31 16:59:33
【问题描述】:

我在鼠标事件上调用了两个函数:

function menuBtnOver(e){
    var b = e.data;
    b.setPosition(b.x, b.y+5);
}

function menuBtnOut(e){
    var b = e.data;
    b.setPosition(b.x, b.y-5);
}

和:

setPosition:function(x, y) {
        if(!x) x = 0;
        if(!y) y = 0;
        this.element.css("left", x);
        this.element.css("top", y);
    }

element 属性是一个 jQuery 对象。 它工作正常,但我想对此进行动画处理。我如何使用 TweenLite 做到这一点? 我试过以下代码:

function menuBtnOver(e){
    TweenLite.to(e.data, 1, {top:500});
}

还有这个:

function menuBtnOver(e){
    TweenLite.to(e.data.getElement(), 1, {top:500});
}

和许多其他组合,但没有一个有效。 只有部分有效的方法是这样的:

function menuBtnOver(e){
    TweenLite.to(e.data, 1, {y:400, onUpdate:e.data.setPosition, onUpdateParams:[e.data.x, e.data.y]});
}

但是当我翻身并且(在任何时间之后)推出时,它只在第一个按钮上起作用,它直接移动到给定位置(没有补间),然后补间每次都会永远给我错误(至少 - 我不能'不会得到任何错误或任何其他尝试)。

未捕获的类型错误:无法读取未定义的属性“css”

在:this.element.css("left", x);

更新

我知道发生了什么。 我已经更改了代码:

function menuBtnOver(e){
    TweenLite.to(e.data, 1, {y:400, onUpdate:e.data.setPosition, onUpdateParams:[e.data.x, e.data.y], onUpdateScope:e.data});
}

但问题在于,我设置为 e.data.y/x 的更新函数的参数不是动态引用,并且始终保持为来自 menuBtnOver 状态的确切值。因此,如果我将 setPosition 函数更改为:

setPosition:function(x, y) {
    if(!x) x = 0;
    if(!y) y = 0;
    this.element.css("left", this.x);
    this.element.css("top", this.y);
}

但显然这不是我想做的。 所以我可以选择做这样的事情:

 MenuButton.prototype = {
    setPosition:function(x, y) {
        if(!x) x = 0;
        if(!y) y = 0;
        this.x = x; this.y = y;
        this.element.css("left", x);
        this.element.css("top", y);
    },
    updatePosition:function(){
        this.element.css("left", this.x);
        this.element.css("top", this.y);
    }
}

function menuBtnOver(e){
    TweenLite.to(e.data, 1, {y:400, onUpdate:e.data.updatePosition, onUpdateScope:e.data});

}

或者以类似的方式定义外部更新函数。问题仍然保持不变,所以有一种简单的方法可以更简单地做到这一点。 GS tween 是否有任何机制可以自动执行此过程?

感谢大家的关注:)

【问题讨论】:

  • 你能创造一个这样的小提琴吗?似乎很容易解决,但我可能错了。
  • @tahir 我不知道如何在小提琴中导入补间库:/
  • 应该很容易。在右侧,有一个External Resources 面板。打开它并输入从 CDN link 中的一个链接获取的补间库。
  • 我明白了!谢谢 :) 这是链接jsfiddle.net/3bf9cyw2/1
  • this 是否与您要查找的内容相近?

标签: javascript jquery css tween gsap


【解决方案1】:

setPosition 中的this 指的是该函数,而不是 onClick 事件的this

您需要将this 传递给setPosition。如下例所示,我在 setPosition 函数中将其作为self 传递。

function menuBtnOver(e){
  var b = e.data;
  b.setPosition(this, b.x, b.y+5);

}

function menuBtnOut(e){
  var b = e.data;
  b.setPosition(this, b.x, b.y-5);

} 和:

setPosition:function(self, x, y) {
    if(!x) x = 0;
    if(!y) y = 0;
    self.element.css("left", x);
    self.element.css("top", y);
}

this 总是引用被调用的函数。你可以读到她。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

所以你可以在函数中将this 作为变量传递。

【讨论】:

  • 好的,我知道this 指向在发生事件时调用函数或DOM 对象的对象。但是您刚刚修改的 peviouaw 代码确实有效。唯一的问题是使用补间的那个。另一个问题来了——如果this 指向div 标记,那么如果我在MyButton 构造函数中定义element,它是如何工作的? div 对象是否拥有自己的 element 属性?此外,我确实按照您的建议更改了此对象TweenLite.to(e.data, 1, {y:400, onUpdate:e.data.setPosition, onUpdateParams:[e.data.x, e.data.y], onUpdateScope:this});,并且确实错误消失了。但是...
  • 我不知道我是否应该高兴,因为它仍然像以前一样 - 不太好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多