【问题标题】:GSAP Javascript if else statement woesGSAP Javascript if else 语句问题
【发布时间】:2024-04-22 20:35:01
【问题描述】:

我正在使用 HTML、CSS 和 JS 构建一个基本的网上银行应用程序。

到目前为止,我有最近的交易屏幕和一个简单的动画来打开每笔交易的描述。

我使用 GSAP 创建动画,使用 jQuery 处理元素。

但是,在打开描述窗口后,我遇到了一个问题。

CODEPEN HERE,这里是 JS:

$(document).ready(function() {
  $('.list li').click(function() {

    var i = $(this).find('i');
    var li = $(this);
    var desc = $(this).next();
    var tl = new TimelineMax({paused:false});
    var open = false;

    if (open === true) {
      tl.to(i, .3, {rotation: 0})
        .to(li, .3, {borderBottom: 'none', delay: -.2})
        .to(desc, .3, {height: '0', padding: '0', delay: -.2});
      open = false;
    } else {
      tl.to(i, .3, {rotation: 90})
        .to(li, .3, {borderBottom: '2px solid #95a5a6', delay: -.2})
        .to(desc, .3, {height: '55px', padding: '5px', delay: -.2});
      open = true;
    }


  });


});

我使用 if 语句根据描述窗口是打开还是关闭来决定播放哪个动画。

我是一名学习编码的设计师,我会接受任何我能得到的建议。

【问题讨论】:

  • 我只想建议一件事:我认为您不需要在用户每次单击您的列表项时创建一个新的 TimelineMax({...}); 实例。
  • 根据我的经验(我可能是错的) TimelineMax 的想法是在脚本中定义一次(在你的情况下,每个列表项一次),然后仅将播放头调整为 向前向后。把它想象成一个带有拖拽句柄的视频,你创建一次,然后你只会播放暂停反转等。跨度>
  • 其实在这种特殊情况下,我认为使用 TweenMax 也可能就足够了。
  • 另外,您使用delay 的方式也有点奇怪。 TimelineMax 中有一个 position parameter,我认为在这种情况下你会发现它很有用。
  • 感谢您的建议。我只需要将 TimelineMax 变量移到点击处理程序之外吗?

标签: javascript jquery html css gsap


【解决方案1】:

您的想法是正确的,但 var open = false; 的范围有误。它的编写方式,open 被定义为 false 每次点击处理程序被调用,你想把它放在父范围内:在点击处理程序之外,在点击处理程序被调用之前。

EDIT 因为您想跟踪每个元素的“打开”状态,您需要为每个元素创建一个闭包。您可以使用.each() 做到这一点。

你可以这样做:

$(document).ready(function() {

  $('.list li').each(function() {

     var open = false;  // <-- Put "open" here

     $(this).click(function() {

        var i = $(this).find('i');
        var li = $(this);
        var desc = $(this).next();
        var tl = new TimelineMax({paused:false});
        // get rid of "open" here

       if (open === true) {
          tl.to(i, .3, {rotation: 0})
            .to(li, .3, {borderBottom: 'none', delay: -.2})
            .to(desc, .3, {height: '0', padding: '0', delay: -.2});
           open = false;
        } else {
           tl.to(i, .3, {rotation: 90})
             .to(li, .3, {borderBottom: '2px solid #95a5a6', delay: -.2})
             .to(desc, .3, {height: '55px', padding: '5px', delay: -.2});
           open = true;
        }


      });


    });
});

【讨论】:

  • 啊,这行得通!但是现在如果一个事务被打开并且你点击一个关闭的事务,它似乎运行一次函数来重置变量(并且可能将关闭动画应用到一个关闭的窗口?)有一个简单的解决方法吗?跨度>
  • 查看我修改后的答案。